Python怎么实现双人五子棋对局
发表于:2026-11-01 作者:千家信息网编辑
千家信息网最后更新 2026年11月01日,这篇文章主要介绍"Python怎么实现双人五子棋对局",在日常操作中,相信很多人在Python怎么实现双人五子棋对局问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答"Pyt
千家信息网最后更新 2026年11月01日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安全错误
数据库的锁怎样保障安全
互联网科技公司简介
科技企业和互联网企业
美国互联网科技巨头监管
美国互联网科技
为想互联网科技
亿策互联网科技
艾特科技互联网
壕鑫互联网络科技
深圳艾佳互联网科技
深圳市运趣互联网科技有限公司
深圳国际航运科技和互联网
花神(南京)互联网科技有限公司
乌苏新华互联网科技做什么的
洛阳共同富裕互联网科技有限公司
互联网科技创新的路径
上海京穆互联网科技有限公司
伍佰万互联网科技怎么赚钱
抖集互联网科技技术咨询
黑龙江互联网科技公司
互联网科技创新方面的资料
苏州找大状互联网科技有限公司
浩特互联网科技
重庆威客帮互联网科技
中国航天科技大学国际工业互联网
畅思互联网科技
互联网科技大赛获奖感言
易租星互联网科技有限公司
科技互联网公司两年变化
绵阳真晨互联网科技有限公司
互联网对科技影响