python如何實(shí)現(xiàn)網(wǎng)絡(luò)中的五子棋呢?(上)
服務(wù)器端:
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
import?os
import?socket
import?threading
from?tkinterimport?*
from?tkinter.messageboximport?*
def?drawQiPan():
for?iin?range(0,15):
cv.create_line(20,20?+?40?*?i,580,20?+?40?*?i, width=2)
for?iin?range(0,15):
cv.create_line(20?+?40?*?i,20,20?+?40?*?i,580, width=2)
cv.pack()
# 走棋函數(shù)
def?callPos(event):
global?turn
global?MyTurn
if?MyTurn==?-1:?# 第一次確認(rèn)自己的角色
MyTurn=?turn
else:
if?MyTurn !=?turn:
showinfo(title="提示", message="還沒輪到自己下棋")
return
# print("clicked at",event.x,event.y,true)
x=?event.x//?40
y=?event.y//?40
print("clicked at", x, y, turn)
if?maps[x][y] !=?" ":
showinfo(title="提示", message="已有棋子")
else:
img1=?images[turn]
cv.create_image((x*?40?+?20, y*?40?+?20), image=img1)
cv.pack()
maps[x][y]=?str(turn)
pos=?str(x)+?","?+?str(y)
sendMessage("move|"?+?pos)
print("服務(wù)器走的位置", pos)
label1["text"]=?"服務(wù)器走的位置"?+?pos
# 輸出輸贏信息
if?win_lose():
if?turn==?0:
showinfo(title="提示", message="黑方你贏了")
sendMessage("over|黑方你贏了")
else:
showinfo(title="提示", message="白方你贏了")
sendMessage("over|白方你贏了")
# 換下一方走棋
if?turn==?0:
turn=?1
else:
turn=?0
# 發(fā)送消息
def?sendMessage(pos):
global?s
global?addr
s.sendto(pos.encode(), addr)
# 退出函數(shù)
def?callExit(event):
pos=?"exit|"
sendMessage(pos)
os.exit()
# 畫對(duì)方棋子
def?drawOtherChess(x, y):
global?turn
img1=?images[turn]
cv.create_image((x*?40?+?20, y*?40?+?20), image=img1)
cv.pack()
maps[x][y]=?str(turn)
# 換下一方走棋
if?turn==?0:
turn=?1
else:
turn=?0
# 判斷整個(gè)棋盤的輸贏
def?win_lose():
a=?str(turn)
print("a=", a)
for?iin?range(0,11):
for?jin?range(0,11):
if?maps[i][j]==?aand?maps[i+?1][j+?1]==?aand?maps[i+?2][j+?2]==?aand?maps[i+?3][j+?3]==?aand?\
maps[i+?4][j+?4]==?a:
print("x=y軸上形成五子連珠")
return?True
for?iin?range(4,15):
for?jin?range(0,11):
if?maps[i][j]==?aand?maps[i-?1][j+?1]==?aand?maps[i-?2][j+?2]==?aand?maps[i-?3][j+?3]==?aand?\
maps[i-?4][j+?4]==?a:
print("x=-y軸上形成五子連珠")
return?True
for?iin?range(0,15):
for?jin?range(4,15):
if?maps[i][j]==?aand?maps[i][j-?1]==?aand?maps[i][j-?2]==?aand?maps[i][j-?2]==?aand?maps[i][
j-?4]==?a:
print("Y軸上形成了五子連珠")
return?True
for?iin?range(0,11):
for?jin?range(0,15):
if?maps[i][j]==?aand?maps[i+?1][j]==?aand?maps[i+?2][j]==?aand?maps[i+?3][j]==?aand?maps[i+?4][
j]==?a:
print("X軸形成五子連珠")
return?True
return?False
# 輸出map地圖
def?print_map():
for?jin?range(0,15):
for?iin?range(0,15):
print(maps[i][j], end=' ')
print('w')
# 接受消息
def?receiveMessage():
global?s
while?True:?# 接受客戶端發(fā)送的消息
global?addr
data, addr=?s.recvfrom(1024)
data=?data.decode('utf-8')
a=?data.split("|")
if?not?data:
print('client has exited!')
break
elif?a[0]==?'join':?# 連接服務(wù)器的請(qǐng)求
print('client 連接服務(wù)器!')
label1["text"]=?'client連接服務(wù)器成功,請(qǐng)你走棋!'
elif?a[0]==?'exit':
print('client對(duì)方退出!')
label1["text"]=?'client對(duì)方退出,游戲結(jié)束!'
elif?a[0]==?'over':
print('對(duì)方贏信息!')
label1["text"]=?data.split("|")[0]
showinfo(title="提示", message=data.split("1")[1])
elif?a[0]==?'move':
print('received:', data,'from', addr)
p=?a[1].split(",")
x=?int(p[0])
y=?int(p[1])
print(p[0], p[1])
label1["text"]=?"客戶端走的位置"?+?p[0]+?p[1]
drawOtherChess(x, y)
s.close()
def?startNewThread():?# 啟動(dòng)新線程來接受客戶端消息
thread=?threading.Thread(target=receiveMessage, args=())
thread.setDaemon(True)
thread.start()
if?__name__==?'__main__':
root=?Tk()
root.title("網(wǎng)絡(luò)五子棋v2.0-服務(wù)器端")
images=?[PhotoImage(file='./images/BlackStone.png'), PhotoImage(file='./images/WhiteStone.png')]
turn=?0
MyTurn=?-1
maps=?[[" "," "," "," "," "," "," "," "," "," "," "," "," "," "," "]for?yin?range(15)]
cv=?Canvas(root, bg='green', width=610, height=610)
drawQiPan()
cv.bind("
cv.pack()
label1=?Label(root, text="服務(wù)器端...")
label1.pack()
button1=?Button(root, text="退出游戲")
button1.bind("
button1.pack()
# 創(chuàng)建UDP SOCKET
s=?socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s.bind(('localhost',8000))
addr=?('localhost',8000)
startNewThread()
root.mainloop()
Python 網(wǎng)絡(luò)
版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實(shí)的內(nèi)容,請(qǐng)聯(lián)系我們jiasou666@gmail.com 處理,核實(shí)后本網(wǎng)站將在24小時(shí)內(nèi)刪除侵權(quán)內(nèi)容。
版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實(shí)的內(nèi)容,請(qǐng)聯(lián)系我們jiasou666@gmail.com 處理,核實(shí)后本網(wǎng)站將在24小時(shí)內(nèi)刪除侵權(quán)內(nèi)容。