您现在的位置是:网站首页> 编程资料编程资料

Python实现双人五子棋对局_python_

2023-05-26 430人已围观

简介 Python实现双人五子棋对局_python_

本文实例为大家分享了Python实现双人五子棋对局的具体代码,供大家参考,具体内容如下

效果:

自己需要两个棋子:

服务器玩家全部代码:

# 案列使用TCP连接 # 这是服务器端 import socket import wx import threading import time from PIL import Image #  定义套接字 s s=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 socket import wx import threading import time from PIL import Image #  定义套接字 s s=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
                
                

-六神源码网