每天一个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 2023/2023,EasyX插件
完整源代码如下:
#include #include #include #defineCHESIZE40// 棋盘尺寸,不能随意调整#defineRESETX170#defineRESETY350// 重置原点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;// 棋子的IDint 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