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

news2024/11/24 17:01:27

从控制台版本开始

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

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

输出如下:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1043307.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

GPT4科研实践技术与AI绘图

GPT对于每个科研人员已经成为不可或缺的辅助工具&#xff0c;不同的研究领域和项目具有不同的需求。如在科研编程、绘图领域&#xff1a;1、编程建议和示例代码: 无论你使用的编程语言是Python、R、MATLAB还是其他语言&#xff0c;都可以为你提供相关的代码示例。2、数据可视化…

【计算机网络】IP协议(上)

文章目录 TCP与 IP之间的关系IP地址的认识协议报头格式1. 报头和有效载荷如何分离&#xff1f;2. 8位协议3. 4位版本4. 8位服务类型5. 16位总长度6. 8位生存时间 TTL 网段划分IP地址的划分 子网划分CIDR的提出如何理解CIDR TCP与 IP之间的关系 如&#xff1a;假设 你上高中时&…

RK3568平台开发系列讲解(工具命令篇)MobaXterm 软件安装及使用

&#x1f680;返回专栏总目录 文章目录 一、MobaXterm 软件下载二、MobaXterm 软件安装三、MobaXterm 软件使用3.2、ssh 连接 沉淀、分享、成长&#xff0c;让自己和他人都能有所收获&#xff01;&#x1f604; 一、MobaXterm 软件下载 MobaXterm 是一款多功能远程终端软件&…

Linux学习第20天:Linux按键输入驱动开发: 大道至简 量入为出

Linux版本号4.1.15 芯片I.MX6ULL 大叔学Linux 品人间百味 思文短情长 中国文化博大精深&#xff0c;太极八卦&#xff0c;阴阳交合&#xff0c;变化无穷。在程序的开发中也是这样&#xff0c;数字0和1也是同样的道理。就本节来说&am…

基于SpringBoot的教师工作量管理系统

目录 前言 一、技术栈 二、系统功能介绍 管理员模块的实现 教师模块的实现 三、核心代码 1、登录模块 2、文件上传模块 3、代码封装 前言 随着信息技术在管理上越来越深入而广泛的应用&#xff0c;管理信息系统的实施在技术上已逐步成熟。本文介绍了教师工作量管理系统…

RIP路由

目录 RIP路由 1、什么是RIP路由 2、RIP的工作原理是什么 3、RIP v1 和 RIP v2的区别 4、RIP的常用场景 5、RIP的通信流程 6、RIP的优缺点 优点&#xff1a; 缺点&#xff1a; 7、扩展部分 1.RIP路由的作用与应用场景 2.与其他路由协议的区别 3.RIP路由协议的工作原…

Tensorflow Federated Framework 谷歌联邦学习框架

目录 Tensorflow Federated Framework 谷歌联邦学习框架 1、TensorFlow Federated Framework 数据为主 整体训练 新的语言 Federated Learning (FL) API 安装TFF库&#xff08;conda&#xff09; 2、数据类型 3、完整代码 Tensorflow Federated Framework 谷歌联邦学习…

TS流分析

TS流分析 一 从TS流开始 数字电视机顶盒接收到的是一段段的码流&#xff0c;我们称之为TS&#xff08;Transport Stream&#xff0c;传输流&#xff09;&#xff0c;每个TS流都携带一些信息&#xff0c;如Video、Audio以及我们需要学习的PAT、PMT等信息。因此&#xff0c;我们首…

http基础教程(超详细)

HTTP HTTP 一 、基础概念 请求和响应报文URL 二、HTTP 方法 GETHEADPOSTPUTPATCHDELETEOPTIONSCONNECTTRACE 三、HTTP 状态码 1XX 信息2XX 成功3XX 重定向4XX 客户端错误5XX 服务器错误 四、HTTP 首部 通用首部字段请求首部字段响应首部字段实体首部字段 五、具体应用 连接管理…

电子器件系列53:D型触发器

