中国象棋——C++编程设计(二)

[日期:2022-03-22] 作者:信息技术 次浏览 [字体: ]
    画出棋子后,便需要添加移动组件,其中最重要的是判断鼠标的按下,需要用MSOUEMSG类创建一个对象m,并且需要给m复制,代码如下:
MOSUEMSG m;
m=GetMouseMsg();
    并进行一个判断,当m.msg.uMsg==WM_LBUTTONDOWN时,开始对棋子进行操作具体内容较为复杂不便讲解。并且在象棋当中各个棋子的移动会受限,如:兵未过河,只能向前走,过河后左右也可走,但不能后退;马会被蹩脚;士、象不能过河;王不能出宫等等,这些都是需要添加限制组件的,通过一个函数进行判断是否可以将棋子下到玩家所指定的地方。
同时还涉及到玩家轮番走棋的问题,很明显一方不能连续走棋也不能放弃走棋。为了解决以上问题并提示当前回合该谁走棋,我还在棋盘右侧设置了一个消息提示框,用来提示该谁下棋。如下图:
 
    最后就是游戏输赢的判断。判断输赢是通过两个二维数组进行判断,将将和帅的坐标输入数组,帅为1,将为2,并不断地通过循环查找数组之中是否有1和2,当1不见或2不见是,便会弹出游戏结束的消息框,不过本次设计未实现两王相见,游戏结束的判断。
本软件还有更多细节值得发现,这儿便不一一介绍了。
这便是我本次的C++程序设计,耗时5天。完整代码共500多行达12页,在此不便展示,部分核心代码如下:

#include<iostream>

#include<graphics.h>
using namespace std;
class CKind {
public:
WCHAR ROOKS = *(_T("车"));
WCHAR KNIGHTS = *_T("马");
WCHAR ELEPHANTS = *_T("象");
WCHAR MINISTERS = *_T("相");
WCHAR MANDARINS = *_T("士");
WCHAR GUARDS = *_T("仕");
WCHAR KING = *_T("将");
WCHAR GENERALS = *_T("帅");
WCHAR CANNONS = *_T("炮");
WCHAR PAWNS = *_T("卒");
WCHAR SOLDIERS = *_T("兵");
WCHAR PLAYER_1 = *_T("BLACK");
WCHAR PLAYER_2 = *_T("RED");
};
//开始游戏
void startGame()
{
initPaneGrid();
CreateMap();
repaint();
messagewhile();
closegraph();
}
//初始化棋盘格
void initPaneGrid()
{
for (int i = 0; i < 9; i++)
{
for (int j = 0; j < 10; j++)
{
grid[i][j] = NULL;
}
}
//棋盘格索引转化为真实坐标
pair<int, int>compute_xy(int i, int j)
{
pair<int, int>p((j + 1) * PERLENGTH, (i + 1) * PERLENGTH);
return p;
}
//兵的限制
else if (name == ckind.SOLDIERS)
{
if ((row - _row) * (row - _row) + (col - _col) * (col - _col) != 1)return false;
else if (row > 4)
{
if (_row >= row)
return false;
}
else if (row <= 4)
{
if (_row > row)
return false;
}
}
return true;
}
};
void main()
{
initgraph(800, 800, NOCLOSE);
setbkcolor(WHITE);
cleardevice();
closegraph();
PaneBoard paneBoard;
paneBoard.startGame();
system("pause");
}//开发环境::VS2022