Created
February 11, 2019 18:54
-
-
Save rdeioris/77af51bc8fbbd8c005c38cbc03f309b9 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| import socket | |
| import struct | |
| import time | |
| JOIN = 0 | |
| PLAY = 1 | |
| class Player: | |
| def __init__(self, address, choice): | |
| self.address = address | |
| self.choice = choice | |
| self.move = None | |
| def __repr__(self): | |
| return str(self.address) | |
| class EvensAndOddsServer: | |
| def __init__(self, address, port): | |
| self.address = address | |
| self.port = port | |
| self.socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) | |
| self.socket.settimeout(30.0) | |
| self.socket.bind((self.address, self.port)) | |
| self.players = [None, None] | |
| @property | |
| def in_game(self): | |
| return self.players[0] and self.players[1] | |
| def get_winner(self, value): | |
| if value % 2 == self.players[0].choice % 2: | |
| print('player {} WINS'.format(self.players[0])) | |
| if value % 2 == self.players[1].choice % 2: | |
| print('player {} WINS'.format(self.players[1])) | |
| def tick(self): | |
| try: | |
| self.packet, self.sender = self.socket.recvfrom(64) | |
| except socket.timeout: | |
| if self.players[0] is not None: | |
| print('timeout') | |
| self.players = [None, None] | |
| return | |
| if len(self.packet) != 2: | |
| return | |
| command, value = struct.unpack('=BB', self.packet) | |
| if command == JOIN: | |
| self.join(value) | |
| elif command == PLAY: | |
| self.play(value) | |
| total = 0 | |
| if self.in_game: | |
| for player in self.players: | |
| if player.move is None: | |
| return | |
| total += player.move | |
| else: | |
| return | |
| # if i am here, check victory | |
| self.get_winner(total) | |
| self.players = [None, None] | |
| def join(self, value): | |
| if self.in_game: | |
| return | |
| player = Player(self.sender, value) | |
| if self.players[0] is None: | |
| self.players[0] = player | |
| elif self.players[1] is None: | |
| player.choice = self.players[0].choice + 1 | |
| self.players[1] = player | |
| else: | |
| return | |
| print('player {} joined as {}'.format(player, player.choice % 2)) | |
| def get_player(self, address): | |
| if self.players[0].address == address: | |
| return self.players[0] | |
| if self.players[1].address == address: | |
| return self.players[1] | |
| return None | |
| def play(self, value): | |
| if not self.in_game: | |
| return | |
| player = self.get_player(self.sender) | |
| if not player: | |
| return | |
| if player.move is not None: | |
| return | |
| print('player {} moved'.format(player)) | |
| player.move = value | |
| def run(self): | |
| print('server is running') | |
| while True: | |
| self.tick() | |
| game = EvensAndOddsServer('192.168.10.1', 9999) | |
| game.run() |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment