示例#1
0
 def __init__(self, args):
     self.args = args
     self.background = c.Component(lambda ui: ui.show_div(
         (0, 0), self.args.size, color=(60, 179, 113)))
     self.buttons = {
         'new':
         c.Button((self.args.size[0] // 2, 310), (600, 80),
                  'New Game',
                  font=f.tnr(25),
                  save='tnr-25',
                  align=(1, 1),
                  background=(210, 210, 210)),
         'join':
         c.Button((self.args.size[0] // 2, 410), (600, 80),
                  'Join Game',
                  font=f.tnr(25),
                  save='tnr-25',
                  align=(1, 1),
                  background=(210, 210, 210)),
         'replay':
         c.Button((self.args.size[0] // 2, 510), (600, 80),
                  'Replay',
                  font=f.tnr(25),
                  save='tnr-25',
                  align=(1, 1),
                  background=(210, 210, 210)),
         'quit':
         c.Button((self.args.size[0] // 2, 610), (600, 80),
                  'Exit',
                  font=f.tnr(25),
                  save='tnr-25',
                  align=(1, 1),
                  background=(210, 210, 210)),
     }
示例#2
0
 def __init__(self, args):
     self.args = args
     self.background = c.Component(lambda ui: ui.show_div(
         (0, 0), self.args.size, color=(60, 179, 113)))
     self.buttons = {
         'sing':
         c.Button((self.args.size[0] // 2, 360), (600, 80),
                  'Single Player',
                  font=f.tnr(25),
                  save='tnr-25',
                  align=(1, 1),
                  background=(210, 210, 210)),
         'mult':
         c.Button((self.args.size[0] // 2, 460), (600, 80),
                  'Multi-Player',
                  font=f.tnr(25),
                  save='tnr-25',
                  align=(1, 1),
                  background=(210, 210, 210)),
         'back':
         c.Button((self.args.size[0] // 2, 560), (600, 80),
                  'Back',
                  font=f.tnr(25),
                  save='tnr-25',
                  align=(1, 1),
                  background=(210, 210, 210)),
     }
示例#3
0
    def __init__(self, args):
        # arguments
        self.args = args

        # regex
        self.regex = r'(([1-9]?[0-9])|(1[0-9][0-9])|(2[0-4][0-9])|(25[0-5]))'
        self.regex_one = r'^' + self.regex + r'\.?$'
        self.regex_two = r'^' + self.regex + r'\.' + self.regex + r'\.?$'
        self.regex_three = r'^(' + self.regex + r'\.){2}' + self.regex + r'\.?$'
        self.regex_full = r'^(' + self.regex + r'\.){3}' + self.regex + r'$'

        # socket
        self.server_ip = ''
        self.client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        self.client.settimeout(1.0)

        # gui
        self.background = c.Component(lambda ui: ui.show_div((0, 0), self.args.size, color=(60, 179, 113)))
        self.error_msg = None
        self.error_msg_clock = sw.Stopwatch()
        self.buttons = {
            'connect': c.Button(
                (self.args.size[0] // 2, 540), (400, 60), 'connect',
                font=f.tnr(22), align=(1, 1), background=(210, 210, 210)
            ),
            'back': c.Button(
                (self.args.size[0] // 2, 640), (400, 60), 'back',
                font=f.tnr(22), align=(1, 1), background=(210, 210, 210)
            ),
        }
示例#4
0
    def __init__(self, args):
        self.args = args

        # display
        self.bar_height = 100
        self.margin = 40
        self.padding = 20
        self.background = c.Component(lambda ui: ui.show_div((0, 0), self.args.size, color=(60, 179, 113)))
        self.pan = 0

        # saves and buttons
        self.saves = [
            SavedFile(self.args, file[:-4])
            for file in os.listdir(os.path.join(self.args.save_path, 'replay'))
            if file.endswith('.gnr')
        ]
        self.saves.sort(key=lambda sf: [not sf.err, re.split(r'[\-_]', sf.date), sf.name], reverse=True)
        self.buttons = {
            'open-location': c.Button(
                (self.args.size[0] - 100, 100), (120, 60),
                'open location', font=f.tnr(15), save='tnr-15', align=(1, 1), background=(210, 210, 210)),
            'back': c.Button(
                (self.args.size[0] // 2, self.args.size[1] - self.bar_height // 2), (200, 50),
                'back', font=f.tnr(22), save='tnr-22', align=(1, 1), background=(210, 210, 210))
        }
示例#5
0
 def show(self, ui):
     self.background.show(ui)
     ui.show_text((self.args.size[0] // 2, 100), f'IP: {self.ip}', f.cambria(60), color=(0, 0, 128), align=(1, 1))
     # show connected ips
     ui.show_text((self.args.size[0] // 2, 180), 'client ip', f.tnr(30), color=(128, 0, 0), align=(1, 1))
     for i, client in enumerate(self.clients):
         ui.show_text((self.args.size[0] // 2, 180 + (i + 1) * 60), client['ip'], f.tnr(30), align=(1, 1))
     # show buttons
     for name in self.buttons:
         self.buttons[name].show(ui)
示例#6
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)),
        }
示例#7
0
 def show(self, ui):
     self.background.show(ui)
     # show input box
     ui.show_div((self.args.size[0] // 2, 300), (600, 80),
                 color=(255, 255, 255),
                 align=(1, 1))
     ui.show_div((self.args.size[0] // 2, 300), (600, 80),
                 border=2,
                 color=(0, 0, 0),
                 align=(1, 1))
     if self.server_ip != '':
         ui.show_text((self.args.size[0] // 2, 300),
                      self.server_ip,
                      f.cambria(25),
                      save='cambria-25',
                      align=(1, 1))
     # show buttons
     for name in self.buttons:
         self.buttons[name].show(ui)
     # show error message
     if self.error_msg is not None:
         ui.show_text((self.args.size[0] // 2, 400),
                      self.error_msg,
                      f.tnr(20),
                      color=(128, 0, 0),
                      save='tnr-20-err',
                      align=(1, 1))
示例#8
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.id = None
        self.total = None
        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, 640), (600, 80),
                     'exit room',
                     font=f.tnr(25),
                     align=(1, 1),
                     background=(210, 210, 210)),
        }
示例#9
0
    def show(self, ui):
        self.background.show(ui)
        ui.show_text((self.args.size[0] // 2, 100), f'{self.displayed_room_name}', f.cambria(60), color=(0, 0, 128), align=(1, 1))

        # show ip title
        ui.show_text((self.args.size[0] // 2, 180), 'client ip', f.tnr(30), color=(128, 0, 0), align=(1, 1))
        ui.show_div((self.args.size[0] // 2, 210), (800, 352), color=(191, 220, 187), align=(1, 0))

        # show ip lists
        for i in range(4):
            row = i % 4
            pos = (self.args.size[0] // 2, 254 + 84 * row)
            color = self.player_colors[i]
            if i == self.id and i < len(self.ip_list):
                ui.show_div(pos, (368, 56), color=color, align=(1, 1))
                ui.show_div((pos[0], pos[1] + 28), (368, 12), color=cl.multiply(color, 0.8), align=(1, 0))
                ui.show_text(
                    pos, self.ip_list[i], f.tnr_bold(25),
                    color=cl.white, save='tnr-bold-25-white', align=(1, 1))
            elif i < len(self.ip_list):
                ui.show_div(pos, (368, 56), color=cl.white, align=(1, 1))
                ui.show_div((pos[0], pos[1] + 28), (368, 12), color=color, align=(1, 0))
                ui.show_text(
                    pos, self.ip_list[i], f.tnr_bold(25),
                    save='tnr-bold-25', align=(1, 1))
            else:
                ui.show_div(pos, (368, 56), color=cl.white, align=(1, 1))
                ui.show_div((pos[0], pos[1] + 28), (368, 12), color=cl.white, align=(1, 0))

        for name in self.buttons:
            self.buttons[name].show(ui)
示例#10
0
    def __init__(self, args, mode):
        # arguments
        self.args = args
        self.mode = mode

        # server and client
        self.server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        self.server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
        hostname = socket.gethostname()
        if not hostname.endswith('.local'):
            hostname += '.local'
        fqdn_hostname = socket.getfqdn()
        if not fqdn_hostname.endswith('.local'):
            fqdn_hostname += '.local'
        try:
            all_ips = socket.gethostbyname_ex(hostname)[2]
        except:
            all_ips = socket.gethostbyname_ex(fqdn_hostname)[2]
        ips = [
            ip for ip in all_ips
            if utils.is_private_ip(ip)
        ]
        self.ip = ips[0] if len(ips) > 0 else '127.0.0.1'
        self.server.bind((self.ip, 5050))
        self.server.settimeout(1.0)
        self.server.listen()

        self.clients = []  # {ip, port, client}
        self.status = {'running': True}
        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, 600), (300, 60), 'start game',
                font=f.tnr(23), align=(1, 1), background=(210, 210, 210)
            ),
            'back': c.Button(
                (self.args.size[0] // 2 + 300, 600), (300, 60), 'close room',
                font=f.tnr(23), align=(1, 1), background=(210, 210, 210)
            ),
        }
示例#11
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()
示例#12
0
 def show(self, ui, *, pan=(0, 0)):
     ui.show_div(self.pos, self.size, color=self.color, pan=pan)
     # show id
     if self.id is not None:
         if self.id_img is None:
             self.id_img = ui.get_text_img(str(self.id),
                                           font=f.tnr(25),
                                           color=(255, 255, 255))
         center = (self.pos[0] + self.size[0] // 2,
                   self.pos[1] + self.size[1] // 2)
         ui.show_img(center, self.id_img, pan=pan, align=(1, 1))
示例#13
0
    def show(self, ui):
        self.background.show(ui)
        ui.show_text((self.args.size[0] // 2, 100),
                     f'IP: {self.ip}',
                     f.cambria(60),
                     color=(0, 0, 128),
                     align=(1, 1))

        # show ip title
        ui.show_text((self.args.size[0] // 2, 180),
                     'client ip',
                     f.tnr(30),
                     color=(128, 0, 0),
                     align=(1, 1))
        ui.show_div((self.args.size[0] // 2, 210), (800, 352),
                    color=(191, 220, 187),
                    align=(1, 0))

        # show ip lists
        ip_list = [self.ip] + [client['ip'] for client in self.clients]
        for i in range(8):
            row, col = i % 4, i // 4
            pos = (self.args.size[0] // 2 - 200 + 400 * col, 254 + 84 * row)
            color = self.player_colors[i]
            if i == 0:
                ui.show_div(pos, (368, 56), color=color, align=(1, 1))
                ui.show_div((pos[0], pos[1] + 28), (368, 12),
                            color=cl.multiply(color, 0.8),
                            align=(1, 0))
                ui.show_text(pos,
                             ip_list[i],
                             f.tnr_bold(25),
                             color=cl.white,
                             save='tnr-bold-25-white',
                             align=(1, 1))
            elif i < len(ip_list):
                ui.show_div(pos, (368, 56), color=cl.white, align=(1, 1))
                ui.show_div((pos[0], pos[1] + 28), (368, 12),
                            color=color,
                            align=(1, 0))
                ui.show_text(pos,
                             ip_list[i],
                             f.tnr_bold(25),
                             save='tnr-bold-25',
                             align=(1, 1))
            else:
                ui.show_div(pos, (368, 56), color=cl.white, align=(1, 1))
                ui.show_div((pos[0], pos[1] + 28), (368, 12),
                            color=cl.white,
                            align=(1, 0))

        # show buttons
        for name in self.buttons:
            self.buttons[name].show(ui)
示例#14
0
    def __init__(self, args, mode):
        # arguments
        self.args = args
        self.mode = mode

        # server and client
        self.server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        self.ip = [
            ip for ip in socket.gethostbyname_ex(socket.gethostname())[2]
            if utils.is_private_ip(ip)
        ][0]
        self.server.bind((self.ip, 5050))
        self.server.settimeout(1.0)
        self.server.listen()
        self.clients = []  # {ip, port, client}
        self.status = {'running': True}
        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, 600), (300, 60),
                     'start game',
                     font=f.tnr(23),
                     align=(1, 1),
                     background=(210, 210, 210)),
            'back':
            c.Button((self.args.size[0] // 2 + 300, 600), (300, 60),
                     'close room',
                     font=f.tnr(23),
                     align=(1, 1),
                     background=(210, 210, 210)),
        }
示例#15
0
 def __init__(self, pos, *, buttons=tuple(['quit']), size=(300, 240), align=(0, 0)):
     # display
     self.pos = utils.top_left(pos, size, align=align)
     self.size = size
     self.win = None
     # buttons
     self.buttons = {}
     x = 140
     for name in buttons:
         self.buttons[name] = c.Button(
             (self.pos[0] + self.size[0] // 2, self.pos[1] + x), (200, 40), name,
             font=f.tnr(22), align=(1, 0), background=(230, 230, 230)
         )
         x += 60
示例#16
0
 def __init__(self, pos, *, buttons=('continue', 'quit'), size=(300, 240), align=(0, 0)):
     # display
     self.pos = utils.top_left(pos, size, align=align)
     self.size = size
     self.active = False
     # buttons
     self.buttons = {}
     x = 100
     for name in buttons:
         self.buttons[name] = c.Button(
             (self.pos[0] + self.size[0] // 2, self.pos[1] + x), (200, 40), name,
             font=f.tnr(22), align=(1, 0), background=(230, 230, 230)
         )
         x += 60
示例#17
0
 def __init__(self, args):
     self.args = args
     self.background = c.Component(lambda ui: ui.show_div((0, 0), self.args.size, color=(60, 179, 113)))
     self.buttons = {
         'new': c.Button(
             (self.args.size[0] // 2, 360), (600, 80), 'New Game',
             font=f.tnr(25), align=(1, 1), background=(210, 210, 210)
         ),
         'join': c.Button(
             (self.args.size[0] // 2, 460), (600, 80), 'Join Game',
             font=f.tnr(25), align=(1, 1), background=(210, 210, 210)
         ),
         'quit': c.Button(
             (self.args.size[0] // 2, 560), (600, 80), 'Exit',
             font=f.tnr(25), align=(1, 1), background=(210, 210, 210)
         ),
         'reload_settings': c.Button(
             (self.args.size[0] - 140, self.args.size[1] - 3), (280, 30), '>> Reload settings <<',
             font=f.get_font('courier-prime', 20), align=(1, 2),
             color=(None, (255, 255, 255)), background=None, border=1
         )
     }
     self.settings_reloaded = False
     self.timer = sw.Stopwatch()
示例#18
0
 def __init__(self,
              pos,
              size,
              text,
              *,
              font=f.tnr(25),
              border=2,
              color=((0, 0, 0), (0, 0, 0)),
              align=(0, 0),
              background=None):
     self.pos = utils.top_left(pos, size, align=align)
     self.size = size
     self.text = text
     self.font = font
     self.border = border
     self.color = color
     self.align = align
     self.background = background
示例#19
0
 def __init__(self, args):
     self.args = args
     self.background = c.Component(lambda ui: ui.show_div((0, 0), self.args.size, color=(60, 179, 113)))
     self.btn_slots = [
         (self.args.size[0] // 2, 150),
         (self.args.size[0] // 2, 270),
         (self.args.size[0] // 2, 390),
         (self.args.size[0] // 2, 510)
     ]
     self.beacon = DiscoveryBeacon('224.0.3.101', list(range(5000, 5100)), b'battleofsnakes')
     self.beacon.start()
     self.rooms = []
     self.buttons = {
         'back': c.Button(
             (self.args.size[0] // 2, 650), (400, 60), 'Back', font=f.tnr(25),
             save='tnr-25', align=(1, 1), background=(210, 210, 210)),
     }
     self.refresh()
     self.timer = sw.Stopwatch()
     self.timer.start()
示例#20
0
 def __init__(self,
              args,
              pos,
              size,
              choices=('continue', 'quit'),
              *,
              align=(0, 0)):
     self.args = args
     self.size = size
     self.pos = utils.top_left(pos, self.size, align=align)
     self.buttons = {
         name:
         c.Button((self.pos[0] + self.size[0] // 2, self.pos[1] + pos),
                  (200, 40),
                  name,
                  font=f.tnr(22),
                  border=1,
                  align=(1, 0),
                  background=(230, 230, 230))
         for name, pos in zip(choices,
                              range(100, 100 + 60 * len(choices), 60))
     }
     self.active = False
示例#21
0
 def __init__(self, args):
     self.args = args
     self.pos = (0, 0)
     self.background = c.Component(lambda ui: ui.show_div(
         (0, 0), self.args.size, color=(60, 179, 113)))
     self.buttons = {
         '1':
         c.Button((240, 250), (80, 120),
                  '1',
                  font=f.tnr(25),
                  align=(1, 1),
                  background=(210, 210, 210)),
         '2':
         c.Button((440, 250), (80, 120),
                  '2',
                  font=f.tnr(25),
                  align=(1, 1),
                  background=(210, 210, 210)),
         '3':
         c.Button((640, 250), (80, 120),
                  '3',
                  font=f.tnr(25),
                  align=(1, 1),
                  background=(210, 210, 210)),
         '4':
         c.Button((840, 250), (80, 120),
                  '4',
                  font=f.tnr(25),
                  align=(1, 1),
                  background=(210, 210, 210)),
         '5':
         c.Button((1040, 250), (80, 120),
                  '5',
                  font=f.tnr(25),
                  align=(1, 1),
                  background=(210, 210, 210)),
         '6':
         c.Button((240, 400), (80, 120),
                  '6',
                  font=f.tnr(25),
                  align=(1, 1),
                  background=(210, 210, 210)),
         '7':
         c.Button((440, 400), (80, 120),
                  '7',
                  font=f.tnr(25),
                  align=(1, 1),
                  background=(210, 210, 210)),
         '8':
         c.Button((640, 400), (80, 120),
                  '8',
                  font=f.tnr(25),
                  align=(1, 1),
                  background=(210, 210, 210)),
         '9':
         c.Button((840, 400), (80, 120),
                  '9',
                  font=f.tnr(25),
                  align=(1, 1),
                  background=(210, 210, 210)),
         '10':
         c.Button((1040, 400), (80, 120),
                  '10',
                  font=f.tnr(25),
                  align=(1, 1),
                  background=(210, 210, 210)),
         'mode':
         c.Button((self.args.size[0] // 2, 540), (200, 60),
                  'single player',
                  font=f.tnr(20),
                  align=(1, 1),
                  background=(210, 210, 210)),
         'back':
         c.Button((self.args.size[0] // 2, 640), (600, 80),
                  'Back',
                  font=f.tnr(25),
                  align=(1, 1),
                  background=(210, 210, 210)),
     }
     self.scores = sr.ScoreReader.load(args.save_path)
示例#22
0
 def __init__(self, args, pos, address, name, *, align=(0, 0)):
     self.args = args
     self.size = [600, 100]
     self.pos = utils.top_left(pos, self.size, align=align)
     self.ip = address[0]
     self.port = address[1]
     self.name = name
     self.join_btn = c.Button(utils.add(self.pos, (550, 50)), (80, 60), 'Join', font=f.tnr(20), border=1, align=(1, 1))