- Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathNineServer.py
More file actions
Latest commit
190 lines (153 loc) · 4.11 KB
/
Copy pathNineServer.py
File metadata and controls
190 lines (153 loc) · 4.11 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
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
importsocket
importthreading
importtime
fromqueueimportQueue
message_queue=Queue()
status=None
players= []
"""
負責棋盤的邏輯處理
"""
classChessboard:
def__init__(self):
self.grid_count=19
self.game_over=False
self.winner=None
self.piece='b'
self.grid= []
self.restart_game()
defrestart_game(self):
self.game_over=False
self.winner=None
self.piece='b'
self.grid= []
foriinrange(self.grid_count):
self.grid.append(list("."*self.grid_count))
defis_my_turn(self, my_piece):
returnmy_piece==self.piece
defchoose_piece(self, r, c):
ifself.grid[r][c]==self.piece:
self.grid[r][c] ='r'
returnTrue
returnFalse
defset_piece(self, r, c):
foriinrange(3):
forjinrange(8):
ifself.grid[i][j] =='r':
self.grid[i][j] ='.'
ifself.can_set_piece(r, c):
self.grid[r][c] =self.piece
returnTrue
returnFalse
defturn_piece(self):
ifself.piece=='b':
self.piece='w'
else:
self.piece='b'
defclear_piece(self, r, c):
ifself.piece==self.grid[r][c]:
returnTrue
returnFalse
defcan_set_piece(self, r, c):
"""檢查是否能下子"""
ifself.game_over:
returnFalse
returnself.grid[r][c] =='.'
deftake_other_piece(self, r, c):
self.grid[r][c] ='.'
returnTrue
defprintboard(self):
forjinrange(8):
print (self.grid[0][j] +"\t"+self.grid[1][j] +"\t"+self.grid[2][j])
defreceive_message(client_socket):
"""接收玩家傳送的訊息"""
whileTrue:
message=client_socket.recv(1024)
ifmessage==b'':
break
ifstatus=='game_start':
print(message)
message_queue.put(message)
tmp=message.decode('utf-8', "replace")
iftmp[0] =='9':
print('message send to all player')
players[0].send(message)
players[1].send(message)
# 向queue發送連00010線中斷通知
# TODO
defmain():
globalstatus
# 初始化 server_socket
server_socket=socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
server_socket.bind(('127.0.0.1', 26100))
server_socket.listen(2)
# 等待兩位玩家連線
# 預設是0號玩家執黑子,1號玩家執白子
whilelen(players) <2:
(client_socket, address) =server_socket.accept()
# 告知玩家連線成功,並告訴玩家執哪一子
msg=client_socket.recv(1024)
ifmsg==b'join_game':
players.append(client_socket)
iflen(players) ==1:
client_socket.send(b'0b')
else:
client_socket.send(b'0w')
time.sleep(5)
threading.Thread(target=receive_message, args=(client_socket,)).start()
# 初始化棋盤
# 變更遊戲狀態 -> 對戰中
# 告知玩家開始遊戲
# TODO
board=Chessboard()
status='game_start'
players[0].send(b'1game_start')
players[1].send(b'1game_start')
# 不斷從 Queue 接收玩家下子的要求
# 並發出更新到所有玩家
whileTrue:
job=message_queue.get()
ifjob[0] ==ord('3'):
print (job)
pos_msg=job[1:].decode("utf-8")
iflen(pos_msg.split(',')) ==2:
r,c=pos_msg.split(',')
r=int(r)
c=int(c)
ifboard.set_piece(r, c):
players[0].send(job)
players[1].send(job)
board.turn_piece()
board.printboard()
elifjob[0] ==ord('4'):
pos_msg=job[1:].decode("utf-8")
iflen(pos_msg.split(',')) ==2:
r,c=pos_msg.split(',')
r=int(r)
c=int(c)
ifboard.clear_piece(r, c):
players[0].send(job)
players[1].send(job)
board.take_other_piece(r, c)
board.printboard()
elifjob[0] ==ord('5'):
pos_msg=job[1:].decode("utf-8")
iflen(pos_msg.split(',')) ==2:
r,c=pos_msg.split(',')
r=int(r)
c=int(c)
print("clear_piece:{}".format(board.clear_piece(r, c)))
ifboard.clear_piece(r, c):
players[0].send(job)
players[1].send(job)
board.choose_piece(r, c)
board.printboard()
elifjob[0] ==ord('w'):
players[0].send('l'.encode())
players[1].send('w'.encode())
elifjob[0] ==ord('b'):
players[0].send('w'.encode())
players[1].send('l'.encode())
if__name__=='__main__':
main()