基于TCP的网络对战象棋

您所在的位置:网站首页 中国象棋大佬 基于TCP的网络对战象棋

基于TCP的网络对战象棋

2024-07-14 15:49| 来源: 网络整理| 查看: 265

在这里插入图片描述

文章目录 象棋百科设计目标绘制棋盘网络模块走棋规则输赢判断对战演示源码下载

象棋百科

中国象棋是起源于中国的一种棋,属于二人对抗性游戏的一种,在中国有着悠久的历史。由于用具简单,趣味性强,成为流行极为广泛的棋艺活动。 中国象棋是中国棋文化,也是中华民族的文化瑰宝,它源远流长,趣味浓厚,基本规则简明易懂。中国象棋在中国的群众中基础远远超过围棋,是普及最广的棋类项目,中国象棋已流传到十几个国家和地区。 中国象棋使用方形格状棋盘,圆形棋子共有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



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3