C++实现双人中国象棋(一)

您所在的位置:网站首页 html象棋游戏小程序界面设计 C++实现双人中国象棋(一)

C++实现双人中国象棋(一)

2024-07-10 06:48| 来源: 网络整理| 查看: 265

一、简介

最近突发奇想,要使用C++做一个双人象棋的程序,昨天肝了一天,终于把算法部分完成了,下面把开发过程中的经验分享一下。

开发环境:Visual Studio 2019 语言标准:C++11及以上 纠错:暂无

二、准备工作

知识要求:

熟练掌握C++语言面向对象编程的知识(继承,多态)

掌握STL的基本操作

了解中国象棋基本规则(不会还有人不知道中国象棋规则吧!) 既然都知道了,下面说一个大家可能没注意过的点:

象棋棋盘尺寸为9×10,9列10行

象棋摆法 象棋摆法

三、程序框架

由于这是双人象棋,所以算法主要就是判断胜负(容易实现)和判断棋子能否走到某个地方(难点)。这篇博客主要就介绍这两个问题。

程序主要由以下几个类组成:

Point 记录棋盘中的一个坐标,并且附带基本功能,如判断在红方区域还是黑方区域,是否在九宫格中等。ChessBoard 棋盘类,管理所有棋子。ChessPiece 所有棋子的基类,也是一个抽象类。七种棋子分别对应的七个类 都是ChessPiece的子类。ChessGame象棋游戏类,管理先后手、胜负等。 关于棋子的存储

关于棋子的存储,有两种方式,一是把红黑双方棋子分别存储到两个容器中,优点是便于知道一方还有哪些棋子,但知道坐标查找棋子则很困难。 还有一种方法,是用一个10×9的数组(0-4红方区域,5-9黑方区域,这一点很重要),分别存储每个棋子或空(nullptr),优点是知道坐标便于查找棋子,但知道一方还有哪些棋子则很困难。 为了方便,我们把这两种方法综合起来,既分别存储双方棋子,又存储棋盘状态。

四、代码实现

以下代码均在Chess.h中。

一些常量的声明 const bool BLACK = 0, RED = 1; const uint8_t NONE = 2; Point

最简单的一个类,无脑写就行。

class Point { public: int8_t x, y; Point(int8_t nx, int8_t ny) :x(nx), y(ny) {} bool ColorOfTheArea()const//判断在红方区域还是黑方区域 { if (y = 3 && x 移到指定位置->吃掉原有棋子(如果有),所以这个函数没必要是虚函数,直接按照流程来即可。注意,在非虚函数中调用虚函数是可行且有效的。

在开始下面的之前,我先说一下,为了查找各个中国象棋棋子的英文名称,我焦头烂额地百度了大半天,才找到一个比较靠谱的。下面的英文名称就是按照这个来的。

車(Rook)

車車大概是象棋中最厉害的棋子,所以很多新手都喜欢用,并且流传下了“新手玩车,熟手玩炮,老手玩马”的谚语(这么看我是熟手😂)。下面我们就先来实现車。

class Rook :public ChessPiece//車 { public: Rook(const Point& point, bool color, ChessBoard& chessboard) :ChessPiece(point, color, chessboard) {} virtual bool CanMoveTo(const Point& point)const override { if (board.GetChess(point) == nullptr || board.GetChess(point)->cl != this->cl)//目的地没有棋子或有对方棋子 { if (point.x == pt.x) { if (point.y


【本文地址】


今日新闻


推荐新闻


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