C++怎么实现中国象棋
发表于:2026-11-04 作者:千家信息网编辑
千家信息网最后更新 2026年11月04日,这篇文章主要介绍"C++怎么实现中国象棋",在日常操作中,相信很多人在C++怎么实现中国象棋问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答"C++怎么实现中国象棋"的疑惑
千家信息网最后更新 2026年11月04日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 4 if (k <= 4) { temp = k; } // 3 2 1 0 else { // k == 5 temp = 4 - (k - 4); /* 4 - (5-4) //3 4 - (6-4) //2 4 - (7-4) //1 4 - (8-4) //0 */ } 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 4 if (k <= 4) { temp = k; } // 3 2 1 0 else { // k == 5 temp = 4 - (k - 4); /* 4 - (5-4) //3 4 - (6-4) //2 4 - (7-4) //1 4 - (8-4) //0 */ } 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//没有棋子不能移动 /*&&map[state.begr][state.begc].type != map[state.endr][state.endc].type*/) //不能自己吃自己 { 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++怎么实现中国象棋"的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注网站,小编会继续努力为大家带来更多实用的文章!
棋子
函数
中国象棋
象棋
中国
C++
鼠标
学习
移动
接下来
下标
重点
一行
地图
更多
结构
项目
帮助
合法
不能自己
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
互联网科技网
互联网最新的科技
互联网扶贫科技
朗新科技与工业互联网
善班互联网科技
无线互联网科技
互联网女皇 腾讯科技
深圳天众互联网科技公司
长亮科技互联网金融
盛创互联网科技有限公司
滨湖区互联网智能科技产品供应
深圳互联网科技怎么样
创业天下互联网科技有限公司
团飞科技与伯堂互联网服务平台
宁夏众和广鑫互联网科技有限公司
知域互联网科技有限公司大骗子
乌苏新华互联网科技做什么的
高科技互联网套路
广东工业互联网大赛深圳学泰科技
浙南科技城互联网大厦招聘
互联网科技金融公司
致骋互联网科技
碳银互联网科技有限公司
顺玮阁互联网科技
长亮科技 互联网金融
上海宁丞科技互联网
科技互联网海报
黑科技 体验场景 互联网大会
珠海东科互联网科技有限公司
互联网科技对化妆品行业