python實(shí)現(xiàn)網(wǎng)絡(luò)五子棋
本文實(shí)例為大家分享了python實(shí)現(xiàn)網(wǎng)絡(luò)五子棋的具體代碼,供大家參考,具體內(nèi)容如下
服務(wù)器端:
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="還沒輪到自己下棋") 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() # 畫對(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è)棋盤的輸贏 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ù)器的請(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"] = "客戶端走的位置" + p[0] + p[1] drawOtherChess(x, y) s.close() def startNewThread(): # 啟動(dòng)新線程來接受客戶端消息 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 # 畫對(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="還沒輪到自己走棋") 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('對(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)線程接受客戶端消息 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í)行頁面:
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Python將數(shù)據(jù)生成二維碼的四種方法實(shí)例代碼
二維碼在日常生活中非常常見,廣泛應(yīng)用于支付、登錄驗(yàn)證、信息分享等場(chǎng)景,下面這篇文章主要給大家介紹了關(guān)于Python將數(shù)據(jù)生成二維碼的四種方法,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下2024-09-09Python xlrd excel文件操作代碼實(shí)例
這篇文章主要介紹了Python xlrd excel文件操作代碼實(shí)例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-03-03在PyCharm中遇到pip安裝 失敗問題及解決方案(pip失效時(shí)的解決方案)
這篇文章主要介紹了在PyCharm中遇到pip安裝失敗問題及解決方案(pip失效時(shí)的解決方案),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-03-03在python里創(chuàng)建一個(gè)任務(wù)(Task)實(shí)例
這篇文章主要介紹了在python里創(chuàng)建一個(gè)任務(wù)(Task)實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-04-04Python使用Virtualenv進(jìn)行虛擬環(huán)境管理的詳細(xì)步驟
Virtualenv是一個(gè)Python環(huán)境管理工具,它允許開發(fā)者在不同的項(xiàng)目之間獨(dú)立創(chuàng)建和管理各自的Python環(huán)境,通過virtualenv,你可以為每個(gè)項(xiàng)目安裝特定版本的Python解釋器以及項(xiàng)目的依賴庫,本文給大家介紹了Python使用Virtualenv進(jìn)行虛擬環(huán)境管理的詳細(xì)步驟2024-09-09Python 實(shí)現(xiàn)任意區(qū)域文字識(shí)別(OCR)操作
這篇文章主要介紹了Python 實(shí)現(xiàn)任意區(qū)域文字識(shí)別(OCR)操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2021-03-03