亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

python實(shí)現(xiàn)網(wǎng)絡(luò)五子棋

 更新時(shí)間:2021年04月11日 10:43:21   作者:XXXOT  
這篇文章主要為大家詳細(xì)介紹了python實(shí)現(xiàn)網(wǎng)絡(luò)五子棋,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

本文實(shí)例為大家分享了python實(shí)現(xiàn)網(wǎng)絡(luò)五子棋的具體代碼,供大家參考,具體內(nèi)容如下

服務(wù)器端:

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()


# 走棋函數(shù)
def callPos(event):
    global turn
    global MyTurn
    if MyTurn == -1:  # 第一次確認(rèn)自己的角色
        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("服務(wù)器走的位置", pos)
        label1["text"] = "服務(wù)器走的位置" + 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


# 發(fā)送消息
def sendMessage(pos):
    global s
    global addr
    s.sendto(pos.encode(), addr)


# 退出函數(shù)
def callExit(event):
    pos = "exit|"
    sendMessage(pos)
    os.exit()


# 畫對(duì)方棋子
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


# 判斷整個(gè)棋盤的輸贏
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:  # 接受客戶端發(fā)送的消息
        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':  # 連接服務(wù)器的請(qǐng)求
            print('client 連接服務(wù)器!')
            label1["text"] = 'client連接服務(wù)器成功,請(qǐng)你走棋!'
        elif a[0] == 'exit':
            print('client對(duì)方退出!')
            label1["text"] = 'client對(duì)方退出,游戲結(jié)束!'
        elif a[0] == 'over':
            print('對(duì)方贏信息!')
            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():  # 啟動(dòng)新線程來接受客戶端消息
    thread = threading.Thread(target=receiveMessage, args=())
    thread.setDaemon(True)
    thread.start()


if __name__ == '__main__':
    root = Tk()
    root.title("網(wǎng)絡(luò)五子棋v2.0-服務(wù)器端")
    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="服務(wù)器端...")
    label1.pack()
    button1 = Button(root, text="退出游戲")
    button1.bind("<Button-1>", callExit)
    button1.pack()
    # 創(chuàng)建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("網(wǎng)絡(luò)五子棋v2.0--UDP客戶端")
imgs = [PhotoImage(file='./images/BlackStone.png'), PhotoImage(file='./images/WhiteStone.png')]
turn = 0
MyTurn = -1


# 畫對(duì)方棋子
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


# 發(fā)送消息
def sendMessage(position):
    global s
    s.sendto(position.encode(), (host, port))


# 退出函數(shù)
def callExit(event):
    position = "exit|"
    sendMessage(position)
    os.exit()


# 走棋函數(shù)
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('對(duì)方退出!')
            label1["text"] = '對(duì)方退出!游戲結(jié)束!'
        elif a[0] == 'over':
            print('對(duì)方贏信息!')
            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"] = "服務(wù)器走的位置" + p[0] + p[1]
            drawOtherChess(x, y)
    s.close()


# 啟動(dòng)線程接受客戶端消息
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()
    # 創(chuàng)建UDP
    s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    port = 8000
    host = 'localhost'
    pos = 'join|'
    sendMessage(pos)
    startNewThread()
    root.mainloop()

游戲執(zhí)行頁面:

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Python連接es之查詢方式示例匯總

    Python連接es之查詢方式示例匯總

    這篇文章主要為大家介紹了Python連接es之查詢方式示例匯總詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-05-05
  • Python將數(shù)據(jù)生成二維碼的四種方法實(shí)例代碼

    Python將數(shù)據(jù)生成二維碼的四種方法實(shí)例代碼

    二維碼在日常生活中非常常見,廣泛應(yīng)用于支付、登錄驗(yàn)證、信息分享等場(chǎng)景,下面這篇文章主要給大家介紹了關(guān)于Python將數(shù)據(jù)生成二維碼的四種方法,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2024-09-09
  • Python xlrd excel文件操作代碼實(shí)例

    Python xlrd excel文件操作代碼實(shí)例

    這篇文章主要介紹了Python xlrd excel文件操作代碼實(shí)例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-03-03
  • 在PyCharm中遇到pip安裝 失敗問題及解決方案(pip失效時(shí)的解決方案)

    在PyCharm中遇到pip安裝 失敗問題及解決方案(pip失效時(shí)的解決方案)

    這篇文章主要介紹了在PyCharm中遇到pip安裝失敗問題及解決方案(pip失效時(shí)的解決方案),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-03-03
  • 在python里創(chuàng)建一個(gè)任務(wù)(Task)實(shí)例

    在python里創(chuàng)建一個(gè)任務(wù)(Task)實(shí)例

    這篇文章主要介紹了在python里創(chuàng)建一個(gè)任務(wù)(Task)實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2020-04-04
  • Python使用Virtualenv進(jìn)行虛擬環(huán)境管理的詳細(xì)步驟

    Python使用Virtualenv進(jìn)行虛擬環(huán)境管理的詳細(xì)步驟

    Virtualenv是一個(gè)Python環(huán)境管理工具,它允許開發(fā)者在不同的項(xiàng)目之間獨(dú)立創(chuàng)建和管理各自的Python環(huán)境,通過virtualenv,你可以為每個(gè)項(xiàng)目安裝特定版本的Python解釋器以及項(xiàng)目的依賴庫,本文給大家介紹了Python使用Virtualenv進(jìn)行虛擬環(huán)境管理的詳細(xì)步驟
    2024-09-09
  • Python3之字符串比較_重寫cmp函數(shù)方式

    Python3之字符串比較_重寫cmp函數(shù)方式

    這篇文章主要介紹了Python3之字符串比較_重寫cmp函數(shù)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-02-02
  • python中rb含義理解

    python中rb含義理解

    在本篇文章里小編給大家整理的是關(guān)于python中rb含義及用法內(nèi)容,需要的朋友們可以學(xué)習(xí)下。
    2020-06-06
  • python實(shí)現(xiàn)知乎高顏值圖片爬取

    python實(shí)現(xiàn)知乎高顏值圖片爬取

    這篇文章主要介紹了python實(shí)現(xiàn)知乎高顏值圖片爬取,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-08-08
  • Python 實(shí)現(xiàn)任意區(qū)域文字識(shí)別(OCR)操作

    Python 實(shí)現(xiàn)任意區(qū)域文字識(shí)別(OCR)操作

    這篇文章主要介紹了Python 實(shí)現(xiàn)任意區(qū)域文字識(shí)別(OCR)操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2021-03-03

最新評(píng)論