本文实例为大家分享了python实现网络五子棋的具体代码,供大家参考,具体内容如下
服务器端:
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()
游戏执行页面:
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持自学编程网。