返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C++怎么实现中国象棋
  • 851
分享到

C++怎么实现中国象棋

2023-06-25 16:06:27 851人浏览 安东尼
摘要

这篇文章主要介绍“c++怎么实现中国象棋”,在日常操作中,相信很多人在C++怎么实现中国象棋问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C++怎么实现中国象棋”的疑惑有所帮助!接下来,请跟着小编一起来学习吧

这篇文章主要介绍“c++怎么实现中国象棋”,在日常操作中,相信很多人在C++怎么实现中国象棋问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C++怎么实现中国象棋”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

enum Pieces //棋子{NONE = -1,車, 馬, 象, 士, 将, 砲, 卒,俥, 马, 相, 仕, 帥, 炮, 兵,BEGIN, END,};//给id赋值enum Pieces redChess[] = { 車, 馬, 象, 士, 将, 砲, 卒 };enum Pieces blackChess[] = { 俥, 马, 相, 仕, 帥, 炮, 兵 };//绘制时转化成字符串const char* ChessName[] = { "車","馬","象","士","将","砲","卒","俥", "马", "相", "仕", "帥", "炮", "兵" };

接下来出场的是我们的老朋友结构体

//每一个棋子的属性struct Chess{enum Pieces id;//棋子名称DWord type;//棋子类型,红?黑?short x;short y;bool  isRiver;//是否过了河}; //游戏地图struct Chess map[ROW][COL]; struct State{int begr;int beGC;int endr;int endc;int state;}state = {-1,-1,-1,-1,BEGIN};

我们的初始化函数,一定要想好其中的逻辑

//初始化数据void init(){//遍历地图for (size_t i = 0; i < ROW; i++){size_t temp = 0;for (size_t k = 0; k < COL; k++){map[i][k].id = NONE;//先把棋子置为没有if (i <= 4)//黑棋子{map[i][k].type = BLACK;if (i == 0)//放置第一行的棋子{//0 1 2 3 4if (k <= 4){temp = k;}// 3 2 1 0else{// k == 5temp = 4 - (k - 4);}map[i][k].id = blackChess[temp];}//设置炮if (i == 2 && (k == 1 || k == 7)){map[i][k].id = blackChess[5];}//设置兵if (i == 3 && k % 2 == 0){map[i][k].id = blackChess[6];}}else       //红棋{map[i][k].type = RED;if (i == 9)//放置第一行的棋子{//0 1 2 3 4if (k <= 4){temp = k;}// 3 2 1 0else{// k == 5temp = 4 - (k - 4);}map[i][k].id = redChess[temp];}//设置炮if (i == 7 && (k == 1 || k == 7)){map[i][k].id = redChess[5];}//设置兵if (i == 6 && k % 2 == 0){map[i][k].id = redChess[6];}}map[i][k].isRiver = false;map[i][k].x = k * GRID_SIZE + INTERVAL;map[i][k].y = i * GRID_SIZE + INTERVAL;}}}

接下来是我们的绘制函数

//绘制void draw(){setfillcolor(RGB(252, 215, 162));setlinestyle(PS_SOLID, 2);//设置文字的样式settextstyle(30, 0, "楷体");for (size_t i = 0; i < ROW; i++){for (size_t k = 0; k < COL; k++){if (map[i][k].id == NONE)continue;settextcolor(map[i][k].type);setlinecolor(map[i][k].type);//绘制棋子fillcircle(map[i][k].x, map[i][k].y, 30);fillcircle(map[i][k].x, map[i][k].y, 25);outtextxy(map[i][k].x - 15, map[i][k].y - 15, ChessName[map[i][k].id]);}}}

后面是我们的重点,鼠标控制函数,以后类似的游戏项目都会有这样的函数,好好理解

//鼠标操作void mouseEvent(){ExMessage msg;//定义消息结构体变量if(peekmessage(&msg, EM_MOUSE)){if (msg.message == WM_LBUTTONDOWN)//鼠标左键按下{//通过鼠标坐标得出点击的数组的下标//k * GRID_SIZE + INTERVAL = x;int col = (msg.x - INTERVAL) / GRID_SIZE;int row = (msg.y - INTERVAL) / GRID_SIZE; //下标校准if (msg.x > map[row][col].x + 30 && msg.y < map[row][col].y + 30){col++;}if (msg.x < map[row][col].x + 30 && msg.y > map[row][col].y + 30){row++;}if (msg.x > map[row][col].x + 30 && msg.y > map[row][col].y + 30){row++;col++;}//printf("(%d %d)\n", row, col); if (state.state == BEGIN){state.begr = row;state.begc = col;state.state = END;}else if (state.state == END){state.endr = row;state.endc = col;state.state = BEGIN;}cheSSMove();}}}

