从控制台版本开始
考虑到象棋程序,其实就是数据结构与算法实现。
所以和界面相关的QT部分我们先放一放。
我们从控制台版本开始。这样大家更容易接受,也不影响开发。
后面我们会把控制台嫁接到QT上完成完整的游戏,那时候自然就水到渠成了。
显示棋盘
中国象棋的棋盘是一个宽9列,长 5+5 = 10 行的一个长方形二维方格棋盘。
在控制台上显示一个棋盘是很容易的。
使用双重循环就可以打印出来了。
#include <iostream>
using namespace std;
int main(void)
{
for (int row = 0; row < 10; row++)
{
for (int col = 0; col < 9; col++)
{
cout << " _ ";//表示棋盘上的一个位置
}
cout << endl;
}
return 0;
}
程序输出如下:
棋盘显示棋子
我们希望将棋子显示在棋盘上。
和贪吃蛇一样,我们需要在内存内存中创建一个棋盘,棋盘上不同的内容代表不同的棋子。
就用整数表示棋子就行。
我们希望像下面这样存储棋盘:
vector<vector<int>> chess_board
{
{ 1, 2, 3, 4, 5, 6, 7, 8, 9},
{ 0, 0, 0, 0, 0, 0, 0, 0, 0},
{ 0,10, 0, 0, 0, 0, 0,11, 0},
{12, 0,13, 0,14, 0,15, 0,16},
{ 0, 0, 0, 0, 0, 0, 0, 0, 0},
{ 0, 0, 0, 0, 0, 0, 0, 0, 0},
{ 0, 0, 0, 0, 0, 0, 0, 0, 0},
{ 0, 0, 0, 0, 0, 0, 0, 0, 0},
{ 0, 0, 0, 0, 0, 0, 0, 0, 0},
{17,18,19,20,21,22,23,24,25},
};
棋盘上不同的整数表示不同的棋子在对应的位置。
上面是开局时的棋盘数组的样子。
棋子的表示
我们虽然在棋盘上用数字表示了棋子(棋子ID),但是显示给用户的时候,总不能让用户看数字下棋。
所以,我们打算用汉字显示棋子。
这样以来,和贪吃蛇类似,我们也需要一个棋子容器。这个容器接受棋子的ID作为索引,查询棋子的名字,用来显示在棋盘上。
这个容器我们就用数组vector表示,棋子的数组的下标对应棋子的ID,数组的内容对应棋子的名字。
vector<string> chess_man;
完整代码如下:
#include <iostream>
#include <string>
#include <vector>
#include <iomanip>
using namespace std;
struct chess_object
{
string name;//棋子要显示的名字
};
int main(void)
{
//棋盘数组,不同的数字表示不同的棋子,0表示没有棋子
vector<vector<int>> chess_board
{
{ 1, 2, 3, 4, 5, 6, 7, 8, 9},
{ 0, 0, 0, 0, 0, 0, 0, 0, 0},
{ 0,10, 0, 0, 0, 0, 0,11, 0},
{12, 0,13, 0,14, 0,15, 0,16},
{ 0, 0, 0, 0, 0, 0, 0, 0, 0},
{ 0, 0, 0, 0, 0, 0, 0, 0, 0},
{26, 0,27, 0,28, 0,29, 0,30},
{ 0,31, 0, 0, 0, 0, 0,32, 0},
{ 0, 0, 0, 0, 0, 0, 0, 0, 0},
{17,18,19,20,21,22,23,24,25},
};
vector<string> chess_man
{
"",//下标为0不用,编号从1开始
//上方黑方棋子
"车","马", "相", "士", "将", "士", "相", "马", "车",
"炮","炮",
"兵", "兵", "兵", "兵", "兵",
//下方红方棋子
"車", "馬", "象", "仕", "帥", "仕", "象", "馬", "車",
"卒", "卒", "卒", "卒", "卒",
"砲", "砲",
};
for (int row = 0; row < 10; row++)
{
for (int col = 0; col < 9; col++)
{
auto id = chess_board[row][col];
if (id != 0)
{
cout <<setw(5)<< chess_man[id] ;//输出一个棋子
}
else
{
cout<<setw(5) << "_";//表示棋盘上的一个位置
}
}
cout << endl;
cout << endl;
}
return 0;
}
输出如下: