Advertisement
furas

Python - TicTacToe - server

Dec 4th, 2016
422
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 5.03 KB | None | 0 0
  1. #
  2. # http://stackoverflow.com/questions/40956421/i-am-implementing-a-server-client-based-tictactoe-but-i-am-getting-errors
  3. # http://pastebin.com/HR3DC6Kd
  4. #
  5.  
  6. import socket
  7. import threading
  8.  
  9. class Player( threading.Thread ):
  10.    """Thread to manage each Tic-Tac-Toe client individually"""
  11.  
  12.    def __init__( self, connection, server, number ):
  13.       """Initialize thread and setup variables"""
  14.  
  15.       threading.Thread.__init__( self )
  16.  
  17.       # specify player's mark
  18.       if number == 0:
  19.          self.mark = "X"
  20.       else:
  21.          self.mark = "O"
  22.  
  23.       self.connection = connection
  24.       self.server = server
  25.       self.number = number
  26.  
  27.    def otherPlayerMoved( self, location ):
  28.  
  29.       self.connection.send( "15Opponent moved.".encode('ascii') )
  30.       self.connection.send( str( location ).encode('ascii') )
  31.  
  32.    def run( self ):
  33.       """Play the game"""
  34.  
  35.       # send client message indicating its mark (X or O)
  36.       self.server.display( "Player %s connected." % self.mark )
  37.       self.connection.send( self.mark.encode('ascii') )
  38.  
  39.       # wait for another player to arrive
  40.       if self.mark == "X":
  41.          self.connection.send( "29Waiting for another player...".encode('ascii') )
  42.          self.server.gameBeginEvent.wait()
  43.          self.connection.send(
  44.             "34Other player connected. Your move.".encode('ascii') )
  45.       else:
  46.          self.server.gameBeginEvent.wait()   # wait for server
  47.          self.connection.send( "25Waiting for first move...".encode('ascii') )
  48.  
  49.       # play game until over
  50.       while not self.server.gameOver():
  51.  
  52.          # get more location from client
  53.          location = self.connection.recv(1).decode('ascii')
  54.  
  55.          if not location:
  56.             break
  57.  
  58.          # check for valid move
  59.          if self.server.validMove( int( location ), self.number ):
  60.             self.server.display( "loc: " + location )
  61.             self.connection.send( "11Valid move.".encode('ascii') )
  62.          else:
  63.             self.connection.send( "24Invalid move, try again.".encode('ascii') )
  64.  
  65.       # close connection to client
  66.       self.connection.close()
  67.       self.server.display( "Game over." )
  68.       self.server.display( "Connection closed." )
  69.  
  70. class TicTacToeServer:
  71.    """Server that maintains a game of Tic-Tac-Toe for two clients"""
  72.  
  73.    def __init__( self ):
  74.       """Initialize variables and setup server"""
  75.  
  76.       HOST = ""
  77.       PORT = 5000
  78.  
  79.       self.board = []
  80.       self.currentPlayer = 0
  81.       self.turnCondition = threading.Condition()
  82.       self.gameBeginEvent = threading.Event()
  83.  
  84.       for i in range( 9 ):
  85.          self.board.append( None )
  86.  
  87.       # setup server socket
  88.       self.server = socket.socket( socket.AF_INET,
  89.          socket.SOCK_STREAM )
  90.       self.server.bind( ( HOST, PORT ) )
  91.       self.display( "Server awaiting connections..." )
  92.  
  93.    def execute( self ):
  94.       """Play the game--create and start both Player threads"""
  95.  
  96.       self.players = []
  97.  
  98.       # wait for and accept two client connections
  99.       for i in range( 2 ):
  100.          self.server.listen( 2 )
  101.          connection, address = self.server.accept()
  102.  
  103.          # assign each client to a Player thread
  104.          self.players.append( Player( connection, self, i ) )
  105.          self.players[ -1 ].start()
  106.  
  107.       self.server.close()   # no more connections to wait for
  108.  
  109.       # players are suspended until player O connects
  110.       # resume players now
  111.       self.gameBeginEvent.set()
  112.  
  113.    def display( self, message ):
  114.       """Display a message on the server"""
  115.  
  116.       print (message)
  117.  
  118.    def validMove( self, location, player ):
  119.       """Determine if a move is valid--if so, make move"""
  120.  
  121.       # only one move can be made at a time
  122.       self.turnCondition.acquire()
  123.  
  124.       # while not current player, must wait for turn
  125.       while player != self.currentPlayer:
  126.          self.turnCondition.wait()
  127.  
  128.       # make move if location is not occupied
  129.       if not self.isOccupied( location ):
  130.  
  131.          # set move on board
  132.          if self.currentPlayer == 0:
  133.             self.board[ location ] = "X"
  134.          else:
  135.             self.board[ location ] = "O"
  136.  
  137.          # change current player
  138.          self.currentPlayer = ( self.currentPlayer + 1 ) % 2
  139.          self.players[ self.currentPlayer ].otherPlayerMoved(
  140.             location )
  141.  
  142.          # tell waiting player to continue
  143.          self.turnCondition.notify()
  144.          self.turnCondition.release()
  145.  
  146.          # valid move
  147.          return 1
  148.  
  149.       # invalid move
  150.       else:
  151.          self.turnCondition.notify()
  152.          self.turnCondition.release()
  153.          return 0
  154.  
  155.    def isOccupied( self, location ):
  156.       """Determine if a space is occupied"""
  157.  
  158.       return self.board[ location ]   # an empty space is None
  159.  
  160.    def gameOver( self ):
  161.       """Determine if the game is over"""
  162.  
  163.       # place code here testing for a game winner
  164.       # left as an exercise for the reader
  165.       return 0
  166.  
  167. def main():
  168.    TicTacToeServer().execute()
  169.  
  170. if __name__ == "__main__":
  171.    main()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement