-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathclient.py
More file actions
112 lines (86 loc) · 2.63 KB
/
client.py
File metadata and controls
112 lines (86 loc) · 2.63 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
import socket
import sys
import json
import nbinput
import time
import console
from threading import Thread
class Client:
def __init__(self, addr, clients):
self.conn = socket.socket()
self.conn.connect(addr)
self.clients = clients
self.running = True
self.listener = Thread(target=self.listen)
self.listener.start()
def listen(self):
while self.running:
data = self.conn.recv(1024)
if data:
data = json.loads(data.decode())
self.clients.handler[data['action']](data)
else:
self.terminate()
def send(self, data):
data = json.dumps(data)
self.conn.send(data.encode())
def terminate(self):
print('terminating')
self.running = False
try:
self.conn.shutdown(socket.SHUT_RDWR)
self.conn.close()
except socket.error:
pass
class Players:
def __init__(self):
self.handler = {
'move': self.move
}
self.players = {}
def move(self, data):
try:
self.players[data['client']]
except KeyError:
self.players[data['client']] = {}
self.players[data['client']]['x'] = data['x']
self.players[data['client']]['y'] = data['y']
def main():
try:
addr = (sys.argv[1], int(sys.argv[2]))
except IndexError:
print('Usage: python {} host port'.format(sys.argv[0]))
sys.exit()
players = Players()
client = Client(addr, players)
W, H = console.WIDTH, console.HEIGHT
player = {
'action': 'move',
'x': int(W / 2),
'y': int(H / 2)
}
try:
with nbinput.NonBlockingInput() as nbi:
while True:
time.sleep(0.1)
c = nbi.char()
if not c:
continue
c = c.lower()
if c == 'w':
player['y'] = (player['y'] - 1) % H
elif c == 'a':
player['x'] = (player['x'] - 1) % W
elif c == 's':
player['y'] = (player['y'] + 1) % H
elif c == 'd':
player['x'] = (player['x'] + 1) % W
client.send(player)
out = [[' ' for x in range(W)] for y in range(H)]
for player in players.players.values():
out[player['y']][player['x']] = '#'
print('\n'.join(' '.join(row) for row in out))
except KeyboardInterrupt:
client.terminate()
if __name__ == '__main__':
main()