您好,登錄后才能下訂單哦!
這篇文章主要介紹了python實現(xiàn)網(wǎng)絡(luò)五子棋的方法,具有一定借鑒價值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。
具體內(nèi)容如下
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: # 第一次確認自己的角色 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() # 畫對方棋子 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: # 接受客戶端發(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ù)器的請求 print('client 連接服務(wù)器!') label1["text"] = 'client連接服務(wù)器成功,請你走棋!' elif a[0] == 'exit': print('client對方退出!') label1["text"] = 'client對方退出,游戲結(jié)束!' 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("網(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客戶端") 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 # 發(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="還沒輪到自己走棋") 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"] = '對方退出!游戲結(jié)束!' 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"] = "服務(wù)器走的位置" + 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() # 創(chuàng)建UDP s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) port = 8000 host = 'localhost' pos = 'join|' sendMessage(pos) startNewThread() root.mainloop()
游戲執(zhí)行頁面:
感謝你能夠認真閱讀完這篇文章,希望小編分享的“python實現(xiàn)網(wǎng)絡(luò)五子棋的方法”這篇文章對大家有幫助,同時也希望大家多多支持億速云,關(guān)注億速云行業(yè)資訊頻道,更多相關(guān)知識等著你來學(xué)習(xí)!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。