• 企业400电话
  • 微网小程序
  • AI电话机器人
  • 电商代运营
  • 全 部 栏 目

    企业400电话 网络优化推广 AI电话机器人 呼叫中心 网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    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()

    游戏执行页面:

    以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

    您可能感兴趣的文章:
    • python游戏实战项目之智能五子棋
    • Python五子棋小游戏实例分享
    • python编写五子棋游戏
    • python实现双人五子棋(终端版)
    • Python tkinter制作单机五子棋游戏
    • python实现简单的五子棋游戏
    • python游戏实战项目之智能五子棋简易版
    上一篇:python实现简易名片管理系统
    下一篇:浅谈Python列表嵌套字典转化的问题
  • 相关文章
  • 

    © 2016-2020 巨人网络通讯 版权所有

    《增值电信业务经营许可证》 苏ICP备15040257号-8

    python实现网络五子棋 python,实现,网络,五子棋,