Guest User

server.py

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