D触发器是一个具有记忆功能的&#xff0c;具有两个稳定状态的信息存储器件&#xff0c;是构成多种时序电路的最基本逻辑单元&#xff0c;也是数字逻辑电路中一种重要的单元电路。 因此&#xff0c;D触发器在数字系统和计算机中有着广泛的应用。触发器具有两个稳定状态&#xf…

idea中导入eclipse项目后没显示src文件

因为没有导入modules 选择import module 选择整个项目 选择eclipse 一直下一步就行 这样就出来了

消息中间件相关知识

1、概述 消息队列已经逐渐成为企业IT系统内部通信的核心手段。它具有低耦合、可靠投递、广播、流量控制、最终一致性等一系列功能&#xff0c;成为异步RPC的主要手段之一。当今市面上有很多主流的消息中间件&#xff0c;如老牌的ActiveMQ、RabbitMQ&#xff0c;炙手可热的Kafka…

webp格式及其转成

"WebP" 是一种现代的图像压缩格式&#xff0c;由谷歌公司开发。它旨在提供高质量的图像压缩&#xff0c;同时减小图像文件的大小&#xff0c;从而加快网络加载速度。WebP 格式通常使用 ".webp" 扩展名来标识。 WebP 图像格式主要有以下几个特点和优点&…

热烈祝贺埃文科技代码特工队斩获2023黄河鲲鹏开发者大赛河南赛区创新赛道二等奖

2023年9月19日&#xff0c;由河南省教育厅、黄河科技集团有限公司、华为技术有限公司联合主办&#xff0c;郑州中原科技城管理委员会、中原鲲鹏生态创新中心联合承办的2023黄河鲲鹏开发者大赛河南区域决赛圆满落幕。 决赛中&#xff0c;来自企业和高校的121支团队&#xff0c;…

Uniboot 系列光纤跳线简介

飞速&#xff08;FS&#xff09;Uniboot 系列光纤跳线产品质量可靠&#xff0c;性能优良&#xff0c;可满足数据中心的各种需求。其中&#xff0c;包括LC、CS™、MDC 和 SN 在内的不同类型的连接器能够满足不同应用的特定需求。下面将进一步介绍飞速&#xff08;FS&#xff09;…

大数据Flink(九十):Lookup Join(维表 Join)

文章目录 Lookup Join(维表 Join) Lookup Join(维表 Join) Lookup Join 定义(支持 Batch\Streaming):Lookup Join 其实就是维表 Join,比如拿离线数仓来说,常常会有用户画像,设备画像等数据,而对应到实时数仓场景中,这种实时获取外部缓存的 Join 就叫做维表 Join。…

分享从零开始学习网络设备配置--任务3.8 使用动态路由OSPF实现网络连通

任务描述 某公司随着规模的不断扩大&#xff0c;路由器的数量在原有的基础上有所增加。网络管理员发现原有的路由协议已经不适合现有的网络环境&#xff0c;可实施动态路由OSPF协议配置&#xff0c;实现网络中所有主机之间互相通信。因为动态路由OSPF协议可以实现快速收敛&…

echo cat find grep命令

目录 cat echo grep find cat cat命令可以理解为英文单词concatenate的缩写&#xff0c;其功能是连接多个文件并且打印到屏幕输出&#xff0c;或者重定向到指定文件中。此命令常用于显示单个文件内容&#xff0c;或者将几个文件内容连接起来一起显示&#xff0c;还可以从标…

c++-string

文章目录 前言一、STL库介绍二、标准库中的string类1、string类介绍2、string类使用3.1 string类的构造函数3.2 string类对象的容量操作3.3 string类对象的遍历操作3.4 string类对象的访问操作3.5 string类对象的修改操作3.6 string类对象的字符串操作 三、模拟实现string类四、…

多线程(pthread库)

POSIX线程库 引言 前面我们提到了Linux中并无真正意义上的线程 从OS角度来看&#xff0c;这意味着它并不会提供直接创建线程的系统调用&#xff0c;它最多给我们提供创建轻量级进程LWP的接口 但是从用户的角度来看&#xff0c;用户只认识线程啊&#xff01; 因此&#xff0c;…