从0开始写中国象棋-创建棋盘与棋子

从控制台版本开始

考虑到象棋程序,其实就是数据结构与算法实现。

所以和界面相关的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},
        {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},
    };

棋盘上不同的整数表示不同的棋子在对应的位置。

上面是开局时的棋盘数组的样子。

棋子的表示

我们虽然在棋盘上用数字表示了棋子(棋子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;
}

输出如下:

评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

C++程序员Carea

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值