摘要:中国象棋是中国非常流行的游戏。宣布失败的一方算输。今天,我将用语言带你一步一步完成一个好玩有趣的中国象棋游戏,你可以和你的朋友一起玩。
中国象棋是中国非常受欢迎的游戏。棋的双方根据自己对棋的形式的理解和对棋的规则的掌握,调动各自的车马,组织兵力,协同作战,在棋盘的特定战场上进行象征性的军事战斗。象棋也叫“象棋”。为了区别于“象棋”和“中国象棋”,中国象棋在中国由来已久,属于两人对抗性游戏。因其设备简单,趣味性强,成为非常受欢迎的棋类活动。
游戏规则
棋规:棋规帅/会移动范围:只能在九宫移动。移动规则:每一步只能水平或垂直移动一点。特别规定:帅和帅不允许在同一条线上直接面对面(中间没有棋子)。如果一方已经先占了位置,另一方必须回避。否则,就算官/士动了,也只能在九宫里动。移动规则:每一步只能沿对角线方向移动一点。移动规则:每一步只能沿对角线方向移动两点,田字用汉字可以形象地表达出来:田字格的对角线,俗称相(象)去田字。当田字的中心有棋子时(不管是自己的还是对方的棋子),都不允许走过去,俗称:挡住大象的眼睛。马匹移动范围:任意位置移动规则:每一步只能水平或垂直移动一点点,然后向左或向右斜向移动。汉字中的日文可以用来形容马的行走方式,俗称:马走在太阳下(对角线)。马在行走时,如果有其他棋子(无论是自己的还是对方的)直着或横着挡住第一步,是不允许走过去的,俗称:跳马腿。车辆移动范围:任意位置移动规则:任意无障碍点炮/枪移动范围可水平或垂直移动:任意位置移动规则:像车一样移动,但必须跳过一个棋子才能吃掉对方的棋子。兵/卒移动范围:任意位置移动规则:过河前,每一步只能向前移动一点。过河后增加了左右移动能力,不允许士兵(卒)后退。
吃的规则:不管是什么棋子,只要是按照下棋的规则在可以够到的位置,一般都可以吃掉对方的棋子。
唯一的例外是大炮下棋的方法,比较特别。你需要中间有棋子(不管是自己的还是对手的)才能吃掉对方的棋子。
胜败判断:帅(将)被对方“将死”或“困”的一方算输。
宣布失败的一方算输。
今天我就用C语言带你一步一步完成一个好玩有趣的中国象棋游戏,你可以和你的朋友一起玩。PS:安装easyx图形库,#include开发工具是VS2013。
在此之前,我先给大家解释一下,因为这是一个比较大的项目,所以把所有的代码都展示出来会比较困难,所以我把大部分的主要代码都剪掉了,主要是让大家理解实现这个项目的逻辑思路。希望你能看懂,在完整的代码文章底部得到。
第一步:创建一个项目,将准备好的素材资源放在同一级目录下(素材可以在文章底部收集),如下图所示:
第二步:下一步是我们的主函数,main。Cpp创建一个窗口,粘贴一个棋盘图,并添加一个双缓冲绘图以防止闪屏:
Int main(){//创建图形窗口initgraph (740,820,ew _ show console);//设置后台模式setbkmode(透明);//粘贴棋盘图像img _ boardloadimage(&img_board,"。/RES/棋盘. png ");init();//双缓冲绘制防止闪屏BeginBatchDraw();while(true){ clear device();putimage(0,0,& img _ board);draw();mouse event();FlushBatchDraw();} EndBatchDraw();getchar();返回0;}第三步:用画图找到各点的坐标并画出棋子,还有黑红棋子和过河棋子等。;
Enum棋子//棋{NONE = -1,车,马,象,士,将,炮,卒,马,相,士,帅,炮,兵,开始,结束,};//赋值id枚举棋子red chess[]= {车、马、象、兵、将、炮、卒};Enum棋子black chess[]= {我、马、项、石、帅、包、兵};//绘制时,转换成字符串const char * chesname[]= { "车"、"马"、"象"、"士"、"将"、"炮"、"卒"、"表"、"马"、"相"、"官"、"帅"。//每个棋子的属性,struct Chess { enum Pieces id//棋子名称DWORD类型;//棋子类型,红色?黑色?短x;短y;bool是isRiver//你过河了吗};
第四步:宏定义#定义第10行#定义第9列画一个十列九行的地图,初始化数据,设置棋子的特殊移动规则:
//游戏地图struct象棋地图[ROW][COL];结构状态{ int begrint begcint endrint endcint状态;}state = {-1,-1,-1,-1,BEGIN };void chess move();//打印数组void show(){ for(size _ t I = 0;I <排;i++){ for(size _ t k = 0;k < COLk++){printf("%2d ",map[i][k]。id);} printf("/n ");} }//初始化数据void init(){//遍历map for(size _ t I = 0;I <排;i++){ size _ t temp = 0;for(size _ t k = 0;k 映射[行][列]。y+30){ row++;col++;}//printf("(%d %d)/n ",row,col);if(state . state = = BEGIN){ state . begr = row;state.begc = colstate.state = END} else if(state . state = = END){ state . endr = row;state.endc = colstate.state = BEGIN} chess move();} } } int has block(struct State * State){ int CNT = 0;开始;state -> begc;state -> endr;state -> endc;*/return CNT;}
第六步:设置棋子的移动:
//移动棋子void chess Move(){ printf(" beg(% d % d)end(% d % d)/n ",state。贝格州。Begc,状态。endr);bool canMove = false//什么情况下可以移动棋子如果(!(状态。Begr = = state.endr & & state。Begc = = state。endc)&//你没有点同一个棋子。状态。Endr!=-1 && state.begr!=-1&&//下标必须是合法映射[state.begr][state.begc]。id!=无//没有棋子不能动/* & & map[状态。begr] [state。begc】。打字!= map [state。endr][状态。endc】。type */)/吃不下自己{switch (map [state。begr] [state。begc】。id){ case car:case:if(state . begr = = state . endr | | state . begc = = state . endc){//起点和终点之间是否有障碍if(has block(& state)){ can move = true;} }破;案马:案马:破;案例形象:案例阶段:破;办案官:办案官:破;案将:案帅:破;格枪:格枪:破;案卒:案兵:破;默认:break} if(can move){ printf(" can move/n ");map[state.endr][state.endc]。id = map[state.begr][state.begc]。id;map[state.begr][state.begc]。id =无;map[state.endr][state.endc]。is river = map[state . begr][state . begc]。isRivermap[state.endr][state.endc]。type = map[state . begr][state . begc]。类型;}}}
中国象棋课程到此结束。有兴趣的同学可以试着写出来。稍后我会发布更多的项目源代码和学习资料。希望你能继续关注。想要C/C++学习资料和完整的源码库图形库开发工具的可以入群【639681529】了解,也可以在评论区提问,有问题也可以入群。希望你能在这里得到你想要的知识,也希望如果对你有帮助。
点击下方链接入群:入群领取项目源素材和图文库~有各种学习资料等着你!Http://点击链接加入群聊【C语言/C++学习问答交流】:https://jq.qq.com/? _ wv = 1027 & k = 9 uocdbow http://xn--C-14s 39 jerazz 506 etjubj 1 ayhbm 86 C 60 et 16 A/c++ % E5 % AD % A6 % E4 % B9 % A0 % E7 % AD % 94% E7 % 96% 91% E4 % BA % A4 % E6 % B5 % 81% E3 %_wv=1027&k=9UocdboW
评论前必须登录!
注册