Python怎么实现双人五子棋对局
发表于:2025-01-18 作者:千家信息网编辑
千家信息网最后更新 2025年01月18日,这篇文章主要介绍"Python怎么实现双人五子棋对局",在日常操作中,相信很多人在Python怎么实现双人五子棋对局问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答"Pyt
千家信息网最后更新 2025年01月18日Python怎么实现双人五子棋对局
这篇文章主要介绍"Python怎么实现双人五子棋对局",在日常操作中,相信很多人在Python怎么实现双人五子棋对局问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答"Python怎么实现双人五子棋对局"的疑惑有所帮助!接下来,请跟着小编一起来学习吧!
效果:
自己需要两个棋子:
服务器玩家全部代码:
# 案列使用TCP连接# 这是服务器端import socketimport wximport threadingimport timefrom PIL import Image# 定义套接字 ss=socket.socket(socket.AF_INET,socket.SOCK_STREAM)Cell=40# 定义窗口类class MyFrame(wx.Frame): # 初始化这里就是生成界面,然后绑定了按钮事件,其他没了 def __init__(self): super().__init__(parent=None,size=(600,600),title="五子棋:服务器") self.Center() self.panel=wx.Panel(parent=self) #openButton = wx.Button(parent=map, id=1, label="开房间") #self.Bind(wx.EVT_BUTTON, self.StartGame) self.panel.Bind(wx.EVT_PAINT, self.PaintBackground) # 绘图 self.panel.Bind(wx.EVT_LEFT_DOWN,self.GoChess) # 绑定鼠标左键消息 self.picture = [wx.Bitmap("黑.png"), wx.Bitmap("白.png")] # 创造二维数组用来判断自己是否获胜 self.map = [[" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " "] for y in range(15)] # 定义一个变量来标志自己是否可以走棋 self.IsGoGame = True self.StartGame() # 画背景函数 def PaintBackground(self,event): self.dc = wx.PaintDC(self.panel) # 创造背景 brush = wx.Brush("white") self.dc.SetBackground(brush) self.dc.Clear() # 画方格线 pen = wx.Pen(wx.Colour(0, 0, 0), 1, wx.SOLID) self.dc.SetPen(pen) for i in range(15): self.dc.DrawLine(0, Cell*i, 600, Cell*i) self.dc.DrawLine(Cell * i, 0, Cell * i, 600) # 在x,y坐标绘制棋子 def PaintPiece(self,x,y): image = wx.StaticBitmap(self.panel, -1, self.picture[0],size=(40,40),pos=(x*Cell+Cell/2,y*Cell+Cell/2)) #image.SetPosition((x*Cell+Cell/2,y*Cell+Cell/2)) # 玩家自己走棋 def GoChess(self,event): #SetPosition(event.GetPosition()) if self.IsGoGame: pos = event.GetPosition() # 在x,y坐标绘制棋子 x = int((pos.x - Cell / 2) // Cell) y = int((pos.y - Cell / 2) // Cell) self.PaintPiece(x, y) # 下子后,向客户端发送位置 msg = str(x) + "," + str(y) self.conn.send(msg.encode()) # 给客户端发送信息 print("服务器发送:", msg) self.map[x][y]="a" # 判断是否胜利 if self.win_lose("a"): self.one_Dialog("win") self.IsGoGame=False else: self.one_Dialog("notGo") # 开启服务器端函数 def StartGame(self): self.otherNum=0 self.image=[] for item in range(50): self.image.append(wx.StaticBitmap(self.panel, -1, self.picture[1], size=(40, 40),pos=(-100,-100))) threadGame=threading.Thread(target=self.thread_body,name="Srever") threadGame.start() def thread_body(self): s.bind(("127.0.0.1", 8888)) # 绑定IP和端口(参数为二元组),就是寻址 s.listen(5) # 因为是TCP,所有要监听端口 print("服务器启动·····") self.conn, self.addess = s.accept() # 等待客户端连接(参数为最大连接数),返回一个二元组(新的socket对象+客户端地址) while True: data = self.conn.recv(1024) # 接受1024字节序列数据(这个函数阻塞,直到接受到数据) if len(data) != 0: msg = data.decode() print("服务器接收:",msg) msg = msg.split(",") #self.PaintPiece(int(msg[0]), int(msg[1])) #image = wx.StaticBitmap(self.panel, -1, self.picture[0], size=(40, 40)) # 设置原来实例化好的棋子的位置 self.image[self.otherNum].SetPosition((int(msg[0]) * Cell + Cell / 2, int(msg[1])* Cell + Cell / 2)) self.otherNum+=1 self.map[int(msg[0])][int(msg[1])] = "b" if self.win_lose("b"): # 判断对方玩家是否胜利 self.one_Dialog("lose") self.IsGoGame = True # 接收消息后 玩家能够走棋 #time.sleep(2) def one_Dialog(self,msg): if msg=="win": dlg = wx.MessageDialog(None, u"你胜利了!", u"恭喜", wx.YES_NO | wx.ICON_QUESTION) if dlg.ShowModal() == wx.ID_YES: self.Close(True) dlg.Destroy() elif msg=="lose": dlg = wx.MessageDialog(None, u"你输了!", u"很遗憾", wx.YES_NO | wx.ICON_QUESTION) if dlg.ShowModal() == wx.ID_YES: self.Close(True) dlg.Destroy() elif msg == "notGo": dlg = wx.MessageDialog(None, u"等待对方下棋!", u"提示", wx.YES_NO | wx.ICON_QUESTION) if dlg.ShowModal() == wx.ID_YES: #self.Close(True) dlg.Destroy() def win_lose(self,msg): a = str(msg) print("a=", a) for i in range(0, 11): for j in range(0, 11): if self.map[i][j] == a and self.map[i + 1][j + 1] == a and self.map[i + 2][j + 2] == a and \ self.map[i + 3][ j + 3] == a and self.map[i + 4][j + 4] == a: print("x=y轴上形成五子连珠") return True for i in range(4, 15): for j in range(0, 11): if self.map[i][j] == a and self.map[i - 1][j + 1] == a and self.map[i - 2][j + 2] == a and \ self.map[i - 3][ j + 3] == a and self.map[i - 4][j + 4] == a: print("x=-y轴上形成五子连珠") return True for i in range(0, 15): for j in range(4, 15): if self.map[i][j] == a and self.map[i][j - 1] == a and self.map[i][j - 2] == a and self.map[i][ j - 2] == a and self.map[i][ j - 4] == a: print("Y轴上形成了五子连珠") return True for i in range(0, 11): for j in range(0, 15): if self.map[i][j] == a and self.map[i + 1][j] == a and self.map[i + 2][j] == a and \ self.map[i + 3][j] == a and \ self.map[i + 4][j] == a: print("X轴形成五子连珠") return True return False# 应用程序class App(wx.App): def OnInit(self): frame=MyFrame() frame.Show() return True def OnExit(self): s.close() # 关闭socket对象 return 0# 进入main函数运行:循环if __name__=="__main__": app=App() app.MainLoop()
客户端玩家全部代码:
# 案列使用TCP连接# 这是服务器端import socketimport wximport threadingimport timefrom PIL import Image# 定义套接字 ss=socket.socket(socket.AF_INET,socket.SOCK_STREAM)Cell=40# 定义窗口类class MyFrame(wx.Frame): # 初始化这里就是生成界面,然后绑定了按钮事件,其他没了 def __init__(self): super().__init__(parent=None,size=(600,600),title="五子棋:客户端") self.Center() self.panel=wx.Panel(parent=self) #openButton = wx.Button(parent=map, id=1, label="开房间") #self.Bind(wx.EVT_BUTTON, self.StartGame) self.panel.Bind(wx.EVT_PAINT, self.PaintBackground) # 绘图 self.panel.Bind(wx.EVT_LEFT_DOWN,self.GoChess) # 绑定鼠标左键消息 self.picture=[wx.Bitmap("白.png"),wx.Bitmap("黑.png")] # 创造二维数组用来判断自己是否获胜 self.map = [[" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " "] for y in range(15)] # 定义一个变量来标志自己是否可以走棋 self.IsGoGame=False self.StartGame() # 画背景函数 def PaintBackground(self,event): self.dc = wx.PaintDC(self.panel) # 创造背景 brush = wx.Brush("white") self.dc.SetBackground(brush) self.dc.Clear() # 画方格线 pen = wx.Pen(wx.Colour(0, 0, 0), 1, wx.SOLID) self.dc.SetPen(pen) for i in range(15): self.dc.DrawLine(0, Cell*i, 600, Cell*i) self.dc.DrawLine(Cell * i, 0, Cell * i, 600) # 在x,y坐标绘制棋子 def PaintPiece(self,x,y): image = wx.StaticBitmap(self.panel, -1,self.picture[0] ,size=(40,40),pos=(x*Cell+Cell/2,y*Cell+Cell/2)) #image.SetPosition() def GoChess(self,event): #SetPosition(event.GetPosition()) if self.IsGoGame: # 轮到自己下棋 pos = event.GetPosition() # 在x,y坐标绘制棋子 x=int((pos.x-Cell/2)//Cell) y=int((pos.y-Cell/2)//Cell) self.PaintPiece(x, y) # 下子后,向客户端发送位置 msg=str(x)+","+str(y) s.send(msg.encode()) # 给客户端发送信息 print("客户端发送:", msg) self.map[x][y] = "a" # 判断是否胜利 if self.win_lose("a"): self.one_Dialog("win") self.IsGoGame=False else: self.one_Dialog("notGo") # 开启服务器端函数 def StartGame(self): self.image=[] self.otherNum = 0 for item in range(50): self.image.append(wx.StaticBitmap(self.panel, -1, self.picture[1], size=(40, 40), pos=(-100, -100))) while True: try: s.connect(("127.0.0.1", 8888)) break except: print("等待服务器启动~") threadGame = threading.Thread(target=self.thread_body, name="Client") threadGame.start() return def thread_body(self): while True: data = s.recv(1024) # 等待接收服务器端信息 if len(data) != 0: msg=data.decode() print("客户端接收:", msg) msg = msg.split(",") #self.PaintPiece(int(msg[0]), int(msg[1])) #image = wx.StaticBitmap(self.panel, -1, self.picture[0], size=(40, 40)) self.image[self.otherNum].SetPosition((int(msg[0]) * Cell + Cell / 2, int(msg[1]) * Cell + Cell / 2)) self.otherNum += 1 self.map[int(msg[0])][int(msg[1])] = "b" if self.win_lose("b"): self.one_Dialog("lose") self.IsGoGame=True #time.sleep(2) def one_Dialog(self, msg): if msg == "win": dlg = wx.MessageDialog(None, u"你胜利了!", u"恭喜", wx.YES_NO | wx.ICON_QUESTION) if dlg.ShowModal() == wx.ID_YES: self.Close(True) dlg.Destroy() if msg == "lose": dlg = wx.MessageDialog(None, u"你输了!", u"很遗憾", wx.YES_NO | wx.ICON_QUESTION) if dlg.ShowModal() == wx.ID_YES: self.Close(True) dlg.Destroy() if msg == "notGo": dlg = wx.MessageDialog(None, u"等待对方下棋!", u"提示", wx.YES_NO | wx.ICON_QUESTION) if dlg.ShowModal() == wx.ID_YES: #self.Close(True) dlg.Destroy() # 判断整个棋盘的输赢 def win_lose(self,msg): a = str(msg) print("a=", a) for i in range(0, 11): for j in range(0, 11): if self.map[i][j] == a and self.map[i + 1][j + 1] == a and self.map[i + 2][j + 2] == a and self.map[i + 3][ j + 3] == a and self.map[i + 4][j + 4] == a: print("x=y轴上形成五子连珠") return True for i in range(4, 15): for j in range(0, 11): if self.map[i][j] == a and self.map[i - 1][j + 1] == a and self.map[i - 2][j + 2] == a and self.map[i - 3][ j + 3] == a and self.map[i - 4][j + 4] == a: print("x=-y轴上形成五子连珠") return True for i in range(0, 15): for j in range(4, 15): if self.map[i][j] == a and self.map[i][j - 1] == a and self.map[i][j - 2] == a and self.map[i][j - 2] == a and self.map[i][ j - 4] == a: print("Y轴上形成了五子连珠") return True for i in range(0, 11): for j in range(0, 15): if self.map[i][j] == a and self.map[i + 1][j] == a and self.map[i + 2][j] == a and self.map[i + 3][j] == a and \ self.map[i + 4][j] == a: print("X轴形成五子连珠") return True return False# 应用程序class App(wx.App): def OnInit(self): frame=MyFrame() frame.Show() return True def OnExit(self): s.close() # 关闭socket对象 return 0# 进入main函数运行:循环if __name__=="__main__": app=App() app.MainLoop()
到此,关于"Python怎么实现双人五子棋对局"的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注网站,小编会继续努力为大家带来更多实用的文章!
五子
服务器
服务
客户
客户端
连珠
函数
五子棋
棋子
玩家
胜利
坐标
背景
学习
位置
信息
对方
对象
就是
消息
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
网络安全只有进行时
基层公安网络安全
长三角软件开发者大会
网络安全广告法
软件开发留存质保金
边缘服务器研究
郑州计算机网络安全协会在哪
天正软件开发公司
服务器防火墙重启
服务器ups不间断电源制作
成立24个小时网络安全小组
什么软件可以管理各类数据库
文档数据库难点
数据库创建主键的语句
北京水利互联网科技公司
无法打开登录中的数据库
肇庆电商软件开发定制
地质灾害数据库查询
985大学法律数据库
杨浦区综合软件开发创造辉煌
网络安全有以下四个方面特性
2008r2服务器管理器
广州帝发网络技术有限公司
gui 面板显示数据库
局网络安全责任书
终端网络安全解决方案
本溪直销软件开发
数据库技术第二版实训3第二题
网易服务器怎么领取东西
禾字开发后能用软件开发吗