python实现网络五子棋

2021-04-27 0 447

本文实例为大家分享了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实现网络五子棋 http://www.ox520.com/28506.html

常见问题

相关文章

发表评论
暂无评论
官方客服团队

为您解决烦忧 - 24小时在线 专业服务