#include "chess.h"
/*由多个棋子容器组成的虚拟棋盘 10(row)*9(col)*/
static ChessPiecesStr CheckerBoard[10][9];
/*当前游戏操作者*/
static char CurOperator;
/*胜利者*/
static char Winner;
/***********************************
0 1 2 3 4 5 6 7 8
** * * * * * * * * *
0 *車 馬 象 士 将 士 象 馬 車*
1 *0 0 0 0 0 0 0 0 0 *
2 *0 炮 0 0 0 0 0 炮 0 *
3 *卒 0 卒 0 卒 0 卒 0 卒*
4 *0 0 0 0 0 0 0 0 0 *
楚河 汉届
5 *0 0 0 0 0 0 0 0 0 *
6 *兵 0 兵 0 兵 0 兵 0 兵*
7 *0 砲 0 0 0 0 0 砲 0 *
8 *0 0 0 0 0 0 0 0 0 *
9 *車 馬 相 仕 帥 仕 相 馬 車*
*************************************/
void InitCheckerBoard(void){//初始化棋盘,根据上图在棋盘上摆好棋子
int i,j;
/*清零*/
memset(CheckerBoard,0,sizeof(ChessPiecesStr)*9*10);
/*将方*/
CheckerBoard[0][0].Class=Cn_JU;
CheckerBoard[0][1].Class=Cn_MA;
CheckerBoard[0][2].Class=Cn_XIANG;
CheckerBoard[0][3].Class=Cn_SHI;
CheckerBoard[0][4].Class=Cn_JIANG;
CheckerBoard[0][5].Class=Cn_SHI;
CheckerBoard[0][6].Class=Cn_XIANG;
CheckerBoard[0][7].Class=Cn_MA;
CheckerBoard[0][8].Class=Cn_JU;
CheckerBoard[2][1].Class=Cn_PAO;
CheckerBoard[2][7].Class=Cn_PAO;
CheckerBoard[3][0].Class=Cn_BING;
CheckerBoard[3][2].Class=Cn_BING;
CheckerBoard[3][4].Class=Cn_BING;
CheckerBoard[3][6].Class=Cn_BING;
CheckerBoard[3][8].Class=Cn_BING;
/*上方配置颜色*/
for(i = 0;i < 5 ;i++){
for(j = 0;j < 9; j++){
CheckerBoard[i][j].Colour = Cc_BLACK;
}
}
/*帥方*/
CheckerBoard[9][0].Class=Cn_JU;
CheckerBoard[9][1].Class=Cn_MA;
CheckerBoard[9][2].Class=Cn_XIANG;
CheckerBoard[9][3].Class=Cn_SHI;
CheckerBoard[9][4].Class=Cn_JIANG;
CheckerBoard[9][5].Class=Cn_SHI;
CheckerBoard[9][6].Class=Cn_XIANG;
CheckerBoard[9][7].Class=Cn_MA;
CheckerBoard[9][8].Class=Cn_JU;
CheckerBoard[7][1].Class=Cn_PAO;
CheckerBoard[7][7].Class=Cn_PAO;
CheckerBoard[6][0].Class=Cn_BING;
CheckerBoard[6][2].Class=Cn_BING;
CheckerBoard[6][4].Class=Cn_BING;
CheckerBoard[6][6].Class=Cn_BING;
CheckerBoard[6][8].Class=Cn_BING;
/*下方配置颜色*/
for(i = 5;i < 10 ;i++){
for(j = 0;j < 9; j++){
CheckerBoard[i][j].Colour = Cc_RED;
}
}
/*复位队列(用于悔棋功能)*/
ResetStack();
/*默认黑棋先走*/
CurOperator = Cc_BLACK;
Winner = Cc_NULL;
}
ChessPiecesStr* FindChess(uchar row,uchar col) //通过位置找到棋子,该位置没有棋子就返回NULL
{
if(CheckerBoard[row][col].Class == 0){
return NULL;
}else{
return &CheckerBoard[row][col];
}
}
char getCurOperator(void)//查询当前操作方颜色
{
return CurOperator;
}
char getWinner(void)//查询胜利者
{
return Winner;
}
bool MovemenRules_BING(PickUpChessStruct* pActiveChess,uchar row,uchar col)//【兵】走棋规则
{
//【兵】走棋规则:每次只能走一格,且黑色方不能往上走,红色方不能往下走,过了河才能左右走
//穷举法: 要么过了河往左一步,要么过了河往右一步,要么黑棋往下走一步,要么红棋往上走一步,剩下都是不符合规则的return false
int flag = 0;
//判断是否过河
if(pActiveChess->ChPs.Colour == Cc_BLACK){
//黑棋
if(row > 4){
flag = 1;
}
}else{
//红棋
if(row < 5){
flag = 1;
}
}
//flag = 1代表过河了,才能往右或往左
if((pActiveChess->row == row)&&(pActiveChess->col+1 ==col)&&flag){//往右
return true;
}
if((pActiveChess->row == row)&&((pActiveChess->col-1) == col)&&flag) { //往左
return true;
}
if(pActiveChess->ChPs.Colour == Cc_BLACK){//黑棋
if((pActiveChess->col == col)&&((pActiveChess->row+1) == row)) { //黑棋往下
return true;
}
}else{//红棋
if((pActiveChess->col == col)&&((pActiveChess->row-1) == row)) { //红棋往上
return true;
}
}
return false;
}
bool MovemenRules_PAO(PickUpChessStruct* pActiveChess,uchar row,uchar col)//【炮】走棋规则
{
int i,col_min,col_max,row_min,row_max;
//【炮】走棋规则:走直线,不能跨越棋子
//穷举法+假设法 要么横着走,要么竖着走,其他都是违规;假设成功了,那么起点到终点之间不能有其他棋子
if(pActiveChess->row == row){//横着走
if(pActiveChess->col > col){
col_min = col;
col_max = pActiveChess->col;
}else{
col_min = pActiveChess->col;
col_max = col;
}
for(i = col_min+1;i < col_max; i++ ){
if(CheckerBoard[row][i].Class != 0) return false;//假设不成立
}
return true;//假设成立
}else if(pActiveChess->col == col){//竖着走
if(pActiveChess->row > row){
row_min = row;
row_max = pActiveChess->row;
}else{
row_min = pActiveChess->row;
row_max = row;
}
for(i = row_min+1;i < row_max; i++ ){
if(CheckerBoard[i][col].Class != 0) return false;//假设不成立
}
return true;//假设成立
}else{
return false;
}
}
bool EatRules_PAO(PickUpChessStruct* pActiveChess,uchar row,uchar col)//【炮】吃棋规则
{
int i,col_min,col_max,row_min,row_max,count = 0;
//【炮】吃棋规则: 跟被吃棋子在同一直线上,且两者之间有且仅有一个炮台棋子
//穷举法+假设法 要么横着吃,要么竖着吃,其他吃不到。 假设成功了,起点和终点之间有且仅有一个棋子
if(pActiveChess->row == row){//横着吃
if(pActiveChess->col > col){
//往右吃
col_min = col;
col_max = pActiveChess->col;
}else{
//往左吃
col_min = pActiveChess->col;
col_max = col;
}
for(i = col_min+1;i < col_max; i++ ){
if(CheckerBoard[pActiveChess->row][i].Class != 0) count++;//计算起点与终点之间的棋子数
}
}else if(pActiveChess->col == col){//竖着吃
if(pActiveChess->row > row){
//往上吃
row_min = row;
row_max = pActiveChess->row;
}else{
//往下吃
row_min = pActiveChess->row;
row_max = row;
}
for(i = row_min+1;i < row_max; i++ ){
if(CheckerBoard[i][col].Class != 0) count++;//计算起点与终点之间棋子数
}
}
if(count == 1){
return true;
}else{
return false;
}
}
bool MovemenRules_JU(PickUpChessStruct* pActiveChess,uchar row,uchar col)//【車】走棋规则
{
//【車】走棋规则:走直线,不能跨越棋子(发现前面的炮一样,那就不重复写了...偷懒一下)
return MovemenRules_PAO(pActiveChess,row,col);
}
bool MovemenRules_MA(PickUpChessStruct* pActiveChess,uchar row,uchar col)//【马】走棋规则
{
//【马】走棋规则:马行"日"
//起点和终点形成对角所在的矩形的面积,也就是”日“的面积永远是1*2=2.反之证明了起点和终点在形成”日“的对角。
if(abs(pActiveChess->row-row)*abs(pActiveChess->col-col) != 2){//abs函数在头文件math.h里面,作用是求两个数差的绝对值
return false;
}
//判断走得是”日“形之后,再判断“马脚”是都被棋子挡住
//a、b、c、d位置会挡
C语言实现中国象棋(Qt实现界面,源码下载,详细注释,易移植)
需积分: 49 89 浏览量
2020-06-07
18:28:46
上传
评论 3
收藏 80KB ZIP 举报
脆弱的代码
- 粉丝: 669
- 资源: 15
最新资源
- delphi实现DBGrid全选和反选功能
- 25C11F41-2B2A-4D1A-AAA8-7C654526B129.pdf
- Android Studio Jellyfish(android-studio-2023.3.1.18-cros.deb)
- MVC+EF框架+EasyUI实现权限管理源码程序
- python第66-75天,Day66-75.rar
- python后端服务project-of-tornado.rar
- python测验,hello-tornado.rar
- 基于SpringBoot+Vue3快速开发平台、自研工作流引擎源码设计.zip
- docker安装部署全流程
- 基于树莓派的人脸识别系统python源码+项目部署说明+超详细代码注释.zip
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