中国象棋是起源于中国的一种棋,属于二人对抗性游戏的一种,在中国有着悠久的历史。由于用具简单,趣味性强,成为流行极为广泛的棋艺活动。

它是中国棋文化,也是中华民族的文化瑰宝,它源远流长,趣味浓厚,基本规则简明易懂。中国象棋在中国的群众中基础远远超过围棋,是普及最广的棋类项目,中国象棋已流传到十几个国家和地区。它使用方形格状棋盘,圆形棋子共有32个,红黑二色各有16个棋子,摆放和活动在交叉点上。双方交替行棋,先把对方的将(帅)“将死”的一方获胜。(摘取自百度百科)

假的效果图

那么我们今天,将用C语言来实现我们中国象棋游戏程序的开发,觉得对你有帮助的小伙伴记得先关注一波哦!

实现思路

我们可以用绘图技术绘制棋盘,枚举定义各种棋子,然后结构体数组,用来保存每一个点的信息。

重点是棋盘的绘制以及判断棋子是否可移动到目标位置,移动有两种可能,一是单纯移动,二是吃子移动。主要飞将的特殊规则。废话不多说,贴源码!

源码分享

#include<stdio.h>
#include<graphics.h>
#define INTERVAL 50 //前面的间隔
#define CHESS_GRID_SIZE 70 //格子宽度
#define ROW 10
#define COL 9
enum PIECES//枚举棋子
{
車,馬,象,士,将,砲,卒,
俥,马,相,仕,帥,炮,兵,
SPACE,BEGIN,END
};
//红黑方棋子、
int redChess[] = { 車, 馬, 象, 士, 将, 砲, 卒};
int blackChess[] = { 俥, 马, 相, 仕, 帥, 炮, 兵 };
const char*chessName[] = { "車", "馬", "象", "士", "将", "砲", "卒", "俥", "马", "相", "仕", "帥", "炮", "兵" };
struct Chess//棋子属性
{
int x;
int y;
int id;//哪个棋子
int type;//是哪一方的棋子 红,黑?
bool river;//判断小兵是否过了河
};
struct Chess map[ROW][COL];//结构体数组,用来保存每一个点的信息
POINT begin = { -, - }, end = { -, - };//保存前后两次点击的数组下标
int state = BEGIN;
//初始化游戏数据
void GameInit()
{
for (int i = ; i < ROW; i++)
{
for (int k = ; k < COL; k++)
{
int chessname = SPACE;
int mcolor = BLACK;
//黑棋
if (i <= )
{
mcolor = BLACK;
//初始化第一行的棋子,
if (i == )
{
if (k <= )
{
chessname = blackChess[k];
}
else
{
chessname = blackChess[-k];
}
}
//设置炮
if (i == && (k == || k == ))
{
chessname = blackChess[砲];
}
//设置小兵
if (i == && k % == )
{
chessname = blackChess[卒];
} }
//紅棋
else
{
mcolor = RED;
//初始化第一行的棋子,
if (i == )
{
if (k <= )
{
chessname = redChess[k];
}
else
{
chessname = redChess[ - k];
}
}
//设置炮
if (i == && (k == || k == ))
{
chessname = redChess[炮];
}
//设置小兵
if (i == && k % == )
{
chessname = redChess[兵];
}
}
map[i][k].id = chessname;
map[i][k].river = false;
map[i][k].type = mcolor;
map[i][k].x = k*CHESS_GRID_SIZE + INTERVAL;
map[i][k].y = i*CHESS_GRID_SIZE + INTERVAL;
}
}
}
//游戏的绘制函数
void GameDraw()
{
//设置背景颜色 red black
setbkcolor(RGB(, , ));
cleardevice(); //绘制棋盘
setlinecolor(BLACK);
setlinestyle(PS_SOLID, );
for (int i = ; i < ; i++)
{
//画横线
line(INTERVAL, i*CHESS_GRID_SIZE + INTERVAL, * CHESS_GRID_SIZE + INTERVAL, i*CHESS_GRID_SIZE + INTERVAL);
//画竖线
if (i < )
{
line(i*CHESS_GRID_SIZE + INTERVAL, INTERVAL, i*CHESS_GRID_SIZE + INTERVAL, * CHESS_GRID_SIZE + INTERVAL);
}
}
rectangle(INTERVAL - , INTERVAL - , * CHESS_GRID_SIZE + INTERVAL+, + * CHESS_GRID_SIZE + INTERVAL);
//楚河汉界显示
setfillcolor(RGB(, , ));
fillrectangle(INTERVAL, * CHESS_GRID_SIZE + INTERVAL, * CHESS_GRID_SIZE + INTERVAL, * CHESS_GRID_SIZE + INTERVAL);
//显示文字
char river[] = "楚河 汉界";
settextstyle(, , "楷体");
settextcolor(BLACK);
setbkmode(TRANSPARENT);
outtextxy(INTERVAL+, * CHESS_GRID_SIZE + INTERVAL+, river);
//画九宫格
//画上面
line( * CHESS_GRID_SIZE + INTERVAL, INTERVAL, * CHESS_GRID_SIZE + INTERVAL, * CHESS_GRID_SIZE + INTERVAL);
line( * CHESS_GRID_SIZE + INTERVAL, * CHESS_GRID_SIZE + INTERVAL, * CHESS_GRID_SIZE + INTERVAL, INTERVAL);
//画下面
line( * CHESS_GRID_SIZE + INTERVAL, * CHESS_GRID_SIZE + INTERVAL, * CHESS_GRID_SIZE + INTERVAL, * CHESS_GRID_SIZE + INTERVAL);
line( * CHESS_GRID_SIZE + INTERVAL, * CHESS_GRID_SIZE+INTERVAL,*CHESS_GRID_SIZE+INTERVAL,*CHESS_GRID_SIZE+INTERVAL);
//画棋子
settextstyle(, , "楷体");
for (int i = ; i < ROW; i++)
{
for (int k = ; k < COL; k++)
{
if (map[i][k].id != SPACE)
{
setlinecolor(map[i][k].type);
fillcircle(map[i][k].x, map[i][k].y, );
fillcircle(map[i][k].x, map[i][k].y, );
settextcolor(map[i][k].type);
outtextxy(map[i][k].x-, map[i][k].y-, chessName[map[i][k].id]);
} }
}
}
void MouseControl()
{
if (MouseHit())
{
MOUSEMSG msg = GetMouseMsg();
if (msg.uMsg == WM_LBUTTONDOWN)
{
//获取鼠标点击的数组的下标
int row = (msg.y-INTERVAL)/CHESS_GRID_SIZE;
int col = (msg.x-INTERVAL)/CHESS_GRID_SIZE;
if (state == BEGIN)
{
state = END;
begin.x = row;
begin.y = col;
}
else if (state == END)
{
state = BEGIN;
begin.x = row;
begin.y = col;
}
printf("%d,%d %d\n", row, col, state);
}
}
}
void chessMove()
{
if (begin.x != - && end.x != - && !(begin.x == end.x &&begin.y == end.y))
{
map[end.x][end.y].id = map[begin.x][begin.y].id;
map[end.x][end.y].type = map[begin.x][begin.y].type;
map[end.x][end.y].river = map[begin.x][begin.y].river;
map[begin.x][begin.y].id = SPACE;
} }
int main555()
{
//创建一个图形窗口
initgraph(,,SHOWCONSOLE);
GameInit();
printf("欢迎来到顽石老师课堂,中国象棋");
BeginBatchDraw();
while ()
{
GameDraw();
FlushBatchDraw();
MouseControl();
chessMove();
}
return ;
}

