C++中国象棋 您所在的位置:网站首页 中国象棋吃子规则最新 C++中国象棋

C++中国象棋

2024-06-04 09:26| 来源: 网络整理| 查看: 265

ssdut c++的大作业,在控制台的界面实现人人对弈,比较适合初学,自己设计了一些简单算法,两百多行完成。

以下正文:

完成中国象棋游戏,实现如下功能:

1.实现人与人之间象棋的对弈。

2.每次走子之前都会判断是否符合规则,若不符合规则就要重新走子。

3.程序随时判断是否有一方取得胜利,该局结束。

类的设计:

1.chess:棋子类,有int型私有变量id存储棋子的编号。作为基类派生出其他具体的棋子类。有判断棋子走法是否符合规则的judge_move()纯虚函数。

代码:

class chess{ private: int id;//等级 public: chess(int i):id(i){} int get(){return id;} virtual bool judge_move(chessboard &cb,int startx,int starty,int aimx,int aimy)=0; virtual ~chess(){};//虚析构 };

2.具体的棋子类:包括soldier类、horse类、rook类、guard类、cannon类、elephant类、general类分别代表兵(卒)、馬(马)、車(车)、士(仕)、炮(砲)、相(象)、帅(将)的类,由chess类作为基类派生。每个派生类都对judge_move()函数进行重写。

以马为例:

class horse : public chess{//马的实现 public: horse(int i) : chess((i==0?-2:2)){} bool judge_move(chessboard &cb,int startx,int starty,int aimx,int aimy){ int tempx=aimx-startx,tempy=aimy-starty; int sid=cb.getid(startx, starty),aid=cb.getid(aimx, aimy); if(sid*aidget();return 0;} void show(); void play(); bool move(int startx,int starty,int aimx,int aimy); ~chessboard();//析构函数 static bool end;//判断结束 static int player; };

算法描述:

红方棋子:中文分别为"兵","馬","車","士","炮","相","帅"。

id的编号分别为-1、-2、-3、-4、-5、-6、-7。

黑方棋子:中文分别为"卒","马","车","仕","砲","象","将"。

id的编号分别为1、2、3、4、5、6、7。

(由于只显示一个汉子表示棋子,所以用“砲”作为红方的炮)

维护的变量:

startx starty: 开始的位置 ;  aimx  aimy:目标的位置。

sid:存储开始位置的棋子的编号,若该点没有棋子(空指针),则值为0。

aid:存储目标位置的棋子的编号,若该点没有棋子(空指针),则值为0。

tempx:开始位置到目标位置的x坐标的偏移量(aimx-startx)。

 

tempy:开始位置到目标位置的y坐标的偏移量(aimy-starty)。

 

 

走棋的实现:

 

每次把位置信息传到chessboard类的move()函数时,会判断:

1.传入的两个位置是否越界(超出了10*9数组的范围),越界则返回false。

2.传入的开始位置的点的id是否为零(当点上无棋子,也就是空指针的时候为零),若为零则返回false。

3.当前选的棋子是否是这一回对应那一方的棋子,若不是则返回false。

4.对当前棋子的具体规则进行判断(通过指针调用虚函数,判断该棋子的具体规则,多态的实现)。若错误则返回false。

若以上判断都准确无误,则把棋子走到对应位置:

1.不吃子:目标位置为空指针时,把目标位置的指针指向该棋子对象,把棋子的起始位置指针赋值NULL,设为空指针。

2. 吃子:delete目标位置的棋子对象,该棋子被吃。把目标位置的指针指向该棋子对象,把棋子的起始位置指针赋值NULL,设为空指针。

判断结束:

 

棋盘类有一个静态变量bool end, 初始化为true。当将(帅)对象被析构时,把end赋值为false,表示棋局结束,退出走棋的循环(while(chessboard :: end)控制走棋是否继续)。

输出胜利的一方的信息:

棋盘类有一个静态变量int player,初始化为-1,每走棋一次乘以-1,在1与-1之间交替表示棋手的轮流下棋。以此来鉴别胜利的是哪一方。

 

棋子具体的规则算法:

1.判断目标点是否是己方的棋:两方的子的id互为相反数,所以只有当sid*aid>0时表示目标位置是己方的子,不能走。因而只有满足sid*aid=3&&y=0&&aimx%7=0&&startx=0&&starty=0&&aimx=0&&aimy0 &&c[startx][starty]->judge_move(*this,startx,starty,aimx,aimy)){ if(c[aimx][aimy]!=NULL) delete c[aimx][aimy];//吃子 c[aimx][aimy]=c[startx][starty]; c[startx][starty]=NULL; player*=-1; return true; } cout



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有