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

这篇具有很好参考价值的文章主要介绍了从0开始写中国象棋-创建棋盘与棋子。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

从控制台版本开始

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

所以和界面相关的QT部分我们先放一放。

我们从控制台版本开始。这样大家更容易接受,也不影响开发。

后面我们会把控制台嫁接到QT上完成完整的游戏,那时候自然就水到渠成了。

显示棋盘

中国象棋的棋盘是一个宽9列,长 5+5 = 10 行的一个长方形二维方格棋盘。

从0开始写中国象棋-创建棋盘与棋子,Qt CMake C++ 中国象棋程序实现,c++,qt

在控制台上显示一个棋盘是很容易的。

使用双重循环就可以打印出来了。

#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;
}

程序输出如下:

 从0开始写中国象棋-创建棋盘与棋子,Qt CMake C++ 中国象棋程序实现,c++,qt

棋盘显示棋子 

我们希望将棋子显示在棋盘上。

和贪吃蛇一样,我们需要在内存内存中创建一个棋盘,棋盘上不同的内容代表不同的棋子。

就用整数表示棋子就行。

我们希望像下面这样存储棋盘

    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;
}

输出如下:

从0开始写中国象棋-创建棋盘与棋子,Qt CMake C++ 中国象棋程序实现,c++,qt文章来源地址https://www.toymoban.com/news/detail-730091.html

到了这里,关于从0开始写中国象棋-创建棋盘与棋子的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • FireMonkey3D之中国象棋程序(二)制定规则

    声明:本程序设计参考象棋巫师源码(开发工具dephi 11,建议用delphi 10.3以上版本)。 本章目标: 实现中国象棋规则 上一章我们设计了图形界面,可以开始轮流走棋了。但是,由于没有按中国象棋的规则进行限制,所有的棋子都可以在棋盘上随意走动,这章我们开始制定行棋

    2024年01月20日
    浏览(21)
  • FireMonkey3D之中国象棋程序(一)界面设计

    声明:本程序设计参考象棋巫师源码(开发工具dephi 11,建议用delphi 10.3以上版本)。 本章目标: 制作一个可操作的图形界面 第一步我们设计图形界面,显示初始化棋局。效果如下图:  我们先做个3D象棋子控件(请看我的博客关于FireMonkey3D的文章:万能控件Mesh详解),源码

    2024年01月20日
    浏览(30)
  • FireMonkey3D之中国象棋程序(三)初步搜索算法

    声明:本程序设计参考象棋巫师源码(开发工具dephi 11,建议用delphi 10.3以上版本)。 这一章计划初步实现搜索算法,前两章基本上按照我自己对中国象棋的理解来设计程序,从这章开始参照象棋巫师算法。 本章目标: 用子力位置价值表实现局面评价函数; 用超出边界(Fai

    2024年01月20日
    浏览(25)
  • FireMonkey3D之中国象棋程序设计(六)完善算法

    声明:本程序设计参考象棋巫师源码(开发工具dephi 11,建议用delphi 10.3以上版本)。 这一章主要完善算法。本章目标: 实现开局库; 实现PVS(主要变例搜索); 把根节点的搜索单独处理,增加搜索的随机性; 克服由长将引起的置换表的不稳定性。 6.1 实现开局库 开局库几乎

    2024年01月20日
    浏览(25)
  • FireMonkey3D之中国象棋程序设计(五)置换表

    声明:本程序设计参考象棋巫师源码(开发工具dephi 11,建议用delphi 10.3以上版本)。 这一章主要介绍置换表。本章目标: 实现置换表; 采用置换表走法、杀手走法等多种启发方式。 5.1  置换表 没有置换表,就称不上是完整的计算机博弈程序。在搜索过程中,某个搜索结果

    2024年01月20日
    浏览(25)
  • FireMonkey3D之中国象棋程序设计(四)水平效应、检查重复局面

    声明:本程序设计参考象棋巫师源码(开发工具dephi 11,建议用delphi 10.3以上版本)。 上一章我们的程序终于会走棋了,不过很多时候它很低能。由于水平线效应,任何变化都只搜索固定的深度。还有,有时它会长将。我们能做哪些改进呢? 本章的目标: 用Zobrist校验码技术

    2024年01月20日
    浏览(29)
  • AI人工智能(调包侠)速成之路十五(中国象棋AI网络机器人:AI模型部署)

    神经网络模型动态加解密的技术这个以后再写吧  书接上文: AI人工智能(调包侠)速成之路十四(中国象棋AI网络机器人:AI技术综合应用实现) 神经网络模型的存储格式         我们训练的神经网络就是一堆模拟神经元的参数集合,给(他/她/它)一个输入信息就会得到

    2024年01月23日
    浏览(36)
  • 从0实现基于Alpha zero的中国象棋AI(会分为多个博客,此处讲解蒙特卡洛树搜索)

    ​ 题主对于阿尔法狗的实现原理好奇,加上毕业在即,因此选择中国象棋版的阿尔法zero,阿尔法zero是阿尔法狗的升级版。在完成代码编写的历程中,深刻感受到深度学习环境的恶劣,网络上固然资料繁多,但要么水平不行,不知所云,要么国外课程,门槛过高。因而碰壁良

    2024年02月06日
    浏览(36)
  • Autojs 利用OpenCV识别棋子之天天象棋你马没了

    本例子通过代码像你介绍利用OpenCV实现霍尔找圆的方法定位棋子位置 通过autojs脚本实现自动点击棋子 开源地址 主要函数利用autojs提供的 findCircles函数 在图片中寻找圆(做霍夫圆变换)。找到时返回找到的所有圆{x,y,radius}的数组,找不到时返回null。 一个寻找圆的例子: 具体

    2024年02月08日
    浏览(26)
  • Leetcode 1812。判断国际象棋棋盘中一个格子的颜色

    给你一个坐标  coordinates  ,它是一个字符串,表示国际象棋棋盘中一个格子的坐标。下图是国际象棋棋盘示意图。 如果所给格子的颜色是白色,请你返回  true ,如果是黑色,请返回  false  。 给定坐标一定代表国际象棋棋盘上一个存在的格子。坐标第一个字符是字母,第

    2024年02月11日
    浏览(27)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包