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="還沒(méi)輪到自己下棋")
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
# 輸出輸贏(yíng)信息
if win_lose():
if turn == 0:
showinfo(title="提示", message="黑方你贏(yíng)了")
sendMessage("over|黑方你贏(yíng)了")
else:
showinfo(title="提示", message="白方你贏(yíng)了")
sendMessage("over|白方你贏(yíng)了")
# 換下一方走棋
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()
# 畫(huà)對(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è)棋盤(pán)的輸贏(yíng)
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: # 接受客戶(hù)端發(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ì)方贏(yíng)信息!')
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"] = "客戶(hù)端走的位置" + p[0] + p[1]
drawOtherChess(x, y)
s.close()
def startNewThread(): # 啟動(dòng)新線(xiàn)程來(lái)接受客戶(hù)端消息
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()
客戶(hù)端:
from tkinter import *
from tkinter.messagebox import *
import socket
import threading
import os
# 主程序
root = Tk()
root.title("網(wǎng)絡(luò)五子棋v2.0--UDP客戶(hù)端")
imgs = [PhotoImage(file='./images/BlackStone.png'), PhotoImage(file='./images/WhiteStone.png')]
turn = 0
MyTurn = -1
# 畫(huà)對(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="還沒(méi)輪到自己走棋")
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("客戶(hù)端走的位置", position)
label1["text"] = "客戶(hù)端走的位置" + position
# 輸出輸贏(yíng)信息
if win_lose():
if turn == 0:
showinfo(title="提示", message="黑方你贏(yíng)了")
sendMessage("over|黑方你贏(yíng)了!")
else:
showinfo(title="提示", message="白方你贏(yíng)了!")
sendMessage("over|白方你贏(yíng)了!")
# 換下一方走棋:
if turn == 0:
turn = 1
else:
turn = 0
# 畫(huà)棋盤(pán)
def drawQiPan(): # 畫(huà)棋盤(pán)
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()
# 輸贏(yíng)判斷
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ì)方贏(yíng)信息!')
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)線(xiàn)程接受客戶(hù)端消息
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="客戶(hù)端...")
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í)行頁(yè)面:

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Python將數(shù)據(jù)生成二維碼的四種方法實(shí)例代碼
二維碼在日常生活中非常常見(jiàn),廣泛應(yīng)用于支付、登錄驗(yàn)證、信息分享等場(chǎng)景,下面這篇文章主要給大家介紹了關(guān)于Python將數(shù)據(jù)生成二維碼的四種方法,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下2024-09-09
Python xlrd excel文件操作代碼實(shí)例
這篇文章主要介紹了Python xlrd excel文件操作代碼實(shí)例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-03-03
在PyCharm中遇到pip安裝 失敗問(wèn)題及解決方案(pip失效時(shí)的解決方案)
這篇文章主要介紹了在PyCharm中遇到pip安裝失敗問(wèn)題及解決方案(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ì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-04-04
Python使用Virtualenv進(jìn)行虛擬環(huán)境管理的詳細(xì)步驟
Virtualenv是一個(gè)Python環(huán)境管理工具,它允許開(kāi)發(fā)者在不同的項(xiàng)目之間獨(dú)立創(chuàng)建和管理各自的Python環(huán)境,通過(guò)virtualenv,你可以為每個(gè)項(xiàng)目安裝特定版本的Python解釋器以及項(xiàng)目的依賴(lài)庫(kù),本文給大家介紹了Python使用Virtualenv進(jìn)行虛擬環(huán)境管理的詳細(xì)步驟2024-09-09
Python3之字符串比較_重寫(xiě)cmp函數(shù)方式
這篇文章主要介紹了Python3之字符串比較_重寫(xiě)cmp函數(shù)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-02-02
Python 實(shí)現(xiàn)任意區(qū)域文字識(shí)別(OCR)操作
這篇文章主要介紹了Python 實(shí)現(xiàn)任意區(qū)域文字識(shí)別(OCR)操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2021-03-03

