当前位置 博文首页 > 文章内容

    python实现网络五子棋

    作者:shunshunshun18 栏目:未分类 时间:2021-04-11 14:42:46

    本站于2023年9月4日。收到“大连君*****咨询有限公司”通知
    说我们IIS7站长博客,有一篇博文用了他们的图片。
    要求我们给他们一张图片6000元。要不然法院告我们

    为避免不必要的麻烦,IIS7站长博客,全站内容图片下架、并积极应诉
    博文内容全部不再显示,请需要相关资讯的站长朋友到必应搜索。谢谢!

    另祝:版权碰瓷诈骗团伙,早日弃暗投明。

    相关新闻:借版权之名、行诈骗之实,周某因犯诈骗罪被判处有期徒刑十一年六个月

    叹!百花齐放的时代,渐行渐远!



    本文实例为大家分享了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()

    游戏执行页面:

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