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

您所在的位置:网站首页 军旗游戏单机 C语言零基础项目:自制军棋游戏!详细思路+源码分享

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

2024-07-10 14:55| 来源: 网络整理| 查看: 265

每天一个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


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3