当前位置:   article > 正文

C语言零基础项目:自制军棋游戏!详细思路+源码分享_基于c语言实现军棋游戏完整

基于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插件

完整源代码如下:

  1. #include <stdio.h>
  2. #include <graphics.h>
  3. #include <time.h>
  4. #define CHESIZE 40 // 棋盘尺寸,不能随意调整
  5. #define RESETX 170
  6. #define RESETY 350 // 重置原点
  7. typedef enum // 要用到的棋子ID
  8. {
  9. si, jun, shi, lv, tuan,
  10. ying, lian, pai, ban, gong,
  11. fei, chao, zha, qi, lei, bian,
  12. xian, sheng, shen
  13. }CHESSID;
  14. typedef enum // 攻击类型
  15. {
  16. comatt, preatt, noatt
  17. }ATTSTYLE;
  18. typedef enum // 当前游戏方和棋子所属方
  19. {
  20. blue, red, white
  21. }TEAM;
  22. typedef enum // 选中与未选中
  23. {
  24. alchoose, unchoose
  25. }CHOOSESTATE;
  26. typedef enum // 区域状态
  27. {
  28. unknow, empty, exist
  29. }STATE;
  30. typedef struct // 坐标
  31. {
  32. int x;
  33. int y;
  34. }COOR;
  35. typedef struct // 棋子
  36. {
  37. CHESSID id; // 棋子的ID
  38. int power; // 棋子的等级
  39. TEAM team; // 所属方
  40. char *image; // 该棋子的图片,考虑到运行问题,本程序用字代替
  41. int scoopc; // 工兵是挖到的地雷数
  42. }CHESS;
  43. typedef struct // 区域
  44. {
  45. COOR crdld; // 区域的左下坐标
  46. CHESS chess; // 区域的棋子
  47. STATE state; // 区域状态
  48. }AREA;
  49. typedef struct // 用户的选择信息
  50. {
  51. int i;
  52. int j;
  53. CHOOSESTATE state; // 选择状态
  54. }CHOOSE;
  55. IMAGE image;
  56. AREA area[6][6]; // 定义棋盘大小
  57. CHESS datachess[19]; // 几种基本棋子类型
  58. CHOOSE choose; // 用户选择信息
  59. MOUSEMSG mmsg; // 鼠标信息
  60. TEAM user; // 执棋方
  61. int lockchessboard = 0; // 是否锁定棋盘
  62. int i; // 当前鼠标所在区域的坐标
  63. int j;
  64. char *str[]={"工","班","排","连","营","团","旅","师","军","司","棋","炸","变","雷","飞","超","升","神","仙"};
  65. void init();
  66. void initchessbute(); // 给初始化棋子基本参数
  67. void initvalue();
  68. void drawboard(); // 画棋盘
  69. void randomarr(int *); // 实现棋的随机排列
  70. void judge();
  71. void getpreij(); // 获得当前鼠标所在区域坐标
  72. int checkij(); // 检查当鼠标所在区域
  73. void open(); // 打开所在区域
  74. int whemove(); // 判断是否能移动
  75. void move(); // 移动
  76. int judgeunknow(); // 检测当前未翻开棋子数
  77. ATTSTYLE wheattack(); // 判断是否能攻击
  78. void kill(); // 杀死当前选择的棋
  79. void killself(); // 自杀
  80. void perishtogether(); // 同归于尽
  81. void getteam(); // 用作改变棋子类型时,对棋子所属方赋值
  82. void userchange(); // 交换执棋方
  83. void judgebunko(); // 判断输赢
  84. void choosearea(); // 选定区域
  85. void cancelchoose(); // 取消选定
  86. void change(); // 变身
  87. void bluewin(); // 蓝方胜利
  88. void redwin(); // 红方胜利
  89. void gamehelp(); // 规则说明
  90. void quit(); // 退出游戏
  91. void peace(); // 和棋
  92. void surrender(); // 投降
  93. void resetchessboard(); // 重置
  94. // 下面几个函数为判断棋子的攻击类型
  95. ATTSTYLE judgegong(); // 判断工兵
  96. ATTSTYLE judgecom(); // 判普通人物
  97. ATTSTYLE judgezha(); // 判断炸弹
  98. void main() // 主函数
  99. {
  100. init();
  101. while (true)
  102. {
  103. mmsg = GetMouseMsg();
  104. getpreij();
  105. if (mmsg.uMsg == WM_LBUTTONDOWN) //单击左键
  106. {
  107. judge();
  108. }
  109. else if (mmsg.uMsg == WM_RBUTTONDOWN
  110. && choose.state==alchoose) //单击右键
  111. {
  112. cancelchoose();
  113. }
  114. else if (mmsg.uMsg == WM_MBUTTONDOWN
  115. && choose.state == alchoose
  116. && area[choose.i][choose.j].chess.id != zha) //单击中键
  117. {
  118. killself();
  119. cancelchoose();
  120. userchange();
  121. judgebunko();
  122. }
  123. }
  124. }
  125. void init()
  126. {
  127. initgraph(640, 480);
  128. setorigin(RESETX, RESETY); // 重置原点
  129. setaspectratio(1, -1); // 把 y 轴上方设为正半轴
  130. drawboard();
  131. initvalue();
  132. }
  133. void drawboard() // 画棋盘
  134. {
  135. int i1;
  136. setlinecolor(WHITE);
  137. for (i1=0; i1<7; i1++)
  138. {
  139. line(i1*CHESIZE, 0, i1*CHESIZE, CHESIZE*6);
  140. }
  141. for (i1=0; i1<7; i1++)
  142. {
  143. line(0, i1*CHESIZE, CHESIZE*6, i1*CHESIZE);
  144. }
  145. setlinecolor(WHITE);
  146. setfillcolor(RED);
  147. rectangle(-10, -10, CHESIZE*6+10, CHESIZE*6+10);
  148. floodfill(-1, -1, WHITE);
  149. rectangle(7*CHESIZE, CHESIZE, 9*CHESIZE, 6*CHESIZE);
  150. line(7*CHESIZE, 5*CHESIZE, 9*CHESIZE, 5*CHESIZE);
  151. line(7*CHESIZE, 4*CHESIZE, 9*CHESIZE, 4*CHESIZE);
  152. line(7*CHESIZE, 3*CHESIZE, 9*CHESIZE, 3*CHESIZE);
  153. line(7*CHESIZE, 2*CHESIZE, 9*CHESIZE, 2*CHESIZE);
  154. setaspectratio(1, 1);
  155. settextstyle(35, 18, "黑体");
  156. settextcolor(RED);
  157. outtextxy(7*CHESIZE+2, -6*CHESIZE+2, "帮助");
  158. settextcolor(BROWN);
  159. outtextxy(7*CHESIZE+2, -5*CHESIZE+2, "投降");
  160. settextcolor(GREEN);
  161. outtextxy(7*CHESIZE+2, -4*CHESIZE+2, "和棋");
  162. settextcolor(YELLOW);
  163. outtextxy(7*CHESIZE+2, -3*CHESIZE+2, "重置");
  164. settextcolor(CYAN);
  165. outtextxy(7*CHESIZE+2, -2*CHESIZE+2, "退出");
  166. settextcolor(LIGHTMAGENTA);
  167. settextstyle(50, 20, "黑体");
  168. outtextxy(CHESIZE, -CHESIZE*8, "两国军旗");
  169. setaspectratio(1, -1);
  170. }
  171. void initchessbute() // 设置棋子基本参数
  172. {
  173. datachess[0].id = gong;
  174. datachess[0].power = 1;
  175. datachess[0].image = str[0];
  176. datachess[0].scoopc = 0;
  177. datachess[1].id = ban;
  178. datachess[1].power = 2;
  179. datachess[1].image = str[1];
  180. datachess[1].scoopc = 0;
  181. datachess[2].id = pai;
  182. datachess[2].power = 3;
  183. datachess[2].image = str[2];
  184. datachess[2].scoopc = 0;
  185. datachess[3].id = lian;
  186. datachess[3].power = 4;
  187. datachess[3].image = str[3];
  188. datachess[3].scoopc = 0;
  189. datachess[4].id = ying;
  190. datachess[4].power = 5;
  191. datachess[4].image = str[4];
  192. datachess[4].scoopc = 0;
  193. datachess[5].id = tuan;
  194. datachess[5].power = 6;
  195. datachess[5].image = str[5];
  196. datachess[5].scoopc = 0;
  197. datachess[6].id = lv;
  198. datachess[6].power = 7;
  199. datachess[6].image = str[6];
  200. datachess[6].scoopc = 0;
  201. datachess[7].id = shi;
  202. datachess[7].power = 8;
  203. datachess[7].image = str[7];
  204. datachess[7].scoopc = 0;
  205. datachess[8].id = jun;
  206. datachess[8].power = 9;
  207. datachess[8].image = str[8];
  208. datachess[8].scoopc = 0;
  209. datachess[9].id = si;
  210. datachess[9].power = 10;
  211. datachess[9].image = str[9];
  212. datachess[9].scoopc = 0;
  213. datachess[10].id = qi;
  214. datachess[10].power = 100;
  215. datachess[10].image = str[10];
  216. datachess[10].scoopc = 0;
  217. datachess[11].id = zha;
  218. datachess[11].power = 99;
  219. datachess[11].image = str[11];
  220. datachess[11].scoopc = 0;
  221. datachess[12].id = bian;
  222. datachess[12].power = 0;
  223. datachess[12].image = str[12];
  224. datachess[12].scoopc = 0;
  225. datachess[13].id = lei;
  226. datachess[13].power = 98;
  227. datachess[13].image = str[13];
  228. datachess[13].scoopc = 0;
  229. datachess[14].id = fei;
  230. datachess[14].power = 9;
  231. datachess[14].image = str[14];
  232. datachess[14].scoopc = 0;
  233. datachess[15].id = chao;
  234. datachess[15].power = 11;
  235. datachess[15].image = str[15];
  236. datachess[15].scoopc = 0;
  237. datachess[16].id = sheng;
  238. datachess[16].power = 10;
  239. datachess[16].image = str[16];
  240. datachess[16].scoopc = 0;
  241. datachess[17].id = shen;
  242. datachess[17].power = 11;
  243. datachess[17].image = str[17];
  244. datachess[17].scoopc = 0;
  245. datachess[18].id = xian;
  246. datachess[18].power = 11;
  247. datachess[18].image = str[18];
  248. datachess[18].scoopc = 0;
  249. }
  250. void initvalue() // 初始化值
  251. {
  252. CHESS chess[36];
  253. int random[36];
  254. int count;
  255. int i1, j1;
  256. initchessbute();
  257. randomarr(random);
  258. for (i1=0; i1<=11; i1++)
  259. {
  260. chess[i1] = datachess[i1];
  261. chess[i1].team = red;
  262. }
  263. chess[i1] = datachess[11];
  264. chess[i1].team = red;
  265. chess[i1+1] = datachess[0];
  266. chess[i1+1].team = red;
  267. for (i1=0; i1<=11; i1++)
  268. {
  269. chess[i1+14] = datachess[i1];
  270. chess[i1+14].team = blue;
  271. }
  272. chess[i1+14] = datachess[11];
  273. chess[i1+14].team = blue;
  274. chess[i1+15] = datachess[0];
  275. chess[i1+15].team = blue;
  276. for (i1=0; i1<4; i1++)
  277. {
  278. chess[i1+28] = datachess[12];
  279. chess[i1+28].team = white;
  280. chess[i1+32] = datachess[13];
  281. chess[i1+32].team = white;
  282. }
  283. setfillcolor(YELLOW);
  284. for (count=0, i1=0; i1<6; i1++)
  285. {
  286. for (j1=0; j1<6; j1++, count++)
  287. {
  288. area[i1][j1].chess = chess[random[count]];
  289. area[i1][j1].crdld.x = i1 * CHESIZE + 1;
  290. area[i1][j1].crdld.y = j1 * CHESIZE + 1;
  291. area[i1][j1].state = unknow;
  292. floodfill(area[i1][j1].crdld.x, area[i1][j1].crdld.y, WHITE);
  293. }
  294. }
  295. user = red;
  296. choose.state = unchoose;
  297. }
  298. void randomarr(int random[]) // 得到0~36数字的随机排列
  299. {
  300. int i1, j1;
  301. int flag = 0;
  302. srand(time(NULL));
  303. random[0] = rand() % 36 ;
  304. for (i1=1; i1<36; i1++)
  305. {
  306. while (1)
  307. {
  308. random[i1] = rand() % 36 ;
  309. for (j1=0; j1<i1; j1++)
  310. {
  311. if (random[j1] == random[i1])
  312. {
  313. flag = 1;
  314. break;
  315. }
  316. }
  317. if (flag)
  318. {
  319. flag = 0;
  320. }
  321. else
  322. {
  323. break;
  324. }
  325. }
  326. }
  327. }
  328. void judge() // 判断当前要进行的操作
  329. {
  330. ATTSTYLE attstyle; // 攻击类型
  331. getpreij();
  332. if (checkij())
  333. {
  334. if (area[i][j].state==unknow && choose.state==unchoose) // 打开
  335. {
  336. open();
  337. userchange();
  338. }
  339. else if(area[i][j].state == empty)
  340. {
  341. if (choose.state == alchoose) // 移动
  342. {
  343. if (whemove())
  344. {
  345. move();
  346. cancelchoose();
  347. userchange();
  348. }
  349. }
  350. }
  351. else
  352. {
  353. if (choose.state == unchoose)
  354. {
  355. if (area[i][j].chess.team==user && area[i][j].chess.id!=qi) //选定
  356. {
  357. choosearea();
  358. }
  359. }
  360. else
  361. {
  362. if (area[i][j].state!=unknow) // 攻击
  363. {
  364. attstyle = wheattack();
  365. if (attstyle == comatt)
  366. {
  367. kill();
  368. cancelchoose();
  369. userchange();
  370. }
  371. else if (attstyle == preatt)
  372. {
  373. perishtogether();
  374. cancelchoose();
  375. userchange();
  376. }
  377. else
  378. {
  379. ;
  380. }
  381. }
  382. }
  383. }
  384. if (!judgeunknow()) // 在所有棋子都翻开的情况下判断输赢
  385. {
  386. judgebunko();
  387. }
  388. }
  389. }
  390. int judgeunknow()
  391. {
  392. int i1, i2;
  393. int num = 0;
  394. for (i1=0; i1<6; i1++)
  395. {
  396. for (i2=0; i2<6; i2++)
  397. {
  398. if (area[i1][i2].state == unknow)
  399. {
  400. num++;
  401. }
  402. }
  403. }
  404. return num;
  405. }
  406. // 选择区域
  407. void choosearea()
  408. {
  409. choose.i = i;
  410. choose.j = j;
  411. choose.state = alchoose;
  412. setlinecolor(GREEN);
  413. rectangle(choose.i*CHESIZE, choose.j*CHESIZE, choose.i*CHESIZE+CHESIZE, choose.j*CHESIZE+CHESIZE);
  414. }
  415. // 取消选定
  416. void cancelchoose()
  417. {
  418. setlinecolor(WHITE);
  419. rectangle(choose.i*CHESIZE, choose.j*CHESIZE, choose.i*CHESIZE+CHESIZE, choose.j*CHESIZE+CHESIZE);
  420. choose.state = unchoose;
  421. }
  422. // 当前鼠标所在区域
  423. void getpreij()
  424. {
  425. i = (mmsg.x-RESETX) / CHESIZE;
  426. j = -(mmsg.y-RESETY) / CHESIZE;
  427. }
  428. // 检查鼠标是否在有效区域内
  429. int checkij()
  430. {
  431. if ((i==7 || i==8) && j==5)
  432. {
  433. gamehelp();
  434. return 0;
  435. }
  436. else if ((i==7 || i==8) && j==4)
  437. {
  438. if (!lockchessboard)
  439. {
  440. surrender();
  441. }
  442. return 0;
  443. }
  444. else if ((i==7 || i==8) && j==3)
  445. {
  446. if (!lockchessboard)
  447. {
  448. peace();
  449. }
  450. return 0;
  451. }
  452. else if ((i==7 || i==8) && j==2)
  453. {
  454. resetchessboard();
  455. lockchessboard = 0;
  456. return 0;
  457. }
  458. else if ((i==7 || i==8) && j==1)
  459. {
  460. quit();
  461. return 0;
  462. }
  463. else
  464. {
  465. if (!lockchessboard)
  466. {
  467. if ((i>=0 && i<=5 && j>=0 && j<=5 && (mmsg.x-RESETX)>0 && -(mmsg.y-RESETY)>0))
  468. {
  469. return 1;
  470. }
  471. else
  472. {
  473. return 0;
  474. }
  475. }
  476. else
  477. {
  478. return 0;
  479. }
  480. }
  481. }
  482. // 打开操作
  483. void open()
  484. {
  485. setfillcolor(BLACK);
  486. floodfill(area[i][j].crdld.x, area[i][j].crdld.y, WHITE);
  487. setaspectratio(1, 1);
  488. if (area[i][j].chess.team == blue)
  489. {
  490. settextcolor(BLUE);
  491. }
  492. else if (area[i][j].chess.team == red)
  493. {
  494. settextcolor(RED);
  495. }
  496. else
  497. {
  498. settextcolor(MAGENTA);
  499. }
  500. settextstyle(35, 18, "黑体");
  501. outtextxy(area[i][j].crdld.x, -area[i][j].crdld.y-CHESIZE+2, area[i][j].chess.image);
  502. area[i][j].state = exist;
  503. setaspectratio(1, -1);
  504. }
  505. // 判断是否能移动
  506. int whemove()
  507. {
  508. if (area[choose.i][choose.j].chess.id==fei || area[choose.i][choose.j].chess.id==sheng
  509. || area[choose.i][choose.j].chess.id==shen)
  510. {
  511. if (choose.i==i && abs(choose.j-j)<=5 || choose.j==j && abs(choose.i-i)<=5)
  512. {
  513. return 1;
  514. }
  515. else
  516. {
  517. return 0;
  518. }
  519. }
  520. else if (area[choose.i][choose.j].chess.id == xian)
  521. {
  522. return 1;
  523. }
  524. else
  525. {
  526. if (choose.i==i && abs(choose.j-j)==1 || choose.j==j && abs(choose.i-i)==1)
  527. {
  528. return 1;
  529. }
  530. else
  531. {
  532. return 0;
  533. }
  534. }
  535. }
  536. // 移动
  537. void move()
  538. {
  539. setfillcolor(BLACK);
  540. floodfill(area[choose.i][choose.j].crdld.x, area[choose.i][choose.j].crdld.y, GREEN);
  541. setaspectratio(1, 1);
  542. if (area[choose.i][choose.j].chess.id==gong && area[choose.i][choose.j].chess.scoopc>0)
  543. {
  544. if (area[choose.i][choose.j].chess.team == blue)
  545. {
  546. settextcolor(LIGHTBLUE);
  547. }
  548. else
  549. {
  550. settextcolor(LIGHTRED);
  551. }
  552. }
  553. else
  554. {
  555. if (user == blue)
  556. {
  557. settextcolor(BLUE);
  558. }
  559. else
  560. {
  561. settextcolor(RED);
  562. }
  563. }
  564. settextstyle(35, 18, "黑体");
  565. outtextxy(area[i][j].crdld.x, -area[i][j].crdld.y-CHESIZE+2, area[choose.i][choose.j].chess.image);
  566. area[choose.i][choose.j].state = empty;
  567. area[i][j].state = exist;
  568. area[i][j].chess = area[choose.i][choose.j].chess;
  569. setaspectratio(1, -1);
  570. }
  571. // 判断是否能攻击,并返回攻击类型
  572. ATTSTYLE wheattack()
  573. {
  574. if (whemove())
  575. {
  576. if (area[choose.i][choose.j].chess.id == gong)
  577. {
  578. return judgegong();
  579. }
  580. else if (area[choose.i][choose.j].chess.id == zha)
  581. {
  582. return judgezha();
  583. }
  584. else
  585. {
  586. return judgecom();
  587. }
  588. }
  589. else
  590. {
  591. return noatt;
  592. }
  593. }
  594. // 判断工兵
  595. ATTSTYLE judgegong()
  596. {
  597. if (area[i][j].chess.team != white)
  598. {
  599. if (area[choose.i][choose.j].chess.team != area[i][j].chess.team)
  600. {
  601. if (area[i][j].chess.id==gong || area[i][j].chess.id==zha)
  602. {
  603. return preatt;
  604. }
  605. else if (area[i][j].chess.id == qi)
  606. {
  607. if (area[choose.i][choose.j].chess.scoopc == 0)
  608. {
  609. return noatt;
  610. }
  611. else if (area[choose.i][choose.j].chess.scoopc == 1)
  612. {
  613. area[choose.i][choose.j].chess = datachess[14];
  614. getteam();
  615. return comatt;
  616. }
  617. else if (area[choose.i][choose.j].chess.scoopc == 2)
  618. {
  619. area[choose.i][choose.j].chess = datachess[16];
  620. getteam();
  621. return comatt;
  622. }
  623. else if (area[choose.i][choose.j].chess.scoopc == 3)
  624. {
  625. area[choose.i][choose.j].chess = datachess[17];
  626. getteam();
  627. return comatt;
  628. }
  629. else
  630. {
  631. area[choose.i][choose.j].chess = datachess[18];
  632. getteam();
  633. return comatt;
  634. }
  635. }
  636. else
  637. {
  638. return noatt;
  639. }
  640. }
  641. else
  642. {
  643. return noatt;
  644. }
  645. }
  646. else
  647. {
  648. if (area[i][j].chess.id == lei)
  649. {
  650. area[choose.i][choose.j].chess.scoopc++;
  651. return comatt;
  652. }
  653. else
  654. {
  655. change();
  656. return comatt;
  657. }
  658. }
  659. }
  660. // 判断炸弹
  661. ATTSTYLE judgezha()
  662. {
  663. if (area[choose.i][choose.j].chess.team != area[i][j].chess.team)
  664. {
  665. if (area[i][j].chess.id != qi)
  666. {
  667. return preatt;
  668. }
  669. else
  670. {
  671. return noatt;
  672. }
  673. }
  674. else
  675. {
  676. return noatt;
  677. }
  678. }
  679. // 判断普通人物
  680. ATTSTYLE judgecom()
  681. {
  682. if (area[i][j].chess.team != white)
  683. {
  684. if (area[choose.i][choose.j].chess.team != area[i][j].chess.team)
  685. {
  686. if (area[choose.i][choose.j].chess.power==area[i][j].chess.power || area[i][j].chess.id==zha)
  687. {
  688. return preatt;
  689. }
  690. else if (area[choose.i][choose.j].chess.power > area[i][j].chess.power)
  691. {
  692. return comatt;
  693. }
  694. else
  695. {
  696. return noatt;
  697. }
  698. }
  699. else
  700. {
  701. return noatt;
  702. }
  703. }
  704. else
  705. {
  706. if (area[i][j].chess.id == lei)
  707. {
  708. return noatt;
  709. }
  710. else
  711. {
  712. change();
  713. return comatt;
  714. }
  715. }
  716. }
  717. // 变身
  718. void change()
  719. {
  720. int x;
  721. x = rand() % 50;
  722. if (x == 6)
  723. {
  724. area[choose.i][choose.j].chess = datachess[15];
  725. getteam();
  726. }
  727. else
  728. {
  729. x = rand() % 4;
  730. if (x == 3)
  731. {
  732. x = rand() % 2;
  733. if (x == 0)
  734. {
  735. area[choose.i][choose.j].chess = datachess[7];
  736. }
  737. else
  738. {
  739. area[choose.i][choose.j].chess = datachess[8];
  740. }
  741. getteam();
  742. }
  743. else
  744. {
  745. x = rand() % 6;
  746. area[choose.i][choose.j].chess = datachess[x];
  747. getteam();
  748. }
  749. }
  750. }
  751. // 对棋子所属方赋值
  752. void getteam()
  753. {
  754. if (user == blue)
  755. {
  756. area[choose.i][choose.j].chess.team = blue;
  757. }
  758. else
  759. {
  760. area[choose.i][choose.j].chess.team = red;
  761. }
  762. }
  763. // 杀死对方
  764. void kill()
  765. {
  766. move();
  767. }
  768. // 自杀
  769. void killself()
  770. {
  771. setfillcolor(BLACK);
  772. floodfill(area[choose.i][choose.j].crdld.x, area[choose.i][choose.j].crdld.y, GREEN);
  773. area[choose.i][choose.j].state = empty;
  774. }
  775. // 同归于尽
  776. void perishtogether()
  777. {
  778. setfillcolor(BLACK);
  779. cancelchoose();
  780. floodfill(area[choose.i][choose.j].crdld.x, area[choose.i][choose.j].crdld.y, WHITE);
  781. floodfill(area[i][j].crdld.x, area[i][j].crdld.y, WHITE);
  782. area[choose.i][choose.j].state = empty;
  783. area[i][j].state = empty;
  784. }
  785. // 切换执棋方
  786. void userchange()
  787. {
  788. if (user == blue)
  789. {
  790. user = red;
  791. setfillcolor(RED);
  792. floodfill(-1, -1, WHITE);
  793. }
  794. else
  795. {
  796. user = blue;
  797. setfillcolor(BLUE);
  798. floodfill(-1, -1, WHITE);
  799. }
  800. }
  801. // 判断输赢
  802. void judgebunko()
  803. {
  804. int i1, j1;
  805. int num1 = 0, num2 = 0;
  806. for (i1=0; i1<6; i1++)
  807. {
  808. for (j1=0; j1<6; j1++)
  809. {
  810. if (area[i1][j1].state != empty)
  811. {
  812. if (area[i1][j1].chess.team==red && area[i1][j1].chess.id!=qi)
  813. {
  814. num1++;
  815. }
  816. else if(area[i1][j1].chess.team==blue && area[i1][j1].chess.id!=qi)
  817. {
  818. num2++;
  819. }
  820. }
  821. }
  822. }
  823. if (num1==0 && num2!=0)
  824. {
  825. bluewin();
  826. }
  827. if (num2==0 && num1!=0)
  828. {
  829. redwin();
  830. }
  831. if (num1==0 && num2==0)
  832. {
  833. peace();
  834. }
  835. }
  836. // 蓝方胜
  837. void bluewin()
  838. {
  839. setaspectratio(1, 1);
  840. settextcolor(BLUE);
  841. settextstyle(50, 20, "黑体");
  842. outtextxy(CHESIZE, -CHESIZE*8, "蓝方胜利");
  843. setaspectratio(1, -1);
  844. setfillcolor(BLUE);
  845. floodfill(-1, -1, WHITE);
  846. lockchessboard = 1; //锁定棋盘
  847. }
  848. // 红方胜
  849. void redwin()
  850. {
  851. setaspectratio(1, 1);
  852. settextcolor(RED);
  853. settextstyle(50, 20, "黑体");
  854. outtextxy(CHESIZE, -CHESIZE*8, "红方胜利");
  855. setaspectratio(1, -1);
  856. setfillcolor(RED);
  857. floodfill(-1, -1, WHITE);
  858. lockchessboard = 1;
  859. }
  860. // 和棋
  861. void peace()
  862. {
  863. setaspectratio(1, 1);
  864. settextcolor(GREEN);
  865. settextstyle(50, 20, "黑体");
  866. outtextxy(CHESIZE, -CHESIZE*8, "握手言和");
  867. setaspectratio(1, -1);
  868. setfillcolor(GREEN);
  869. floodfill(-1, -1, WHITE);
  870. lockchessboard = 1;
  871. }
  872. // 投降
  873. void surrender()
  874. {
  875. if (user == blue)
  876. {
  877. redwin();
  878. }
  879. else
  880. {
  881. bluewin();
  882. }
  883. }
  884. // 重置
  885. void resetchessboard()
  886. {
  887. cleardevice();
  888. init();
  889. }
  890. // 游戏说明
  891. void gamehelp()
  892. {
  893. getimage(&image, -10, -10, 500, 350);
  894. cleardevice();
  895. setorigin(50, 0);
  896. setaspectratio(1, 1);
  897. settextcolor(RED);
  898. settextstyle(14, 0, "黑体");
  899. outtextxy(-50, 0, "注:单击鼠标左键回到游戏界面");
  900. settextcolor(WHITE);
  901. settextstyle(24, 0, "黑体");
  902. outtextxy(230, 5, "游戏说明");
  903. settextstyle(12, 0, "宋体");
  904. outtextxy(0, 35, "棋盘大小:6*6; 棋子总数:36; 敌对双方:红,蓝");
  905. outtextxy(0, 60, "棋子类别:红棋(红方操作,14个) 蓝棋(蓝方操作,14个) 紫棋(功能棋,8个)");
  906. outtextxy(0, 85, "红棋(蓝棋)类型:司令,军长,师长,旅长,团长,营长,连长,班长,军旗,工兵*2,炸弹*2.");
  907. outtextxy(0, 100, "紫棋类型:地雷*4,变身棋*4. 注:'*'后面表示该棋的数量,没注则只有一个");
  908. outtextxy(0, 125, "规则说明:1.司令最大,工兵最小,大的吃小的,一样就同归于尽,");
  909. outtextxy(textwidth("规则说明:1."), 140, "炸弹能炸紫棋和敌方除军旗外所有的棋(炸弹也会消失)." );
  910. outtextxy(textwidth("规则说明:"), 155, "2.工兵可挖地雷,挖完后可扛对方棋变身(挖的雷越多,变成的人物越厉害).");
  911. outtextxy(textwidth("规则说明:"), 170, "3.人物棋可吃变,吃后能变成工兵~军长中的一种,有一定几率变成隐藏BOSS.");
  912. outtextxy(textwidth("规则说明:"), 185, "4.人物棋可自杀(算一次操作).");
  913. outtextxy(textwidth("规则说明:"), 200, "5.执棋方进行完一次有效操作后,就换对方执棋(边框颜色表当前执棋方).");
  914. outtextxy(textwidth("规则说明:"), 215, "6.一方棋子(军旗除外)全被消灭,就算输; 同时全部没有,则和棋.");
  915. outtextxy(0, 240, "执棋方能进行的操作:操作1:打开棋子(算一次操作).");
  916. outtextxy(textwidth("执棋方能进行的操作:"), 255, "操作2:攻击.");
  917. outtextxy(textwidth("执棋方能进行的操作:"), 270, "操作3:移动.");
  918. outtextxy(textwidth("执棋方能进行的操作:"), 285, "操作4:工兵(已挖雷)扛旗.");
  919. outtextxy(textwidth("执棋方能进行的操作:"), 300, "操作5:吃变身卡.");
  920. outtextxy(textwidth("执棋方能进行的操作:"), 315, "操作6:自杀.");
  921. outtextxy(0, 340, "实施游戏操作说明(鼠标操作):实施操作1:选择要打开棋子所在的区域,单击.");
  922. outtextxy(textwidth("实施游戏操作说明(鼠标操作):"), 355, "实施操作2~5:单击选中主动方(棋子边框会变绿)");
  923. outtextxy(textwidth("实施游戏操作说明(鼠标操作):实施操作2~5:"), 370, "再单击选中被动方.");
  924. outtextxy(textwidth("实施游戏操作说明(鼠标操作):"), 385, "实施操作6:选中己方棋子,单机鼠标的中键.");
  925. settextcolor(RED);
  926. outtextxy(textwidth("实施游戏操作说明(鼠标操作):"), 400,"注:要进行其他操作,必先撤销当前选定(单击右键撤销)");
  927. settextcolor(WHITE);
  928. setlinecolor(WHITE);
  929. line(-30, 420, 570, 420);
  930. outtextxy(0, 425, "人物棋等级一览(等高杀等小):工1 班2 连3 营4 团5 旅6 师7");
  931. outtextxy(textwidth("人物棋等级一览(等高杀等小):"), 440, "军8 飞8 司9 升9 神10 仙10");
  932. outtextxy(0, 455, "注:'飞' '升' '神' '仙' 都为工兵挖雷后扛旗所变,'飞''升''神'能直线飞,'仙'能满天飞");
  933. while (true)
  934. {
  935. mmsg = GetMouseMsg();
  936. if (mmsg.uMsg == WM_LBUTTONDOWN)
  937. {
  938. break;
  939. }
  940. }
  941. cleardevice();
  942. setorigin(RESETX, RESETY);
  943. setaspectratio(1, -1);
  944. putimage(-10, -10, &image);
  945. }
  946. // 退出游戏
  947. void quit()
  948. {
  949. closegraph();
  950. }

大家赶紧去动手试试吧!

此外,我也给大家分享我收集的其他资源,从最零基础开始的教程到C语言C++项目案例,帮助大家在学习C语言的道路上披荆斩棘!

 

整理分享(多年学习的源码、项目实战视频、项目笔记,基础入门教程)最重要的是你可以在群里面交流提问编程问题哦!

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

声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号