python实现网络五子棋

本文实例为大家分享了python实现网络五子棋的具体代码,供大家参考,具体内容如下
服务器端:

import osimport socketimport threadingfrom 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 turnglobal MyTurnif MyTurn == -1:# 第一次确认自己的角色MyTurn = turnelse:if MyTurn != turn:showinfo(title="提示", message="还没轮到自己下棋")return# print("clicked at",event.x,event.y,true)x = event.x // 40y = event.y // 40print("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 = 1else:turn = 0# 发送消息def sendMessage(pos):global sglobal addrs.sendto(pos.encode(), addr)# 退出函数def callExit(event):pos = "exit|"sendMessage(pos)os.exit()# 画对方棋子def drawOtherChess(x, y):global turnimg1 = images[turn]cv.create_image((x * 40 + 20, y * 40 + 20), image=img1)cv.pack()maps[x][y] = str(turn)# 换下一方走棋if turn == 0:turn = 1else: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 Truefor 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 Truefor 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 Truefor 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 Truereturn 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 swhile True:# 接受客户端发送的消息global addrdata, addr = s.recvfrom(1024)data = https://www.it610.com/article/data.decode('utf-8')a = data.split("|")if not data:print('client has exited!')breakelif 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 = 0MyTurn = -1maps = [[" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " "] for y in range(15)]cv = Canvas(root, bg='green', width=610, height=610)drawQiPan()cv.bind("", callPos)cv.pack()label1 = Label(root, text="服务器端...")label1.pack()button1 = Button(root, text="退出游戏")button1.bind("", callExit)button1.pack()# 创建UDP SOCKETs = 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 socketimport threadingimport os# 主程序root = Tk()root.title("网络五子棋v2.0--UDP客户端")imgs = [PhotoImage(file='./images/BlackStone.png'), PhotoImage(file='./images/WhiteStone.png')]turn = 0MyTurn = -1# 画对方棋子def drawOtherChess(x, y):global turnimg1 = imgs[turn]cv.create_image((x * 40 + 20, y * 40 + 20), image=img1)cv.pack()maps[x][y] = str(turn)# 换下一方走棋if turn == 0:turn = 1else:turn = 0# 发送消息def sendMessage(position):global ss.sendto(position.encode(), (host, port))# 退出函数def callExit(event):position = "exit|"sendMessage(position)os.exit()# 走棋函数def callback(event):global turnglobal MyTurnif MyTurn == -1:MyTurn = turnelse:if MyTurn != turn:showinfo(title="提示", message="还没轮到自己走棋")return# print("clicked at",event.x,event.y)x = event.x // 40y = event.y // 40print("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 = 1else: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 Truefor 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 Truefor 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 Truefor 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 Truereturn False# 接受消息def receiveMessage():# 接受消息global swhile True:data = https://www.it610.com/article/s.recv(1024).decode('utf-8')a = data.split("|")if not data:print('server has exited!')breakelif 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("", callback)cv.pack()label1 = Label(root, text="客户端...")label1.pack()button1 = Button(root, text="退出游戏")button1.bind("", callExit)button1.pack()# 创建UDPs = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)port = 8000host = 'localhost'pos = 'join|'sendMessage(pos)startNewThread()root.mainloop()

游戏执行页面:
python实现网络五子棋
文章图片

【python实现网络五子棋】以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

    推荐阅读