游戏攻略网
当前位置: 首页 游戏攻略

用c语言编写象棋的代码(国际象棋零基础项目)

时间:2023-06-03 作者: 小编 阅读量: 1 栏目名: 游戏攻略

对局由执白者先行,每次走一步,双方轮流行棋,直到对局结束。王是不可以送吃的,即任何被敌方控制的格子,己方王都不能走进去。否则,算“送王”犯规,三次就要判负。行棋规则大家一定要理解,因为这个关系到你实现这个国际象棋项目的规则逻辑部分!

这篇文章主要为大家详细介绍了C语言实现——《国际象棋项目》它和中国象棋可不一样哟!文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下!

游戏介绍:

国际象棋(Chess),又称西洋棋,是一种二人对弈的棋类游戏。

棋盘为正方形,由64个黑白(深色与浅色)相间的格子组成;棋子分黑白(深色与浅色)两方共32枚,每方各16枚。虽然汉语称之为西洋棋或国际象棋,但是实际上它起源于亚洲,后由阿拉伯人传入欧洲,成为国际通行棋种。

行棋规则

国际象棋是双方对下的,一方用白棋,一方用黑棋。对局由执白者先行,每次走一步,双方轮流行棋,直到对局结束。各种棋子的一般走法如下:

王(K):横、直、斜都可以走,但每次限走一步。王是不可以送吃的,即任何被敌方控制的格子,己方王都不能走进去。否则,算“送王”犯规,三次就要判负。

(1)除易位时外,王可走到不被对方棋子攻击的任何相邻格子,而且只能走一步(着)。

(2)易位是由王和己方任何一个车一起进行的仍被视作王的一步(着)的走法。

后(Q):横、直、斜都可以走,步数不受限制,但不能越子。

车(R):横、竖均可以走,步数不受限制,不能斜走。除王车易位外不能越子。

象(B):只能斜走。格数不限,不能越子。开局时每方有两象,一个占白格,一个占黑格。

马(N):每步棋先横走或直走一格,然后再往外斜走一格;或者先斜走一格,最后再往外横走或竖走一格(即走“日”字)。可以越子,没有中国象棋中的“蹩马腿”限制。

兵(P):只能向前直走,每次只能走一格。但走第一步时,可以走一格或两格。兵的吃子方法与行棋方向不一样,它是直走斜吃,即如果兵的斜进一格内有对方棋子,就可以吃掉它而占据该格。

行棋规则大家一定要理解,因为这个关系到你实现这个国际象棋项目的规则逻辑部分!

插件:图形库插件easyX,涉及图片素材可以自行百度找也可以关注文末领取;

效果图展示

配套讲解教程:国际象棋游戏教程——哔哩哔哩

源代码示例:

#include <graphics.h> //要先安装 easyX 到你的编译器 #include <stdio.h>#define SPACE80//记录一个棋子落点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("d", map[i][j]);}printf("\n");}}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\n", 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;}}

未完成的棋子代码,大家也可以自己先去想想试试,每一次的思考就是你进步的过程!

如果学习的过程中有什么问题,以及本项目有什么不懂的地方,都可以来找我交流,我来帮你!

那么今天的分享就到这里了,后续会更新更多精彩项目的,大家要好好学C语言C哟~

写在最后:对于准备学习C/C编程的小伙伴,如果你想更好的提升你的编程核心能力(内功)不妨从现在开始!

编程学习书籍分享:

编程学习视频分享:

整理分享(多年学习的源码、项目实战视频、项目笔记,基础入门教程)

欢迎转行和学习编程的伙伴,利用更多的资料学习成长比自己琢磨更快哦!

