加入收藏 | 设为首页 | 会员中心 | 我要投稿 银川站长网 (https://www.0951zz.com/)- 云通信、基础存储、云上网络、机器学习、视觉智能!
当前位置: 首页 > 综合聚焦 > 编程要点 > 语言 > 正文

用Python写双人五子棋的思路和代码是啥

发布时间:2023-08-29 12:47:05 所属栏目:语言 来源:
导读:这篇文章给大家分享的是用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 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写双人五子棋的思路和代码是什么的内容应该都有一定的认识了吧,希望这篇能对大家有所帮助。

(编辑:银川站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章