14 網絡通信案例——基於UDP的網絡五子棋遊戲(1)

#!/usr/bin/env python
# coding: utf-8

14.2 五子棋遊戲的設計思想

掃描整個棋盤判斷輸贏的算法

def win_lose():
    a = str(turn)
    print('a=', a)
    
    # 判斷X=Y軸上是否形成五子連珠
    for i in range(11):
        for j in range(11):
            if map[i][j]==a and map[i+1][j+1]==a and map[i+2][j+2]==a and map[i+3][j+3]==a and map[i+4][j+4]==a:
                print('X=Y軸上形成五子連珠!')
                return True
    
    # 判斷X=-Y軸上是否形成五子連珠
    for i in range(4, 15):
        for j in range(11):
            if map[i][j]==a and map[i-1][j+1]==a and map[i-2][j+2]==a and map[i-3][j+3]==a and map[i-4][j+4]==a:
                print('X=-Y軸上形成五子連珠!')
                return True
    
    # 判斷Y軸上是否形成五子連珠
    for i in range(15):
        for j in range(4, 15):
            if map[i][j]==a and map[i][j-1]==a and map[i][j-2]==a and map[i][j-3]==a and map[i][j-4]==a:
                print('Y軸上形成五子連珠!')
                return True
    
    # 判斷X軸上是否形成五子連珠
    for i in range(11):
        for j in range(15):
            if map[i][j]==a and map[i+1][j]==a and map[i+2][j]==a and map[i+3][j]==a and map[i+4][j]==a:
                print('X軸上形成五子連珠!')
                return True
    
    return False
            

不掃描整個棋盤判斷輸贏的算法,只掃描周邊

def checkWin(x, y): # 當前下棋的位置點,同時代表了顏色!!!
    flag = False
    color = map[x][y]
    
    # 橫向的判斷
    count = 1
    for k in range(2):
        s = (-1)**k
        i = 1
        while color == map[x+i*s][y]:
            count += 1
            i += 1
            if count >= 5:
                flag = True

    
    # 縱向的判斷
    count = 1
    for k in range(2):
        s = (-1)**k
        i = 1
        while color == map[x][y+i*s]:
            count += 1
            i += 1
            if count >= 5:
                flag = True
                
    # 斜方向的判斷(右上 + 左下)
    count = 1
    for k in range(2):
        s = (-1)**k
        i = 1
        while color == map[x+i*s][y-i*s]:
            count += 1
            i += 1
            if count >= 5:
                flag = True
    
    # 斜方向的判斷(右下 + 左上)
    count = 1
    for k in range(2):
        s = (-1)**k
        i = 1
        while color == map[x+i*s][y+i*s]:
            count += 1
            i += 1
            if count >= 5:
                flag = True
    
    return flag

14.3 關鍵技術

1、UDP編程

編寫一個簡單的UDP演示下棋程序

下面是服務器:

import socket
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s.bind(('127.0.0.1', 8888))


# In[ ]:


print('Bind UDP on 8888...')
while True:
    # 接收數據
    data, addr = s.recvfrom(1024)
    print('Received from %s:%s.' % addr)
    print('reveived:', data)
    p = data.decode('utf-8').split(',')
    x = int(p[0])
    y = int(p[1])
    print(p[0], p[1])
    
    # 處理之後發過去!
    pos = str(x+1) + ',' + str(y+1)
    s.sendto(pos.encode('utf-8'), addr)

下面是客戶端:

import socket
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
x = input('請輸入x座標')
y = input('請輸入y座標')
data = str(x) + ',' + str(y)
s.sendto(data.encode('utf-8'), ('127.0.0.1', 8888))

# 接收服務器加一之後的座標數據
data2, addr = s.recvfrom(1024)
print('接收服務器加1後坐標數據:', data2.decode('utf-8'))

s.close()


2、自定義網絡五子棋遊戲的通信協議

定義一些首部來識別信息的類型

·move|7,4 表示對方下子的位置座標
·over|黑方你贏了
·exit| 表示對方離開了,遊戲結束
·join| 表示連接服務器
·另外可自行定義:悔棋,文字聊天等協議
from tkinter import *
from tkinter.messagebox import *
import socket
import threading
import os

通信協議具體實現

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])
        elif a[0] == 'move':
            print('receive:', 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()
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章