C语言零基础项目:自制军棋游戏!详细思路+源码分享

每天一个c语言小项目,提升你的编程能力!
这是一款由 shareli 自创规则的军旗游戏,具体的游戏规则如下:
棋盘大小:6×6。
棋子总数:36。
敌对双方:红,蓝。
棋子类别:红棋(红方操作,14 个),蓝棋(蓝方操作,14 个),紫棋(功能棋,8 个)。
红棋(蓝棋)类型:司令,军长,师长,旅长,团长,营长,连长,班长,军旗,工兵×2,炸弹×2。
紫棋类型:地雷×4,变身棋×4。
【规则说明】
1. 司令最大,工兵最小,大的吃小的,一样就同归于尽,炸弹能炸紫棋和敌方除军旗外所有的棋(炸弹也会消失)。
2. 工兵可挖地雷,挖完后可扛对方棋变身(挖的雷越多,变成的人物越厉害)。
3. 人物棋可吃变,吃后能变成工兵~军长中的一种,有一定几率变成隐藏 boss。
4. 人物棋可自杀(算一次操作)。
5. 执棋方进行完一次有效操作后,就换对方执棋(边框颜色表当前执棋方)。
6. 一方棋子(军旗除外)全被消灭,就算输; 同时全部没有,则和棋。
【执棋方能进行的操作】
1. 打开棋子(算一次操作)。
2. 攻击。
3. 移动。
4. 工兵(已挖雷)扛旗。
5. 吃变身卡。
6. 自杀。
【实施游戏操作说明(鼠标操作)】
1. 选择要打开棋子所在的区域,单击。
2~5. 单击选中主动方(棋子边框会变绿),再单击选中被动方。
6. 选中己方棋子,单机鼠标的中键。
注:要进行其他操作,必先撤销当前选定(单击右键撤销)
【人物棋等级一览(等高杀等小)】
工1 班2 连3 营4 团5 旅6 师7 军8 飞8 司9 升9 神10 仙10。
注:“飞、升、神、仙”都为工兵挖雷后扛旗所变,“飞、升、神”能直线飞,“仙”能满天飞。
本项目编译环境:visual studio 2019/2022,easyx插件
完整源代码如下:
#include #include #include #define chesize 40 // 棋盘尺寸,不能随意调整#define resetx 170#define resety 350 // 重置原点typedef enum // 要用到的棋子id{ si, jun, shi, lv, tuan, ying, lian, pai, ban, gong, fei, chao, zha, qi, lei, bian, xian, sheng, shen}chessid;typedef enum // 攻击类型{ comatt, preatt, noatt}attstyle;typedef enum // 当前游戏方和棋子所属方{ blue, red, white}team;typedef enum // 选中与未选中{ alchoose, unchoose}choosestate;typedef enum // 区域状态{ unknow, empty, exist}state;typedef struct // 坐标{ int x; int y;}coor;typedef struct // 棋子{ chessid id; // 棋子的id int power; // 棋子的等级 team team; // 所属方 char *image; // 该棋子的图片,考虑到运行问题,本程序用字代替 int scoopc; // 工兵是挖到的地雷数}chess;typedef struct // 区域{ coor crdld; // 区域的左下坐标 chess chess; // 区域的棋子 state state; // 区域状态}area;typedef struct // 用户的选择信息{ int i; int j; choosestate state; // 选择状态}choose;image image;area area[6][6]; // 定义棋盘大小chess datachess[19]; // 几种基本棋子类型choose choose; // 用户选择信息mousemsg mmsg; // 鼠标信息team user; // 执棋方int lockchessboard = 0; // 是否锁定棋盘int i; // 当前鼠标所在区域的坐标int j; char *str[]={工,班,排,连,营,团,旅,师,军,司,棋,炸,变,雷,飞,超,升,神,仙}; void init(); void initchessbute(); // 给初始化棋子基本参数void initvalue();void drawboard(); // 画棋盘void randomarr(int *); // 实现棋的随机排列void judge();void getpreij(); // 获得当前鼠标所在区域坐标int checkij(); // 检查当鼠标所在区域void open(); // 打开所在区域int whemove(); // 判断是否能移动void move(); // 移动int judgeunknow(); // 检测当前未翻开棋子数attstyle wheattack(); // 判断是否能攻击void kill(); // 杀死当前选择的棋void killself(); // 自杀void perishtogether(); // 同归于尽void getteam(); // 用作改变棋子类型时,对棋子所属方赋值void userchange(); // 交换执棋方void judgebunko(); // 判断输赢void choosearea(); // 选定区域void cancelchoose(); // 取消选定void change(); // 变身void bluewin(); // 蓝方胜利void redwin(); // 红方胜利void gamehelp(); // 规则说明void quit(); // 退出游戏void peace(); // 和棋void surrender(); // 投降void resetchessboard(); // 重置// 下面几个函数为判断棋子的攻击类型attstyle judgegong(); // 判断工兵attstyle judgecom(); // 判普通人物attstyle judgezha(); // 判断炸弹void main() // 主函数{ init(); while (true) { mmsg = getmousemsg(); getpreij(); if (mmsg.umsg == wm_lbuttondown) //单击左键 { judge(); } else if (mmsg.umsg == wm_rbuttondown && choose.state==alchoose) //单击右键 { cancelchoose(); } else if (mmsg.umsg == wm_mbuttondown && choose.state == alchoose && area[choose.i][choose.j].chess.id != zha) //单击中键 { killself(); cancelchoose(); userchange(); judgebunko(); } }}void init(){ initgraph(640, 480); setorigin(resetx, resety); // 重置原点 setaspectratio(1, -1); // 把 y 轴上方设为正半轴 drawboard(); initvalue();}void drawboard() // 画棋盘{ int i1; setlinecolor(white); for (i1=0; i1<7; i1++) { line(i1*chesize, 0, i1*chesize, chesize*6); } for (i1=0; i1<7; i1++) { line(0, i1*chesize, chesize*6, i1*chesize); } setlinecolor(white); setfillcolor(red); rectangle(-10, -10, chesize*6+10, chesize*6+10); floodfill(-1, -1, white); rectangle(7*chesize, chesize, 9*chesize, 6*chesize); line(7*chesize, 5*chesize, 9*chesize, 5*chesize); line(7*chesize, 4*chesize, 9*chesize, 4*chesize); line(7*chesize, 3*chesize, 9*chesize, 3*chesize); line(7*chesize, 2*chesize, 9*chesize, 2*chesize); setaspectratio(1, 1); settextstyle(35, 18, 黑体); settextcolor(red); outtextxy(7*chesize+2, -6*chesize+2, 帮助); settextcolor(brown); outtextxy(7*chesize+2, -5*chesize+2, 投降); settextcolor(green); outtextxy(7*chesize+2, -4*chesize+2, 和棋); settextcolor(yellow); outtextxy(7*chesize+2, -3*chesize+2, 重置); settextcolor(cyan); outtextxy(7*chesize+2, -2*chesize+2, 退出); settextcolor(lightmagenta); settextstyle(50, 20, 黑体); outtextxy(chesize, -chesize*8, 两国军旗); setaspectratio(1, -1);}void initchessbute() // 设置棋子基本参数{ datachess[0].id = gong; datachess[0].power = 1; datachess[0].image = str[0]; datachess[0].scoopc = 0; datachess[1].id = ban; datachess[1].power = 2; datachess[1].image = str[1]; datachess[1].scoopc = 0; datachess[2].id = pai; datachess[2].power = 3; datachess[2].image = str[2]; datachess[2].scoopc = 0; datachess[3].id = lian; datachess[3].power = 4; datachess[3].image = str[3]; datachess[3].scoopc = 0; datachess[4].id = ying; datachess[4].power = 5; datachess[4].image = str[4]; datachess[4].scoopc = 0; datachess[5].id = tuan; datachess[5].power = 6; datachess[5].image = str[5]; datachess[5].scoopc = 0; datachess[6].id = lv; datachess[6].power = 7; datachess[6].image = str[6]; datachess[6].scoopc = 0; datachess[7].id = shi; datachess[7].power = 8; datachess[7].image = str[7]; datachess[7].scoopc = 0; datachess[8].id = jun; datachess[8].power = 9; datachess[8].image = str[8]; datachess[8].scoopc = 0; datachess[9].id = si; datachess[9].power = 10; datachess[9].image = str[9]; datachess[9].scoopc = 0; datachess[10].id = qi; datachess[10].power = 100; datachess[10].image = str[10]; datachess[10].scoopc = 0; datachess[11].id = zha; datachess[11].power = 99; datachess[11].image = str[11]; datachess[11].scoopc = 0; datachess[12].id = bian; datachess[12].power = 0; datachess[12].image = str[12]; datachess[12].scoopc = 0; datachess[13].id = lei; datachess[13].power = 98; datachess[13].image = str[13]; datachess[13].scoopc = 0; datachess[14].id = fei; datachess[14].power = 9; datachess[14].image = str[14]; datachess[14].scoopc = 0; datachess[15].id = chao; datachess[15].power = 11; datachess[15].image = str[15]; datachess[15].scoopc = 0; datachess[16].id = sheng; datachess[16].power = 10; datachess[16].image = str[16]; datachess[16].scoopc = 0; datachess[17].id = shen; datachess[17].power = 11; datachess[17].image = str[17]; datachess[17].scoopc = 0; datachess[18].id = xian; datachess[18].power = 11; datachess[18].image = str[18]; datachess[18].scoopc = 0; }void initvalue() // 初始化值{ chess chess[36]; int random[36]; int count; int i1, j1; initchessbute(); randomarr(random); for (i1=0; i1<=11; i1++) { chess[i1] = datachess[i1]; chess[i1].team = red; } chess[i1] = datachess[11]; chess[i1].team = red; chess[i1+1] = datachess[0]; chess[i1+1].team = red; for (i1=0; i1<=11; i1++) { chess[i1+14] = datachess[i1]; chess[i1+14].team = blue; } chess[i1+14] = datachess[11]; chess[i1+14].team = blue; chess[i1+15] = datachess[0]; chess[i1+15].team = blue; for (i1=0; i1<4; i1++) { chess[i1+28] = datachess[12]; chess[i1+28].team = white; chess[i1+32] = datachess[13]; chess[i1+32].team = white; } setfillcolor(yellow); for (count=0, i1=0; i1<6; i1++) { for (j1=0; j1<6; j1++, count++) { area[i1][j1].chess = chess[random[count]]; area[i1][j1].crdld.x = i1 * chesize + 1; area[i1][j1].crdld.y = j1 * chesize + 1; area[i1][j1].state = unknow; floodfill(area[i1][j1].crdld.x, area[i1][j1].crdld.y, white); } } user = red; choose.state = unchoose;}void randomarr(int random[]) // 得到0~36数字的随机排列{ int i1, j1; int flag = 0; srand(time(null)); random[0] = rand() % 36 ; for (i1=1; i1<36; i1++) { while (1) { random[i1] = rand() % 36 ; for (j1=0; j1 大家赶紧去动手试试吧!


锡膏厂家浅谈一下焊锡丝的正确使用方法?
传感器在智能家居系统中的运用
铝电解电容的定义与组成
机构:Q3美国智能手机市场环比增长21% 出货3100万部
74HC165并入串出芯片概述
C语言零基础项目:自制军棋游戏!详细思路+源码分享
山东仁科荣获2021年山东省电子信息行业“最具发展潜力企业”
三星s8什么时候上市?三星s8最新消息:时隔两个月三星S8国行终要上市!价格有点不厚道!
有线电视数字机顶盒的关键技术详解
华为的世界没有弯道
同盾“基于XGBoost的跨样本联邦学习”获得国家发明专利授权
NPN型和PNP型晶体三极管导通原因是什么
TTL逻辑门电路
2021数字经济峰会上中原人工智能计算中心正式宣布投运
全球首只机器人选股基金诞生了,科技圈都炸了
一文读懂SSD硬盘
全球仅7部,白色全陶瓷小米MIX 2尊享版可遇不可求
机械化和自动化进程加快_富余劳动力的出路在哪?
ASML光刻机的工作原理,光刻机制造难度有多大?
中国IC设计业成长快速 晶圆积极布局中国