这篇文章主要为大家详细介绍了c语言实现——《国际象棋项目》,它和中国象棋可不一样哟!文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下!
游戏介绍: 国际象棋(chess),又称西洋棋,是一种二人对弈的棋类游戏。
棋盘为正方形,由64个黑白(深色与浅色)相间的格子组成;棋子分黑白(深色与浅色)两方共32枚,每方各16枚。虽然汉语称之为西洋棋或国际象棋,但是实际上它起源于亚洲,后由阿拉伯人传入欧洲,成为国际通行棋种。
行棋规则 国际象棋是双方对下的,一方用白棋,一方用黑棋。对局由执白者先行,每次走一步,双方轮流行棋,直到对局结束。各种棋子的一般走法如下:
王(k):横、直、斜都可以走,但每次限走一步。王是不可以送吃的,即任何被敌方控制的格子,己方王都不能走进去。否则,算“送王”犯规,三次就要判负。
(1)除易位时外,王可走到不被对方棋子攻击的任何相邻格子,而且只能走一步(着)。
(2)易位是由王和己方任何一个车一起进行的仍被视作王的一步(着)的走法。
后(q):横、直、斜都可以走,步数不受限制,但不能越子。
车(r):横、竖均可以走,步数不受限制,不能斜走。除王车易位外不能越子。
象(b):只能斜走。格数不限,不能越子。开局时每方有两象,一个占白格,一个占黑格。
马(n):每步棋先横走或直走一格,然后再往外斜走一格;或者先斜走一格,最后再往外横走或竖走一格(即走“日”字)。可以越子,没有中国象棋中的“蹩马腿”限制。
兵(p):只能向前直走,每次只能走一格。但走第一步时,可以走一格或两格。兵的吃子方法与行棋方向不一样,它是直走斜吃,即如果兵的斜进一格内有对方棋子,就可以吃掉它而占据该格。
行棋规则大家一定要理解,因为这个关系到你实现这个国际象棋项目的规则逻辑部分!
插件:图形库插件easyx,涉及图片素材可以自行百度找也可以关注文末领取;
源代码示例:
#include //要先安装 easyx 到你的编译器 #include #define space 80//记录一个棋子落点struct mypoint{ int x; int y;};//用来保存 单数次 鼠标左键点击 和双数次鼠标左键点击struct mypoint set[2];int n = 0;//记录当前是第n次鼠标左键按下//图片变量image 黑棋盘img, 白棋盘img, 卒子a黑img, 卒子b黑img, 车a黑img, 车b黑img, 国王a黑img, 国王b黑img, 马a黑img, 马b黑img, 象a黑img, 象b黑img, 皇后a黑img, 皇后b黑img, 卒子a白img, 卒子b白img, 车a白img, 车b白img, 国王a白img, 国王b白img, 马a白img, 马b白img, 象a白img, 象b白img, 皇后a白img, 皇后b白img;//枚举 为了代码容易阅读而写enum state{ 黑棋盘, 白棋盘, 卒子a黑, 卒子b黑, 车a黑, 车b黑, 国王a黑, 国王b黑, 马a黑, 马b黑, 象a黑, 象b黑, 皇后a黑, 皇后b黑, 卒子a白, 卒子b白, 车a白, 车b白, 国王a白, 国王b白, 马a白, 马b白, 象a白, 象b白, 皇后a白, 皇后b白};//1 游戏初始化 做窗口 定义图片变量 加载图片 数据void initgame();//2 绘制界面//2.1 图形界面void drawgame(int map[8][8]);//2.2 命令行界面void printgame(int map[8][8]);//3 控制游戏//3.1 鼠标控制下棋void xiaqi(int map[8][8]);//3.1 落子void luozi(int map[8][8]);int main(){ //地图 int map[8][8] = { { 车b白, 马b黑, 象b白, 国王b黑, 皇后b白, 象b黑, 马b白, 车b黑 }, { 卒子b黑, 卒子b白, 卒子b黑, 卒子b白, 卒子b黑, 卒子b白, 卒子b黑, 卒子b白 }, { 白棋盘, 黑棋盘, 白棋盘, 黑棋盘, 白棋盘, 黑棋盘, 白棋盘, 黑棋盘 }, { 黑棋盘, 白棋盘, 黑棋盘, 白棋盘, 黑棋盘, 白棋盘, 黑棋盘, 白棋盘 }, { 白棋盘, 黑棋盘, 白棋盘, 黑棋盘, 白棋盘, 黑棋盘, 白棋盘, 黑棋盘 }, { 黑棋盘, 白棋盘, 黑棋盘, 白棋盘, 黑棋盘, 白棋盘, 黑棋盘, 白棋盘 }, { 卒子a白, 卒子a黑, 卒子a白, 卒子a黑, 卒子a白, 卒子a黑, 卒子a白, 卒子a黑 }, { 车a黑, 马a白, 象a黑, 皇后a白, 国王a黑, 象a白, 马a黑, 车a白 } }; initgame(); //创建线程 实时获取鼠标情况 根据鼠标情况来修改界面 while (1){ drawgame(map); printgame(map); xiaqi(map); //获取鼠标的坐标 和 鼠标是否按下 getmousemsg 阻塞 //sleep(20); } return 0;}//1 游戏初始化 做窗口 定义图片变量 加载图片 数据void initgame(){ // 窗口宽 窗口高 自带命令行窗口 initgraph(8 * space, 8 * space, showconsole); //把素材放到和源程序文件一起(编译器运行) //把素材放到和可执行程序文件(*.exe)一起(直接双击运行) loadimage(&黑棋盘img, l黑棋盘.bmp, space, space, true); loadimage(&白棋盘img, l白棋盘.bmp, space, space, true); loadimage(&卒子a黑img, l卒子a黑.bmp, space, space, true); loadimage(&卒子b黑img, l卒子b黑.bmp, space, space, true); loadimage(&车a黑img, l车a黑.bmp, space, space, true); loadimage(&车b黑img, l车b黑.bmp, space, space, true); loadimage(&国王a黑img, l国王a黑.bmp, space, space, true); loadimage(&国王b黑img, l国王b黑.bmp, space, space, true); loadimage(&马a黑img, l马a黑.bmp, space, space, true); loadimage(&马b黑img, l马b黑.bmp, space, space, true); loadimage(&象a黑img, l象a黑.bmp, space, space, true); loadimage(&象b黑img, l象b黑.bmp, space, space, true); loadimage(&皇后a黑img, l皇后a黑.bmp, space, space, true); loadimage(&皇后b黑img, l皇后b黑.bmp, space, space, true); loadimage(&卒子a白img, l卒子a白.bmp, space, space, true); loadimage(&卒子b白img, l卒子b白.bmp, space, space, true); loadimage(&车a白img, l车a白.bmp, space, space, true); loadimage(&车b白img, l车b白.bmp, space, space, true); loadimage(&国王a白img, l国王a白.bmp, space, space, true); loadimage(&国王b白img, l国王b白.bmp, space, space, true); loadimage(&马a白img, l马a白.bmp, space, space, true); loadimage(&马b白img, l马b白.bmp, space, space, true); loadimage(&象a白img, l象a白.bmp, space, space, true); loadimage(&象b白img, l象b白.bmp, space, space, true); loadimage(&皇后a白img, l皇后a白.bmp, space, space, true); loadimage(&皇后b白img, l皇后b白.bmp, space, space, true);}//2 绘制界面//2.1 图形界面void drawgame(int map[8][8]){ for (int i = 0; i < 8; i++){ for (int j = 0; j < 8; j++){ switch (map[i][j]){ case 黑棋盘:putimage(j*space, i*space, &黑棋盘img); break; case 白棋盘:putimage(j*space, i*space, &白棋盘img); break; case 卒子a黑:putimage(j*space, i*space, &卒子a黑img); break; case 卒子b黑:putimage(j*space, i*space, &卒子b黑img); break; case 车a黑: putimage(j*space, i*space, &车a黑img); break; case 车b黑: putimage(j*space, i*space, &车b黑img); break; case 国王a黑:putimage(j*space, i*space, &国王a黑img); break; case 国王b黑:putimage(j*space, i*space, &国王b黑img); break; case 马a黑: putimage(j*space, i*space, &马a黑img); break; case 马b黑: putimage(j*space, i*space, &马b黑img); break; case 象a黑: putimage(j*space, i*space, &象a黑img); break; case 象b黑: putimage(j*space, i*space, &象b黑img); break; case 皇后a黑:putimage(j*space, i*space, &皇后a黑img); break; case 皇后b黑:putimage(j*space, i*space, &皇后b黑img); break; case 卒子a白:putimage(j*space, i*space, &卒子a白img); break; case 卒子b白:putimage(j*space, i*space, &卒子b白img); break; case 车a白: putimage(j*space, i*space, &车a白img); break; case 车b白: putimage(j*space, i*space, &车b白img); break; case 国王a白:putimage(j*space, i*space, &国王a白img); break; case 国王b白:putimage(j*space, i*space, &国王b白img); break; case 马a白: putimage(j*space, i*space, &马a白img); break; case 马b白: putimage(j*space, i*space, &马b白img); break; case 象a白: putimage(j*space, i*space, &象a白img); break; case 象b白: putimage(j*space, i*space, &象b白img); break; case 皇后a白:putimage(j*space, i*space, &皇后a白img); break; case 皇后b白:putimage(j*space, i*space, &皇后b白img); break; default:break; } } }}//2.2 命令行界面void printgame(int map[8][8]){ //system(cls);//清屏 for (int i = 0; i < 8; i++){ for (int j = 0; j < 8; j++){ printf(%02d , map[i][j]); } printf(); }}void xiaqi(int map[8][8]){ //点两下 //第一下 选中棋子 //第二下 落子 //偶数次 //奇数次 int idx = n % 2; mousemsg msg; msg = getmousemsg();//获取鼠标信息 if (msg.mklbutton){//鼠标左键按下 set[idx].x = msg.x /space; set[idx].y = msg.y / space; printf(坐标:%d %d 下标:%d %d, msg.x, msg.y, set[idx].x, set[idx].y); if (1 == idx){//落子 luozi(map); } n++; }}//3.1 落子void luozi(int map[8][8]){ switch (map[set[0].y][set[0].x]){//判断 set[0] 位置是什么棋子 case 卒子a黑: //判断 能不能移动到 set[1]位置 如果能 就移动 if (set[0].y - set[1].y == 1){//往上走一格 map[set[0].y][set[0].x] = 黑棋盘;//本来位置变成黑棋盘 map[set[1].y][set[1].x] = 卒子a白;//目的地位置变成卒子a白 } break; case 卒子a白: //判断 能不能移动到 set[1]位置 如果能 就移动 if (set[0].y - set[1].y == 1){//往上走一格 map[set[0].y][set[0].x] = 白棋盘;//本来位置变成黑棋盘 map[set[1].y][set[1].x] = 卒子a黑;//目的地位置变成卒子a白 } break; } }
未完成的棋子代码,大家也可以自己先去想想试试,每一次的思考就是你进步的过程!
华为任正非表示不能让华为成为100%民主的公司
打开智慧生活的钥匙——企业物联网流量卡的优势
集线器的功能
华为智慧公路军团拿下成立后首单
广东省发布了全国首个地方金融非现场监管区块链系统
如何用C语言实现国际象棋项目
讨论智能电网中分布式电源
国内薄膜太阳能电池产业链解析
可应用于室内环境质量监测的一种智能温湿度传感器
FEV通过收购扩大领域专业知识和产能 瑞萨电子建立汽车软件平台实验室
气动泵流量控制系统的设计
网件Orbi AX6000路由器开箱,覆盖500平米信号不减弱
工业系统受制于人,信息安全问题不容忽视
小米6最新消息:小米6昨日发布,之前热传的小米6Plus在哪呢?
Heracles工具中的混合求解器技术详解
中控智慧科技考勤机UF200介绍
科大讯飞机器翻译首次达到专业译员水平 机器阅读超越人类平均水平
什么是工业级晶振?跟普通晶振区别在哪?
高性能转换器的特征及应用介绍
苹果新专利:汽车挡风玻璃转变成抬头显示屏