使用Python构建TCP网络象棋

在这里插入图片描述

象棋百科

中国象棋是起源于中国的一种棋,属于二人对抗性游戏的一种,在中国有着悠久的历史。由于用具简单,趣味性强,成为流行极为广泛的棋艺活动。
中国象棋是中国棋文化,也是中华民族的文化瑰宝,它源远流长,趣味浓厚,基本规则简明易懂。中国象棋在中国的群众中基础远远超过围棋,是普及最广的棋类项目,中国象棋已流传到十几个国家和地区。
中国象棋使用方形格状棋盘,圆形棋子共有32个,红黑二色各有16个棋子,摆放和活动在交叉点上。双方交替行棋,先把对方的将(帅)“将死”的一方获胜。

设计目标

1、勾画简单而形象的象棋棋盘;
2、对战双方通过网络实现实时对战;
3、突出棋手走棋动作;
4、实现不同棋子的走棋规则;
5、实现棋子的吞吃规则;

绘制棋盘

象棋盘是象棋子活动的场所,棋盘由九道竖线和十道横线交叉组成。棋盘上共有九十个交叉点。象棋子共有三十二个,分别有红、白两组,每组十六个,各分七种。按照规则摆放正在棋盘的交叉点上。
绘制棋盘导入python的图形包

from tkinter import *  #绘制常见的图形

以左上角的折点为原点(0,0),建立直角坐标系,这样便于定位每一个坐标点,同时方便定位坐标点上的棋子。
定义坐标点

class Cpoint:
    def __init__(self, m, n):
        self.x = m
        self.y = n

定义像素点

class Cpixel:
    def __init__(self, m, n):
        self.x = m
        self.y = n

这里对于一个棋子的表示即,例,【马】-- Cpoint点,Cpoint点是基于原点位置的偏移,之所以设置像素点,是因为原点位置对于画布来说是可以自定义的(为了美观起见,这里并不设置棋盘(0,0)为画布的(0,0))。

棋盘展示:

棋盘展示

实现TCP服务器和TCP客户端;

import socket        # 导入 socket 模块

突出棋手走棋动作,当棋手点击可以移动的棋子时,将该棋子突出显示,效果如图“炮”:

棋子突出显示

由于是网络对战平台,因此有必要保证对战双方棋盘的实时同步,即对战双方的棋盘要实时保持一致。
客户端服务端一致

网络模块

服务器

s = socket.socket()  # 创建 socket 对象
host = socket.gethostname()  # 获取本地主机名
port = 12345  # 设置端口
s.bind((host, port))  # 绑定端口
print(host)

s.listen(5)  # 等待客户端连接

print("waitting for connection...")
while True:
    c, addr = s.accept()  # 建立客户端连接。
	
    thread = threading.Thread(target=task_func, args=(c, addr,g_count, ))
    thread.start()
    g_count += 1

客户端

s = socket.socket()         # 创建 socket 对象
host = socket.gethostname() # 获取本地主机名
port = 12345                # 设置端口号

s.connect((host, port))
print (str(s.recv(1024),'utf-8'))

走棋规则

例如【马】

if qizi.str == "马":
    #马走日子,且不能有别马子
    if self.on_rizi_line(qizi.point, focus_point):
        #马走日子不能有别子
        if self.no_qizi_on_rizi(qizi.point, focus_point):
            chizi = self.qizi_on_point(focus_point)
            if chizi != None:
                if qizi.color != chizi.color:
                    chizi.dead()
                else:
                    return 0
            qizi.set_point(focus_point)
            return 1

例如【象】

if qizi.str == "象" or qizi.str == "相":
   #象走田字,且不能路径上不能有其它子
   if self.on_tianzi_line(qizi.point, focus_point):
       if self.no_qizi_on_tianzi(qizi.point, focus_point):
           chizi = self.qizi_on_point(focus_point)
           if chizi != None:
               if qizi.color != chizi.color:
                   chizi.dead()
               else:
                   return 0
           qizi.set_point(focus_point)
           return 1

这里的走棋规则其实就是基于逻辑的判断,理清逻辑,多测试,发现问题修复问题。

输赢判断

def check_win(self):
    red = 0;
    green = 0;
    for item in self.qizilist:
        if item.str == "帅" and item.is_alive():
            red = 1
        if item.str == "将" and item.is_alive():
            green = 1
    if red == 0:
        self.m_master.create_text(self.m_start_piexl.x + self.m_gap*4, self.m_start_piexl.y + self.m_gap*10, text="绿方赢")
        self.m_over = 1
    if green == 0:
        self.m_master.create_text(self.m_start_piexl.x + self.m_gap * 4, self.m_start_piexl.y + self.m_gap * 10, text="红方赢")
        self.m_over = 1

对战演示

对战演示

源码下载

https://github.com/shaozonglin1993/pyChess

### 使用 Python 实现局域网象棋游戏 #### 设计思路 为了创建一个基于局域网的象棋游戏,可以采用客户端-服务器架构。服务器负责管理连接并处理玩家之间的通信;而客户端则用于显示界面以及接收用户的输入。 #### 技术栈选择 对于网络编程部分可以选择 `socket` 库来建立TCP/IP连接[^1]。图形用户界面(GUI)方面可选用 `tkinter` 或者更高级别的框架如 PyQt 来构建应用窗口和交互组件[^2]。至于逻辑层面上,则需要定义好每一步操作的具体规则,并确保双方都能按照相同的规则执行动作。 #### 关键模块设计 1. **Socket 编程** - 创建服务端监听来自不同设备上的请求; - 接受新加入的游戏参与者并将他们配对成为对手; - 维护已连接客户的列表以便于消息传递。 2. **GUI 开发** - 构建美观易用的操作面板供玩家下子; - 显示当前轮次的信息提示框; - 提供退出按钮以结束会话或重新开始比赛。 3. **核心算法实现** - 定义合法走法验证函数; - 记录历史记录方便悔棋功能; - 判断胜负条件触发相应事件通知所有参与方。 以下是简化版的服务端代码片段: ```python import socket def start_server(): host = '0.0.0.0' port = 12345 server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) server_socket.bind((host, port)) server_socket.listen(2) print(f"Server started on {host}:{port}") while True: conn, addr = server_socket.accept() with conn: print('Connected by', addr) data = conn.recv(1024) if not data: break conn.sendall(data[::-1]) # 反转收到的数据作为回应发送回去 if __name__ == '__main__': start_server() ``` 以上是一个非常基础的例子,在实际开发过程中还需要考虑更多细节比如异常处理机制、并发控制等问题[^3]。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值