python实现网络五子棋
作者:XXXOT 发布时间:2021-10-16 23:58:17
标签:python,五子棋
本文实例为大家分享了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()
游戏执行页面:
来源:https://blog.csdn.net/weixin_53776140/article/details/115548090
0
投稿
猜你喜欢
- 基本上是因为jupyter notebook的kernel所用的python和命令提示符中的python环境不一样。首先分别在cmd和jup
- 内容摘要:网页设计师制作网页最常用的设计软件应该就算adobe的产品Photoshop了,当然Photoshop不仅可以设计网页,不过作为网
- php魔术方法在php类保留方法中以 “__”两个下划线开头的函数称为魔术方法,我的理解为php类设
- 本文实例讲述了python中尾递归用法。分享给大家供大家参考。具体分析如下:如果一个函数中所有递归形式的调用都出现在函数的末尾,我们称这个递
- 很久没有更新blog了,这段时间实在是发生了很多的事,累身累心。但还是有很多想做的事,比如更新merceCSS、把一直以来所总结的有关模块化
- 方法一一般情况下,SQL数据库的收缩并不能很大程度上减小数据库大小,其主要作用是收缩日志大小,应当定期进行此操作以免数据库日志过大1、设置数
- 借助 GitHub 的网络钩子webhook,开发者可以创建很多有用的服务。从触发一个 Jenkins 实例上的 CI(持续集成) 任务到配
- 0.引言利用python开发,借助Dlib库进行人脸识别,然后将检测到的人脸剪切下来,依次排序显示在新的图像上;实现的效果如下图所示,将图1
- 初学Python,这个问题搞了我好久,现在来分享下我的解决思路,希望可以帮到大家。先说下python引入模块的顺序:首先现在当前文件夹下查找
- 一、time时间模块import time1 、时间戳:time.time()时间戳(timestamp):时间戳表示的是从1970年1月1
- 一、前言前几天,在写一个与差分隐私相关的简单程序时,我发现了一些奇怪的东西:相对于其他的随机数生成函数,Python的random.rand
- 本文实例为大家分享了python放大图片和画方格的具体代码,供大家参考,具体内容如下1、Python 放大图片和画方格算法#!C:/Pyth
- 本文介绍了asp中 adpbe.stream 的语法,各种参数使用说明,方便大家查阅。更多请看:VBScript 速查手册(语言参考) ch
- 0x 00 返回值简介回顾下,上一节简单介绍了函数及其各种参数,其中也有简单介绍 print 和 return 的区别,print 仅仅是打
- 今天在设置input的readonly属性遇到问题,上网查到下面的内容,作个标记。今天系统需要使用javascript 动态设置textbo
- selenium执行js优点:直接调用浏览器的环境障碍:绕过selenium监测原理:# 执行js代码bro.execute_script(
- 下面给出ORACLE的一种实现方式,要分2步走:1. 建立 SEQUENCE CREATE [ OR REPLACE ] SEQUENCE
- 1.文档对象模型(DOM)DOM是HTML和XML文档的编程基础,它定义了处理执行文档的途径。编程者可以使用DOM增加文档、定位文档结构、填
- 析构函数:当某个对象成为垃圾或者当对象被显式销毁时执行。GC(Garbage Collector) 在PHP中,没有任何变量指向这个对象时,
- 英文原文:http://www.456bereastreet.com/archive/200601/css_3_selectors_expl