对于C/C感兴趣可以关注小编在后台私信我:【编程交流】一起来学习哦!可以领取一些C/C的项目学习视频资料哦!已经设置好了关键词自动回复,自动领取就好了!

    推荐阅读
  • steam棋牌游戏推荐(幸运之夜新版本亮相TGC)

    steam棋牌游戏推荐12月1日,2017腾讯游戏嘉年华正式在成都开幕,腾讯的VR社交游戏《幸运之夜》在现场发布了最新版本。VR《幸运之夜》在TGC2017上惊艳亮相《幸运之夜》新版本发布邀请好友一起游戏今年7月底,《幸运之夜》正式在Steam发布,并推出了首款游戏作品“德州扑克”。今年的TGC2017现场,《幸运之夜》全新版本便带来了对互动性方面的提升。

  • 儿童睡前故事卖火柴的小女孩大全(卖火柴的小女孩)

    在长发公主的故事里,兔子小姐变成了手持宝剑的骑士,穿过了山川和河流,战胜了地狱恶犬,最终救出了长着一头金黄色长发的熊猫先生。随着一阵空间的波动,熊猫先生和兔子小姐来到了冰天雪地的圣诞节。小女孩被这突如其来的变化惊呆了。熊猫先生没有回答,轻轻摸了摸小女孩的头。小女孩点燃了第二根火柴。熊猫先生和兔子小姐则来到壁炉前,商量起小女孩最后一个愿望。熊猫先生蹲下来,握起小女孩的手。

  • 怎样做ppr管快一点(PPR管安装方法及技巧)

    怎样做ppr管快一点PPR管安装方法及技巧首先准备好需要的材料:热熔机,小剪刀,ppr管,管件,手巾。一定要根据自己热熔ppr管的口径,准备相应的热熔头。清洁:清洁管材与管件的焊接段部位,建议用95%浓度酒精擦净。在熔接时间内迅速的将管材无旋转的垂直插入管件中,并维持5秒以上,然后按相应冷却时间冷却。热熔后做到横平竖直,美观大方。

  • 大托特包搭配技巧(大托特包搭配技巧简述)

    西装外套+托特包复古时尚的格子,由黑白交错的条纹形成,文艺而又端庄搭配撞色托特包,优雅而不失俏皮,让气场变得灵动起来内搭白色连帽卫衣,减龄又可爱,接下来我们就来聊聊关于大托特包搭配技巧?大托特包搭配技巧西装外套+托特包复古时尚的格子,由黑白交错的条纹形成,文艺而又端庄。衬衫+托特包白色的衬衫休闲慵懒,给人一种空灵的感觉以及干净纯粹的气质。

  • 刘涛电视剧口碑(电视剧景气指数第一)

    还记得3月份刘涛在和周渝民主演的《大宋宫词》中扮嫩出演少妇被很多观众吐槽。万万没想到时隔数月,刘涛带着她的新剧《星辰大海》杀回来了。目前主要的剧情线在刘涛饰演的女主简爱身上。因为小时候意外发现母亲出轨的事,得知真相的父亲激愤之下杀死母亲并自杀,简爱因此成为了一个孤女。逃出傻子家的简爱在与姑姑的争执中误伤姑姑,从此开启逃命生涯。简爱从面馆辞职走投无路,误打误撞进入大公司之后面临着同事的故意刁难。

  • 外墙装修材料有哪些 外墙装修材料有哪些类型

    外墙涂料具有装饰性良好、耐污染耐老化以及施工维修容易和价格合理的特点。一般来说釉面外墙砖有亚光面与无光面两大类。它的装饰的效果也不错,有柚木色、深灰色等等可供选择。由于它的表面的肌理很清晰,所以色泽漂亮且装饰性极强。本站,中国知名大型装修平台,装修领导品牌。

  • 世界上有哪些花(世界上有哪些花 名字)

    瓜叶菊、香豌豆、夏兰、石竹、石蒜、荷花、翠菊、睡莲、福禄考、晚香玉、万寿菊、千日红、建兰、铃兰、报岁兰、香堇、大岩桐、水仙、小草兰、瓜叶菊、蒲包花、免子花、入腊红、三色堇、百日草、鸡冠花、一串红。孔雀草、大波斯菊、金盏菊、非洲凤仙花、菊花、非洲菊、观赏凤梨类、射干、非洲紫罗兰、天堂鸟、炮竹红、菊花、康乃馨、红掌、满天星、星辰花、三角梅、虞美人。

  • 长歌行李长歌母亲是谁杀的(长歌行李长歌的简介)

    下面更多详细答案一起来看看吧!长歌行李长歌母亲是谁杀的《长歌行》李长歌母亲是自杀的。李长歌,太子李建成之女,生母则是回纥王族。父母手足均死于玄武门之变,满怀愤恨的长歌凭高超武艺逃出皇宫,并在追捕过程中制造“坠崖假死”而逃生,其后女扮男装隐瞒身份流落民间,一心只想为父母复仇,在家和国的利害冲突中,最后放弃复仇,和阿诗勒隼一起成为了民族和解的使者。

  • 什么时候喝蛋白粉增肌效果最好(什么时候喝蛋白粉增肌效果最好)

    从长远来看,这种方法被证明可以促使肌肉明显增长。如果摄入量超过一定的阈值,蛋白质的合成就会受限。如果是以乳清饮料的形式摄入乳清蛋白,运动者可以在运动结束后立即饮用。按每公斤体重1克的标准,在健身前后立即摄入以及在运动后1小时内摄入可快速吸收的碳水化合物,可以明显抑制肌肉分解,并大大促进肌肉快速和明显的增长。在这种情况下,大量分泌的胰岛素促进了氨基酸向工作中的肌肉运输,为蛋白质合成奠定基础。

  • 窦骁周冬雨山楂树之恋结局(周冬雨18岁第一次出演)

    周冬雨18岁第一次出演要说最近最火的电影,非《少年的你》莫属,上映14天,已经收获了12.45亿的票房成绩,成为现阶段最强的票房黑马而作为该片主演的周冬雨和易烊千玺,也凭借在该片中的精彩演出,演技得到大众的进一步认可作为“。