重点中的重点,棋子的移动函数,游戏的规则也就在这里体现出来

//移动棋子void chessMove(){printf("beg(%d %d) end(%d %d)\n", state.begr, state.begc, state.endr, state.endc);bool canMove = false;//什么情况下能够移动棋子if (!(state.begr == state.endr && state.begc == state.endc) &&//点击的不是同一个棋子state.endr!=-1 && state.begr!=-1&&//下标必须合法map[state.begr][state.begc].id != NONE//没有棋子不能移动)//不能自己吃自己{ switch (map[state.begr][state.begc].id){case 車:case 俥:if (state.begr == state.endr || state.begc == state.endc){//起始点和结束点之间是否有阻碍if (hasBlock(&state)){canMove = true;}}break;case 馬:case 马:break;case 象:case 相:break;case 士:case 仕:break;case 将:case 帥:break;case 砲:case 炮:break;case 卒:case 兵:break;default:break;}if (canMove){printf("canMove\n");map[state.endr][state.endc].id = map[state.begr][state.begc].id;map[state.begr][state.begc].id = NONE; map[state.endr][state.endc].isRiver = map[state.begr][state.begc].isRiver;map[state.endr][state.endc].type = map[state.begr][state.begc].type;}}}

最后就是我们的主函数,进行调用,让项目运行起来

