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()
# 走棋函数
def callPos(event):
global turn
global MyTurn
if MyTurn == -1: # 第一次确认自己的角色
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("服务器走的位置", pos)
label1["text"] = "服务器走的位置" + 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
# 发送消息
def sendMessage(pos):
global s
global addr
s.sendto(pos.encode(), addr)
# 退出函数
def callExit(event):
pos = "exit|"
sendMessage(pos)
os.exit()
# 画对方棋子
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
# 判断整个棋盘的输赢
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: # 接受客户端发送的消息
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': # 连接服务器的请求
print('client 连接服务器!')
label1["text"] = 'client连接服务器成功,请你走棋!'
elif a[0] == 'exit':
print('client对方退出!')
label1["text"] = 'client对方退出,游戏结束!'
elif a[0] == 'over':
print('对方赢信息!')
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(): # 启动新线程来接受客户端消息
thread = threading.Thread(target=receiveMessage, args=())
thread.setDaemon(True)
thread.start()
if __name__ == '__main__':
root = Tk()
root.title("网络五子棋v2.0-服务器端")
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="服务器端...")
label1.pack()
button1 = Button(root, text="退出游戏")
button1.bind("Button-1>", callExit)
button1.pack()
# 创建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("网络五子棋v2.0--UDP客户端")
imgs = [PhotoImage(file='./images/BlackStone.png'), PhotoImage(file='./images/WhiteStone.png')]
turn = 0
MyTurn = -1
# 画对方棋子
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
# 发送消息
def sendMessage(position):
global s
s.sendto(position.encode(), (host, port))
# 退出函数
def callExit(event):
position = "exit|"
sendMessage(position)
os.exit()
# 走棋函数
def callback(event):
global turn
global MyTurn
if MyTurn == -1:
MyTurn = turn
else:
if MyTurn != turn:
showinfo(title="提示", message="还没轮到自己走棋")
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("客户端走的位置", position)
label1["text"] = "客户端走的位置" + 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
# 画棋盘
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()
# 输赢判断
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('对方退出!')
label1["text"] = '对方退出!游戏结束!'
elif a[0] == 'over':
print('对方赢信息!')
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"] = "服务器走的位置" + p[0] + p[1]
drawOtherChess(x, y)
s.close()
# 启动线程接受客户端消息
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="客户端...")
label1.pack()
button1 = Button(root, text="退出游戏")
button1.bind("Button-1>", callExit)
button1.pack()
# 创建UDP
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
port = 8000
host = 'localhost'
pos = 'join|'
sendMessage(pos)
startNewThread()
root.mainloop()