以上就是分享的全部内容,希望对大家有所帮助!

自学C/C++编程难度很大,不妨和一些志同道合的小伙伴一起学习成长!

C语言C++编程学习交流圈子,【点击进入】微信公众号:C语言编程学习基地

有一些源码和资料分享,欢迎转行也学习编程的伙伴,和大家一起交流成长会比自

 

C/C++编程笔记:C语言打造中国象棋游戏,项目源代码分享!的更多相关文章

  1. C#中国象棋+游戏大厅 服务器 + 客户端源码

    来源:www.ajerp.com/bbs C#中国象棋+游戏大厅 服务器 + 客户端源码 源码开源 C#版中国象棋(附游戏大厅) 基于前人大虾的修改版 主要用委托实现 服务器支持在线人数,大厅桌数的设 ...

  2. 基于HTML5实现的中国象棋游戏

    棋类游戏在桌面游戏中已经非常成熟,中国象棋的版本也非常多.今天这款基于HTML5技术的中国象棋游戏非常有特色,我们不仅可以选择中国象棋的游戏难度,而且可以切换棋盘的样式.程序写累了,喝上一杯咖啡,和电 ...

  3. 中国象棋游戏Chess(3) - 实现走棋规则

    棋盘的绘制和走棋参看博文:中国象棋游戏Chess(1) - 棋盘绘制以及棋子的绘制,中国象棋游戏Chess(2) - 走棋 现在重新整理之前写的代码,并且对于每个棋子的走棋规则都进行了限制,不像之前那 ...

  4. 中国象棋游戏Chess(2) - 走棋

    之前的文章请看:中国象棋游戏Chess(1) - 棋盘绘制以及棋子的绘制 现在实现走棋的功能. 首先需要获取点击到的棋子,用QWidget中的函数 mouseReleaseEvent 实现函数: vo ...

  5. GMchess Linux下的中国象棋游戏

    gmchess,一款Linux下的中国象棋程序

  6. 【原创】使用HTML5+canvas+JavaScript开发的原生中国象棋游戏及源码分享

    目前已经实现的功能: V1.0 : 实现棋子的布局,画布及游戏场景的初始化V2.0 : 实现棋子的颜色改变V3.0 :实现所有象棋的走棋规则V4.0 : 实现所有棋子的吃子功能 GItHub源码下载地 ...

  7. 用C语言实现中国象棋

    基于五子棋框架上的 象棋 小游戏 本游戏是上各种水课无聊时的产物...不参考现有游戏从零开始实现各项功能. 游戏配置:二维数组,循环系统,wasd基本移动,调整窗台的函数,以及富足的发呆时间.. 完整 ...

  8. 编程之美 ---> 1.2中国象棋将帅问题

    上图,将帅不能碰面,列出将帅不碰面的所有可能情况,要求:程序只能用一个只有8位的变量(#define这样的就不算了) 为了更加符合程序员的口味,给将帅位置编号如下: 0--1--2 |    |   ...

  9. cocos2dx 3.2 的中国象棋游戏

    改编来源:http://cn.cocos2d-x.org/tutorial/lists?id=103 在cocos2dx官网看到了这么个教程,是cocos2dx 2.x版本的,于是用 cocos2dx ...

随机推荐

  1. 朋友HDU - 5963 (思维题) 三种方法

    传送门 题目描述 输入 输出 样例输入 Sample Input 样例输出 Boys win! Girls win! Girls win! Boys win! Girls win! Boys win! ...

  2. Linux系统中虚拟设备文件的各种实用用法

    大家好,我是良许. 大家知道,在 Linux 下,一切皆文件,对于设备文件也是如此.我们在工作的过程中,经常会看到 /dev/null 这个玩意,那它到底是什么呢? 专业地讲,/dev/null 是一 ...

  3. python—模块optparse的用法

    1.什么是optparse: 在工作中我们经常要制定运行脚本的一些参数,因为有些东西是随着我么需求要改变的,所以在为们写程序的时候就一定不能把写死,这样我们就要设置参数 optparse用于处理命令行 ...

  4. day06总结

    字符串常用操作# ======================================基本使用======================================# 1.用途:记录描述 ...

  5. day77 vue对象提供的属性功能

    目录 一.过滤器 二.计算属性(computed) 三.侦听属性(watch) 四.vue对象的生命周期 五.阻止事件冒泡和刷新页面 六.综合案例-todolist 一.过滤器 定义:就是vue允许开 ...

  6. JVM 专题二:虚拟机(二)Java虚拟机

    2.1 什么是Java虚拟机? Java虚拟机是一台执行字节码的虚拟计算机,它拥有独立的运行机制,其运行的Java字节码也未必由Java语言编译而成. JVM平台的各种语言可以共享Java虚拟机带来的 ...

  7. 数据可视化之分析篇(四)PowerBI分析模型:产品关联度分析

    https://zhuanlan.zhihu.com/p/64510355 逛超市的时候,面对货架上琳琅满目的商品,你会觉得这些商品的摆放,或者不同品类的货架分布是随机排列的吗,当然不是. 应该都听说 ...

  8. js自定义获取浏览器宽高

    /** * @description js自定义获取浏览器宽高 * * IE8 和 IE8 以下的浏览器不兼容 * window.innerWidth * window.innerHeight * * ...

  9. 入门大数据---Hive计算引擎Tez简介和使用

    一.前言 Hive默认计算引擎时MR,为了提高计算速度,我们可以改为Tez引擎.至于为什么提高了计算速度,可以参考下图: 用Hive直接编写MR程序,假设有四个有依赖关系的MR作业,上图中,绿色是Re ...

  10. eclipse导入项目出现红叉

    转载:原博客 导入web项目有红叉时可能是path环境不支持需要配置自己电脑的path,所以需要build path 出现java代码错误或者…jsp文件出错(https://img-blog.csd ...