Skip to content

Instantly share code, notes, and snippets.

@rdeioris
Created February 11, 2019 18:54
Show Gist options
  • Save rdeioris/77af51bc8fbbd8c005c38cbc03f309b9 to your computer and use it in GitHub Desktop.
Save rdeioris/77af51bc8fbbd8c005c38cbc03f309b9 to your computer and use it in GitHub Desktop.
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