import os
import socket
import threading
from tkinter import *
from tkinter.messagebox import *
def drawQiPan():
for i in range(0, 15):
cv.create_line(20, 20 + 40 * i, 580, 20 + 40 * i, width=2)
for i in 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="還沒(méi)輪到自己下棋")
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()
# 畫(huà)對(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è)棋盤(pán)的輸贏
def win_lose():
a = str(turn)
print("a=", a)
for i in range(0, 11):
for j in range(0, 11):
if maps[i][j] == a and maps[i + 1][j + 1] == a and maps[i + 2][j + 2] == a and maps[i + 3][j + 3] == a and \
maps[i + 4][j + 4] == a:
print("x=y軸上形成五子連珠")
return True
for i in range(4, 15):
for j in range(0, 11):
if maps[i][j] == a and maps[i - 1][j + 1] == a and maps[i - 2][j + 2] == a and maps[i - 3][j + 3] == a and \
maps[i - 4][j + 4] == a:
print("x=-y軸上形成五子連珠")
return True
for i in range(0, 15):
for j in range(4, 15):
if maps[i][j] == a and maps[i][j - 1] == a and maps[i][j - 2] == a and maps[i][j - 2] == a and maps[i][
j - 4] == a:
print("Y軸上形成了五子連珠")
return True
for i in range(0, 11):
for j in range(0, 15):
if maps[i][j] == a and maps[i + 1][j] == a and maps[i + 2][j] == a and maps[i + 3][j] == a and maps[i + 4][
j] == a:
print("X軸形成五子連珠")
return True
return False
# 輸出map地圖
def print_map():
for j in range(0, 15):
for i in range(0, 15):
print(maps[i][j], end=' ')
print('w')
# 接受消息
def receiveMessage():
global s
while True: # 接受客戶(hù)端發(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"] = "客戶(hù)端走的位置" + p[0] + p[1]
drawOtherChess(x, y)
s.close()
def startNewThread(): # 啟動(dòng)新線(xiàn)程來(lái)接受客戶(hù)端消息
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 y in range(15)]
cv = Canvas(root, bg='green', width=610, height=610)
drawQiPan()
cv.bind("Button-1>", callPos)
cv.pack()
label1 = Label(root, text="服務(wù)器端...")
label1.pack()
button1 = Button(root, text="退出游戲")
button1.bind("Button-1>", callExit)
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()
from tkinter import *
from tkinter.messagebox import *
import socket
import threading
import os
# 主程序
root = Tk()
root.title("網(wǎng)絡(luò)五子棋v2.0--UDP客戶(hù)端")
imgs = [PhotoImage(file='./images/BlackStone.png'), PhotoImage(file='./images/WhiteStone.png')]
turn = 0
MyTurn = -1
# 畫(huà)對(duì)方棋子
def drawOtherChess(x, y):
global turn
img1 = imgs[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
# 發(fā)送消息
def sendMessage(position):
global s
s.sendto(position.encode(), (host, port))
# 退出函數(shù)
def callExit(event):
position = "exit|"
sendMessage(position)
os.exit()
# 走棋函數(shù)
def callback(event):
global turn
global MyTurn
if MyTurn == -1:
MyTurn = turn
else:
if MyTurn != turn:
showinfo(title="提示", message="還沒(méi)輪到自己走棋")
return
# print("clicked at",event.x,event.y)
x = event.x // 40
y = event.y // 40
print("clicked at", x, y, turn)
if maps[x][y] != " ":
showinfo(title="提示", message="已有棋子")
else:
img1 = imgs[turn]
cv.create_image((x * 40 + 20, y * 40 + 20), image=img1)
cv.pack()
maps[x][y] = str(turn)
position = str(x) + ',' + str(y)
sendMessage("move|" + position)
print("客戶(hù)端走的位置", position)
label1["text"] = "客戶(hù)端走的位置" + position
# 輸出輸贏信息
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
# 畫(huà)棋盤(pán)
def drawQiPan(): # 畫(huà)棋盤(pán)
for i in range(0, 15):
cv.create_line(20, 20 + 40 * i, 580, 20 + 40 * i, width=2)
for i in range(0, 15):
cv.create_line(20 + 40 * i, 20, 20 + 40 * i, 580, width=2)
cv.pack()
# 輸贏判斷
def win_lose():
a = str(turn)
print("a=", a)
for i in range(0, 11):
for j in range(0, 11):
if maps[i][j] == a and maps[i + 1][j + 1] == a and maps[i + 2][j + 2] == a and maps[i + 3][j + 3] == a and \
maps[i + 4][j + 4] == a:
print("x=y軸上形成五子連珠")
return True
for i in range(4, 15):
for j in range(0, 11):
if maps[i][j] == a and maps[i - 1][j + 1] == a and maps[i - 2][j + 2] == a and maps[i - 3][j + 3] == a and \
maps[i - 4][j + 4] == a:
print("x=-y軸上形成五子連珠")
return True
for i in range(0, 15):
for j in range(4, 15):
if maps[i][j] == a and maps[i][j - 1] == a and maps[i][j - 2] == a and maps[i][j - 2] == a and maps[i][
j - 4] == a:
print("Y軸上形成了五子連珠")
return True
for i in range(0, 11):
for j in range(0, 15):
if maps[i][j] == a and maps[i + 1][j] == a and maps[i + 2][j] == a and maps[i + 3][j] == a and maps[i + 4][
j] == a:
print("X軸形成五子連珠")
return True
return False
# 接受消息
def receiveMessage(): # 接受消息
global s
while True:
data = s.recv(1024).decode('utf-8')
a = data.split("|")
if not data:
print('server has exited!')
break
elif a[0] == 'exit':
print('對(duì)方退出!')
label1["text"] = '對(duì)方退出!游戲結(jié)束!'
elif a[0] == 'over':
print('對(duì)方贏信息!')
label1["text"] = data.split("|")[0]
showinfo(title="提示", message=data.split("|")[1])
elif a[0] == 'move':
print('received:', data)
p = a[1].split(",")
x = int(p[0])
y = int(p[1])
print(p[0], p[1])
label1["text"] = "服務(wù)器走的位置" + p[0] + p[1]
drawOtherChess(x, y)
s.close()
# 啟動(dòng)線(xiàn)程接受客戶(hù)端消息
def startNewThread():
thread = threading.Thread(target=receiveMessage, args=())
thread.setDaemon(True)
thread.start()
if __name__ == '__main__':
# 主程序
maps = [[" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " "] for y in range(15)]
cv = Canvas(root, bg='green', width=610, height=610)
drawQiPan()
cv.bind("Button-1>", callback)
cv.pack()
label1 = Label(root, text="客戶(hù)端...")
label1.pack()
button1 = Button(root, text="退出游戲")
button1.bind("Button-1>", callExit)
button1.pack()
# 創(chuàng)建UDP
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
port = 8000
host = 'localhost'
pos = 'join|'
sendMessage(pos)
startNewThread()
root.mainloop()