int main(){//创建图形窗口initgraph(740, 820,EW_SHOWCONSOLE);//设置背景模式setbkmode(TRANSPARENT);//贴棋盘IMAGE img_board;loadimage(&img_board, "./res/ChessBoard.png"); init();//双缓冲绘图,防止闪屏BeginBatchDraw();while (true){cleardevice();putimage(0, 0, &img_board);draw();mouseEvent(); FlushBatchDraw();}EndBatchDraw();  getchar();return 0;}

到此,关于“C++怎么实现中国象棋”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注编程网网站,小编会继续努力为大家带来更多实用的文章!

--结束END--

本文标题: C++怎么实现中国象棋

本文链接: https://lsjlt.com/news/305985.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • C++怎么实现中国象棋
    这篇文章主要介绍“C++怎么实现中国象棋”,在日常操作中,相信很多人在C++怎么实现中国象棋问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C++怎么实现中国象棋”的疑惑有所帮助!接下来,请跟着小编一起来学习吧...
    99+
    2023-06-25
  • C语言实现中国象棋
    本文实例为大家分享了C语言实现中国象棋的具体代码,供大家参考,具体内容如下 运行截图 实现思路 老套路,二维数组存储棋盘,宏定义各种棋子,每次棋子的移动实质为二维数组的赋值。重点是...
    99+
    2024-04-02
  • C++ 中国象棋的实现流程详解
    中国象棋的中国棋文化,也是中华民族的文化瑰宝,它源远流长,趣味浓厚,基本规则简明易懂。中国象棋在中国的群众中基础远远超过围棋,是普及最广的棋类项目,中国象棋已流传到十几个国家和地区...
    99+
    2024-04-02
  • 怎么用Java实现中国象棋游戏
    本篇内容介绍了“怎么用Java实现中国象棋游戏”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一、界面下棋的棋盘首先要准备好,这就是一个合适大...
    99+
    2023-06-30
  • java实现简单中国象棋
    本文实例为大家分享了java实现简单中国象棋的具体代码,供大家参考,具体内容如下 可以实现简单的人机对战功能,棋子移动会插入关键帧,可以悔棋等功能 运行效果 代码 import j...
    99+
    2024-04-02
  • Java实现中国象棋游戏
    目录一、界面二、按钮三、加棋子四、实现棋子的移动五、判断胜负六、按钮“开始游戏”和“重新开始”的实现七、加规则八、轮次九、悔棋十、背景...
    99+
    2024-04-02
  • js实现中国象棋游戏
    本文实例为大家分享了js实现中国象棋游戏的具体代码,供大家参考,具体内容如下 使用table元素作表格,div元素作象棋。 效果如下: 代码如下: <html> <...
    99+
    2024-04-02
  • Java+Swing实现中国象棋游戏
    目录一、系统介绍1.开发环境2.技术选型3.系统功能二、系统展示三、部分代码一、系统介绍 1.开发环境 开发工具:Eclipse2021 JDK版本:jdk1.8 Mysql版本:8...
    99+
    2024-04-02
  • 基于HTML+JavaScript实现中国象棋
    目录效果展示项目基本结构HTML 代码CSS 代码JS 代码人工智能初始化迭代加深搜索算法取得棋盘上所有棋子取得棋谱所有己方棋子的算法A:当前棋手value/B:对手value/de...
    99+
    2022-11-13
    JavaScript中国象棋 JavaScript 象棋
  • 基于c++的中国象棋游戏设计与实现
    目录1.文档2.游戏操作逻辑3.UI框架4.网络通信1.文档 文档分为两部分,一部分在代码中,然后通过doxygen生成HTML。解压本目录下的html.zip后打开index.ht...
    99+
    2024-04-02
  • Python实现人机中国象棋游戏
    目录导语1.游戏规则&基本玩法1.1 基本玩法1.2 行棋规则2.素材文件3.主要代码3.1 Chinachess.py 为主文件3.2 Constants.py 数据常量3...
    99+
    2024-04-02
  • java如何实现简单中国象棋
    这篇文章主要讲解了“java如何实现简单中国象棋”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“java如何实现简单中国象棋”吧!运行效果代码import java.awt.Canv...
    99+
    2023-06-30
  • 怎么在shell中打印国际象棋棋盘
    这篇文章将为大家详细讲解有关怎么在shell中打印国际象棋棋盘,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。代码如下:#!/bin/bash#set chess cell...
    99+
    2023-06-09
  • Android实现中国象棋附源码下载
    象棋,很多人多接触过,学者写了一个,大神可以指点一下~直接上代码: 贴出主要代码,想要Demo的点击下载:中国象棋Demo package wyf.ytl; import...
    99+
    2022-06-06
    源码下载 中国象棋 源码 Android
  • Java实现中国象棋的示例代码
    目录前言主要设计功能截图代码实现总结前言 中国象棋是起源于中国的一种棋,属于二人对抗性游戏的一种,在中国有着悠久的历史。由于用具简单,趣味性强,成为流行极为广泛的棋艺活动。 中国象棋...
    99+
    2024-04-02
  • Linux中Shell编程怎么绘制国际象棋棋盘
    小编给大家分享一下Linux中Shell编程怎么绘制国际象棋棋盘,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!先来看看国际象棋棋盘长啥样:仔细想了会棋盘的分布规则...
    99+
    2023-06-09
  • Python pygame实现中国象棋单机版源码
    Python中国象棋单机版 鼠标点击操作;两天制作,较为粗糙,很多效果还未实现。 # -*- coding: utf-8 -*- """ Created on Sun Jun 13 15:41:56 2021 ...
    99+
    2022-06-02
    pygame中国象棋源码 Python pygame
  • Android实现中国象棋游戏(局域网版)
    本文实例为大家分享了Android实现中国象棋游戏的具体代码,供大家参考,具体内容如下 实现环境:  android studio 3.2.1, 手机分辨率为: 1920 ...
    99+
    2024-04-02
  • C++LeetCode1812判断国际象棋棋盘格子颜色
    目录1812.判断国际象棋棋盘中一个格子的颜色方法一:取模AC代码C++方法二:基于方法一的小改进AC代码C++1812.判断国际象棋棋盘中一个格子的颜色 力扣题目链接:leetc...
    99+
    2022-12-16
    C++ 判断棋盘格子颜色 C++ LeetCode题解
  • 基于Matlab实现中国象棋的示例代码
    目录设置变量绘图绘制棋盘绘制棋子棋子移动规则判断是否可以移动移动棋子吃子设置变量 nRowNum = 8; % 画布行数 nColNum = 9; % 画布列数 offset_x =...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作