예제 #1
0
    def __init__(self, args, name):
        # display
        self.args = args
        self.name = name
        self.size = (800, 120)
        self.player_colors = cl.get_player_colors()

        # game
        self.replay = None
        self.date = ''
        self.num = 0
        self.turn = 0
        self.winner = None
        self.status = None
        self.init_status = None
        self.err = False
        try:
            self.replay = sv.Saver.load(os.path.join(self.args.save_path, 'replay', f'{self.name}.gnr'), lines=1)
            self.date = self.replay['date']
            self.num = self.replay['num']
            self.turn = self.replay['turn']
            self.winner = self.replay['winner']
        except:
            print(f'ERROR loading saved file: {self.name}.gnr')
            self.err = True
예제 #2
0
    def __init__(self, args):
        # arguments
        self.args = args

        # server and client
        self.server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        self.server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
        print(socket.gethostname())

        self.ip = '127.0.0.1'
        try:
            ips = [
                ip for ip in socket.gethostbyname_ex(socket.gethostname())[2]
                if utils.is_private_ip(ip)
            ]
            self.ip = ips[0] if len(ips) > 0 else '127.0.0.1'
        except socket.gaierror as e:
            print(e)
        self.server.bind((self.ip, 5051))
        self.server.settimeout(1.1)
        self.server.listen()

        self.clients = []  # {ip, port, client}
        self.status = {'running': True}
        self.player_colors = cl.get_player_colors()
        self.thread = Thread(target=self.add_clients(self.status),
                             name='add-clients',
                             daemon=True)
        self.thread.start()

        # gui
        self.background = c.Component(lambda ui: ui.show_div(
            (0, 0), self.args.size, color=(60, 179, 113)))
        self.buttons = {
            'play':
            c.Button((self.args.size[0] // 2 - 300, 620), (300, 60),
                     'start game',
                     font=f.tnr(23),
                     save='tnr-23',
                     align=(1, 1),
                     background=(210, 210, 210)),
            'back':
            c.Button((self.args.size[0] // 2 + 300, 620), (300, 60),
                     'close room',
                     font=f.tnr(23),
                     save='tnr-23',
                     align=(1, 1),
                     background=(210, 210, 210)),
        }
예제 #3
0
 def __init__(self, args, mode, init_status=None):
     self.args = args
     self.date = datetime.utcnow().strftime('%Y-%m-%d_%H-%M-%S')
     self.name = self.date
     self.mode = mode
     # display
     player_colors = cl.get_player_colors()[:self.mode['num']]
     self.players = [{
         'land': 0,
         'army': 0,
         'color': player_colors[id]
     } for id in range(self.mode['num'])]
     self.scoreboard = sb.Scoreboard(self.args,
                                     (self.args.size[0] - 10, 10),
                                     self.players,
                                     align=(2, 0))
     self.map = m.Map(self.args,
                      self.args.get_pos(1, 1),
                      self.players,
                      self.mode['id'],
                      map_status=init_status,
                      align=(1, 1))
     self.command = cm.Command(self.args, self.players, self.mode['id'])
     self.player = h.Human(self.args, self.map)
     self.turn_displayer = td.TurnDisplayer(self.args, (10, 10),
                                            self.map,
                                            align=(0, 0))
     # record
     self.status_record = [self.map.get_status(('owner', 'num', 'terrain'))]
     # connect
     self.status = {
         'connected':
         [False if id == 0 else True for id in range(self.mode['num'])],
         'running':
         True,
         'winner':
         None,
     }
     self.thread_recv = []
     for id in range(1, self.mode['num']):
         new_thread = Thread(target=self.receive(id),
                             name=f'recv-{id}',
                             daemon=True)
         new_thread.start()
         self.thread_recv.append(new_thread)
     self.sends(json.dumps({'tag': 'init', 'status': self.map.init_status}))
예제 #4
0
    def __init__(self, args, room_name, address, server=None):
        # arguments
        self.args = args
        self.mode = None
        self.room_name = room_name
        self.displayed_room_name = (self.room_name[:17] + '......') if len(self.room_name) > 20 else self.room_name
        self.server_ip = address[0]
        self.port = address[1]
        self.server = server

        # client
        self.client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        self.client.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
        self.client.settimeout(0.3)
        self.client.connect((self.server_ip, self.port))

        # receive from server
        print('CLIENT ENTER room...')
        self.status = 'wait'
        self.id = None
        self.ip_list = []
        self.thread = Thread(target=self.wait_info, name='wait-info')
        self.thread.start()

        # gui
        self.background = c.Component(lambda ui: ui.show_div((0, 0), self.args.size, color=(60, 179, 113)))
        if self.server is None:
            self.buttons = {
                'back': c.Button(
                    (self.args.size[0] // 2, 630), (600, 80), 'Exit Room', font=f.tnr(25),
                    save='tnr-25', align=(1, 1), background=(210, 210, 210)),
            }
        else:
            self.buttons = {
                'play': c.Button(
                    (self.args.size[0] // 2 - 300, 630), (300, 60), 'Play', font=f.tnr(25),
                    save='tnr-25', align=(1, 1), background=(210, 210, 210)),
                'back': c.Button(
                    (self.args.size[0] // 2 + 300, 630), (300, 60), 'Close Room', font=f.tnr(25),
                    save='tnr-25', align=(1, 1), background=(210, 210, 210)),
            }
        self.player_colors = cl.get_player_colors()
예제 #5
0
 def __init__(self, args, mode):
     self.args = args
     self.mode = mode
     # display
     player_colors = cl.get_player_colors()[:self.mode['num']]
     self.players = [{
         'land': 0,
         'army': 0,
         'color': player_colors[id]
     } for id in range(self.mode['num'])]
     self.scoreboard = sb.Scoreboard(self.args,
                                     (self.args.size[0] - 10, 10),
                                     self.players,
                                     align=(2, 0))
     self.command = cm.Command(self.args, self.players, self.mode['id'])
     self.map_status = None
     # connect
     self.status = {
         'connected': True,
         'running': True,
         'winner': None,
         'paused': False
     }
     self.thread_recv = Thread(target=self.receive,
                               name='recv',
                               daemon=True)
     self.thread_recv.start()
     # map
     while self.map_status is None:
         time.sleep(0.01)
     self.map = m.Map(self.args,
                      self.args.get_pos(1, 1),
                      self.players,
                      self.mode['id'],
                      map_status=self.map_status,
                      align=(1, 1))
     self.player = h.Human(self.args, self.map)
     self.turn_displayer = td.TurnDisplayer(self.args, (10, 10),
                                            self.map,
                                            align=(0, 0))
예제 #6
0
 def __init__(self, args, replay):
     self.args = args
     self.replay = replay
     self.name = ''
     # display
     player_colors = cl.get_player_colors()[:self.replay['num']]
     self.players = [{
         'land': 0,
         'army': 0,
         'color': player_colors[id]
     } for id in range(self.replay['num'])]
     self.scoreboard = sb.Scoreboard(self.args,
                                     (self.args.size[0] - 10, 10),
                                     self.players,
                                     align=(2, 0))
     self.replay_menu = rm.ReplayMenu(
         (self.args.size[0] - 10, self.args.size[1] - 10), align=(2, 2))
     self.map = m.Map(self.args,
                      self.args.get_pos(1, 1),
                      self.players,
                      0,
                      map_status=self.replay['init-status'],
                      align=(1, 1))
     self.map.set_status(
         {
             'visible':
             [True for _ in range(self.map.dim[0] * self.map.dim[1])]
         },
         refresh=False)
     self.command = cm.Command(self.args, self.players, 0)
     self.player = rb.ReplayBot(self.args, self.map, self.replay['turn'])
     self.turn_displayer = td.TurnDisplayer(self.args, (10, 10),
                                            self.map,
                                            arrows=True,
                                            max_turn=self.replay['turn'])
     # status
     self.status = {'running': True}
     self.threshold = 0.5
     self.execute(['pause'])
예제 #7
0
    def __init__(self, args, server_ip, client):
        # arguments
        self.args = args
        self.mode = None
        self.server_ip = server_ip
        self.client = client

        # server and client
        print('CLIENT ENTER room...')
        self.status = 'wait'
        self.id = None
        self.ip_list = []
        self.thread = Thread(target=self.wait_info, name='wait-info')
        self.thread.start()

        # gui
        self.background = c.Component(lambda ui: ui.show_div((0, 0), self.args.size, color=(60, 179, 113)))
        self.buttons = {
            'back': c.Button(
                (self.args.size[0] // 2, 630), (600, 80), 'exit room',
                font=f.tnr(25), save='tnr-25', align=(1, 1), background=(210, 210, 210)
            ),
        }
        self.player_colors = cl.get_player_colors()
예제 #8
0
    def __init__(self, args, mode, id, client):
        self.args = args
        self.mode = mode  # {'num-players', 'size', 'threshold', 'max-apples'}
        self.id = id
        self.client = client

        # map and players
        self.map = m.Map(self.args,
                         self.args.get_pos(1, 1),
                         dim=self.mode['size'],
                         max_apples=self.mode['max-apples'],
                         align=(1, 1))
        player_colors = cl.get_player_colors()
        init_grids = utils.get_init_grids(self.mode['size'])
        self.players = [
            p.Player(self.args, i, player_colors[i], init_grids[self.id])
            for i in range(self.mode['num-players'])
        ]
        self.map.focus_board(self.players[self.id].head())

        # thread
        self.send(json.dumps({'tag': 'start-game'}))
        threading.Thread(target=self.receive, name='client-recv',
                         daemon=True).start()