From 0ff56cfb556033ee4b83e4e3f66061e0ce5894f0 Mon Sep 17 00:00:00 2001 From: boyska Date: Sat, 4 Jun 2016 13:57:17 +0200 Subject: [PATCH] funziona --- tictacpoe.py | 132 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 132 insertions(+) create mode 100644 tictacpoe.py diff --git a/tictacpoe.py b/tictacpoe.py new file mode 100644 index 0000000..ae9eadd --- /dev/null +++ b/tictacpoe.py @@ -0,0 +1,132 @@ +import socket +import sys +import math +import os +from subprocess import check_output + +BUFFER_SIZE = 4096 +def client(other_ip): + s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + s.settimeout(3) + s.connect((other_ip, 9966)) + return s + +def server(): + s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) + s.bind(('0.0.0.0', 9966)) + s.listen(1) + + conn, addr = s.accept() + return conn, addr + +def provacella(): + print(Cella(['X']) | Cella(['O']) | Cella(['u']) | Cella(['X']) | Cella(['O']) | Cella(['u'])) + print() + t = _ | X | _ | _ | _ | _ | _ | _ | _ + print(t) + print(eval(str(t))) + + +class Cella: + def __init__(self, states): + self.states = states + def get_eval_output(self): + s = '' + width = math.ceil(math.sqrt(len(self.states))) + ncols = int(os.getenv('COLUMNS')) if 'COLUMNS' in os.environ else int(check_output('tput cols'.split())) + for i in range(width): + s+= '| ' if i > 0 else ' ' + if i*width == len(self.states): break + line_s = ' | '.join(self.states[i*width:i*width+width]) + s += line_s + s+= ' '* (ncols - len(line_s) - 2) + return s.rstrip() + + def printTabella(self): + width = math.ceil(math.sqrt(len(self.states))) + print('-'*(width*2-1)) + for i in range(width): + print('|'.join(self.states[i*width:i*width+width])) + print('+'.join('-'*width)) + return True + def __str__(self): + return self.get_eval_output() + # return 'Cella <%s>' % ','.join(self.states) + def __or__(self, other): + return Cella(self.states+other.states) + + def __rshift__(self, ip): + self.gioca(ip) + + def __gt__(self, ip): + self.gioca(ip) + + def gioca(self, ip): + s = client(ip) + s.send(str(self).encode('ascii')) + vittoria = s.recv(1) + if not vittoria: + s.close() + coin() + else: + s.close() + print('Hai vinto che forte') + + @property + def vinto(self): + matrix = [] + width = math.ceil(math.sqrt(len(self.states))) + # TODO: assert per vedere che e' proprio quadrata + for i in range(width): + matrix.append(self.states[i*width:i*width+width]) + + for line in matrix: + if all(c == 'X' for c in line) or all(c == 'O' for c in line): + print('hai perso ma ti voglio comunque bene', line) + return True + for col_idx in range(width): + line = [line[col_idx] for line in matrix] + if all(c == 'X' for c in line) or all(c == 'O' for c in line): + print('hai perso per te niente gelato', line) + return True + # diagonale + diagonali = [ + [matrix[i][i] for i in range(width)], + [matrix[i][width-i-1] for i in range(width)] + ] + for line in diagonali: + if all(c == 'X' for c in line) or all(c == 'O' for c in line): + print('che poca stima che ho di te', line) + return True + return False + + +def coin(): + s, other_ip = server() + table = eval(s.recv(BUFFER_SIZE).decode('ascii')) + if table.vinto: + s.send(b'W') + # s.send(1) solo se hai vinto + s.close() + print(str(table) + ' > "' + other_ip[0] + '"') + +X = Cella(['X']) +O = Cella(['O']) +_ = Cella(['_']) +z = Cella(['z']) + + + +if __name__ == '__main__': + if len(sys.argv)>1: + if sys.argv[1] == '--test': + provacella() + sys.exit(0) + other_ip = sys.argv[1] + + _ |_ |_ |_ |_ |_ |_ |_ |_ >> other_ip +else: + print("To play, insert coin()") + +__all__ = ['_', 'X', 'O', 'coin', 'z']