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()
  • 0
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值