资讯专栏INFORMATION COLUMN

C语言小游戏之扫雷

Maxiye / 2548人阅读

摘要:目录一菜单模块一菜单模块二函数二函数函数声明及行数列数雷数函数声明及行数列数雷数初始化雷阵初始化雷阵打印雷阵打印雷阵布置雷阵布置雷阵计算雷数计算雷数排雷排雷函数函数三全部代码三全部代码

目录

一、菜单模块

二、game函数

1、函数声明及行数列数雷数

2、初始化雷阵

3、打印雷阵

4、布置雷阵

5、计算雷数

6、排雷

7、game函数

三、全部代码

1、main.c

2、game.h

3、game.c


一、菜单模块

菜单与井字棋类似都是先打印菜单然后用一个do……while循环嵌套switch选择玩游戏或着退出游戏,如果选择错误则提示输入错误,让用户重新选择

</>复制代码

  1. #include"game.h"void menu(){
  2. printf("**************************************/n");
  3. printf("************** 1. play ************/n");
  4. printf("**************************************/n");
  5. printf("************** 0. exit ************/n");
  6. printf("**************************************/n");}void test(){
  7. int input = 0;
  8. do
  9. {
  10. menu();
  11. scanf("%d", &input);
  12. switch (input)
  13. {
  14. case 1 :
  15. game();
  16. break;
  17. case 0 :
  18. exit(0);
  19. break;
  20. default:
  21. printf("选择错误,重新选择/n");
  22. break;
  23. }
  24. } while (input);}int main(){
  25. test();
  26. return 0;}

二、game函数

1、函数声明及行数列数雷数

</>复制代码

  1. #include#define ROW 9#define COL 9#define ROWS ROW+2#define COLS COL+2#define EASY_COUNT 10void InitBoard(char board[ROWS][COLS], int rows, int cols, char set);//初始化数组void DisplayBoard(char board[ROWS][COLS], int rows, int cols);//打印棋盘void SetMine(char board[ROWS][COLS], int row, int col);//布置雷void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col);//排查雷

为后期方便修改游戏行列数直接在宏定义出行列数

2、初始化雷阵

</>复制代码

  1. void InitBoard(char board[ROWS][COLS], int rows, int cols, char set){
  2. for (int i = 0; i < rows; i++)
  3. {
  4. for (int j = 0; j < cols; j++)
  5. {
  6. board[i][j] = set;
  7. }
  8. }}

3、打印雷阵

</>复制代码

  1. void DisplayBoard(char board[ROWS][COLS], int row, int col){
  2. int i = 0, j = 0;
  3. for (i = 0; i <= col; i++)//打印列数
  4. {
  5. printf("%d ", i);
  6. }
  7. printf("/n");
  8. for (i = 1; i <= row; i++)
  9. {
  10. printf("%d ", i);//打印行数
  11. for (j = 1; j <= col; j++)
  12. {
  13. printf("%c ", board[i][j]);
  14. }
  15. printf("/n");
  16. }}

 为方便输入要排雷的坐标在第一行打印列数,第一列打印行数

4、布置雷阵

</>复制代码

  1. void SetMine(char board[ROWS][COLS], int row, int col){
  2. int count = EASY_COUNT;
  3. while (count)
  4. {
  5. int x = rand() % row + 1;
  6. int y = rand() % col + 1;
  7. if (board[x][y] == "0")
  8. {
  9. board[x][y] = "1";
  10. count--;
  11. }
  12. }
  13. }

用count记录雷数当布置够则跳出循环,结束函数

x,y在行列数以内随机取值,如果没有雷就布置雷

为正确生成随机数在test函数中加入

</>复制代码

  1. srand((unsigned int)time(NULL));

5、计算雷数

</>复制代码

  1. int get_mine_count(char mine[ROWS][COLS], int x, int y){
  2. return mine[x - 1][y - 1] + mine[x - 1][y] + mine[x - 1][y + 1]
  3. + mine[x][y - 1] + mine[x][y + 1] - 8 * "0"
  4. + mine[x + 1][y - 1] + mine[x + 1][y] + mine[x + 1][y + 1];}

如果输入的坐标正确,计算周围八个坐标中有几个雷

因为初始化时在有雷的地方,写为字符一,没雷的地方为字符零,所以加起来减去八个字符零,就是雷的个数

6、排雷

</>复制代码

  1. void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col){
  2. int x = 0;
  3. int y = 0;
  4. int win = 0;
  5. while (win < row * col - EASY_COUNT)
  6. {
  7. printf("请输入要排查雷的坐标");
  8. scanf("%d%d", &x, &y);
  9. if (x >= 1 && x <= row && y >= 1 && y <= col)
  10. {
  11. if (mine[x][y] == "1")
  12. {
  13. printf("很遗憾,你被炸死了/n");
  14. DisplayBoard(mine, row, col);
  15. break;
  16. }
  17. else
  18. {
  19. int n = get_mine_count(mine, x, y);
  20. show[x][y] = n + "0";
  21. DisplayBoard(show, row, col);
  22. win++;
  23. }
  24. }
  25. else
  26. {
  27. printf("输入错误,请重新输入/n");
  28. }
  29. }
  30. if (win == row * col - EASY_COUNT)
  31. {
  32. printf("你赢了,排雷成功!/n");
  33. }
  34. }

若输入的坐标x,y超出行与列的范围则输入错误,让玩家重新输入

若输入的坐标x,y位置处为字符一,则踩雷输掉游戏,再打印出雷阵让玩家“瞑目”

若输入的坐标x,y位置处为字符零,预先准备一个计数器,计算排雷的数量,当数量等于所有的格子减雷的数量则排雷完成

7、game函数

</>复制代码

  1. void game(){
  2. char mine[ROWS][COLS] = { 0 };//存放布雷位置
  3. char show[ROWS][COLS] = { 0 };//存放排雷信息
  4. InitBoard(mine, ROWS, COLS, "0");//初始化mine为0
  5. InitBoard(show, ROWS, COLS, "*");//初始化show0
  6. SetMine(mine, ROW, COL);
  7. DisplayBoard(show, ROW, COL);
  8. FindMine(mine, show, ROW, COL);}

首先准备两个数组,一个存放雷的位置,一个存放排雷的信息

将mine数组全部初始化为零,show全部初始化为*

先将棋盘打印一下,然后开始排雷

三、全部代码

1、main.c

</>复制代码

  1. #define _CRT_SECURE_NO_WARNINGS 1#include"game.h"void menu(){
  2. printf("**************************************/n");
  3. printf("************** 1. play ************/n");
  4. printf("**************************************/n");
  5. printf("************** 0. exit ************/n");
  6. printf("**************************************/n");}void game(){
  7. char mine[ROWS][COLS] = { 0 };//存放布雷位置
  8. char show[ROWS][COLS] = { 0 };//存放排雷信息
  9. InitBoard(mine, ROWS, COLS, "0");//初始化mine为0
  10. InitBoard(show, ROWS, COLS, "*");//初始化show0
  11. SetMine(mine, ROW, COL);
  12. DisplayBoard(show, ROW, COL);
  13. FindMine(mine, show, ROW, COL);}void test(){
  14. srand((unsigned int)time(NULL));
  15. int input = 0;
  16. do
  17. {
  18. menu();
  19. scanf("%d", &input);
  20. switch (input)
  21. {
  22. case 1 :
  23. game();
  24. break;
  25. case 0 :
  26. exit(0);
  27. break;
  28. default:
  29. printf("选择错误,重新选择/n");
  30. break;
  31. }
  32. } while (input);}int main(){
  33. test();
  34. return 0;}

2、game.h

</>复制代码

  1. #pragma once#include#define ROW 9#define COL 9#define ROWS ROW+2#define COLS COL+2#define EASY_COUNT 10void InitBoard(char board[ROWS][COLS], int rows, int cols, char set);//初始化数组void DisplayBoard(char board[ROWS][COLS], int rows, int cols);//打印棋盘void SetMine(char board[ROWS][COLS], int row, int col);//布置雷void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col);//排查雷

3、game.c

</>复制代码

  1. #define _CRT_SECURE_NO_WARNINGS 1#include "game.h"void InitBoard(char board[ROWS][COLS], int rows, int cols, char set){
  2. for (int i = 0; i < rows; i++)
  3. {
  4. for (int j = 0; j < cols; j++)
  5. {
  6. board[i][j] = set;
  7. }
  8. }}void DisplayBoard(char board[ROWS][COLS], int row, int col){
  9. int i = 0, j = 0;
  10. for (i = 0; i <= col; i++)
  11. {
  12. printf("%d ", i);
  13. }
  14. printf("/n");
  15. for (i = 1; i <= row; i++)
  16. {
  17. printf("%d ", i);
  18. for (j = 1; j <= col; j++)
  19. {
  20. printf("%c ", board[i][j]);
  21. }
  22. printf("/n");
  23. }}void SetMine(char board[ROWS][COLS], int row, int col){
  24. int count = EASY_COUNT;
  25. while (count)
  26. {
  27. int x = rand() % row + 1;
  28. int y = rand() % col + 1;
  29. if (board[x][y] == "0")
  30. {
  31. board[x][y] = "1";
  32. count--;
  33. }
  34. }
  35. }int get_mine_count(char mine[ROWS][COLS], int x, int y){
  36. return mine[x - 1][y - 1] + mine[x - 1][y] + mine[x - 1][y + 1]
  37. + mine[x][y - 1] + mine[x][y + 1] - 8 * "0"
  38. + mine[x + 1][y - 1] + mine[x + 1][y] + mine[x + 1][y + 1];}void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col){
  39. int x = 0;
  40. int y = 0;
  41. int win = 0;
  42. while (win < row * col - EASY_COUNT)
  43. {
  44. printf("请输入要排查雷的坐标");
  45. scanf("%d%d", &x, &y);
  46. if (x >= 1 && x <= row && y >= 1 && y <= col)
  47. {
  48. if (mine[x][y] == "1")
  49. {
  50. printf("很遗憾,你被炸死了/n");
  51. DisplayBoard(mine, row, col);
  52. break;
  53. }
  54. else
  55. {
  56. int n = get_mine_count(mine, x, y);
  57. show[x][y] = n + "0";
  58. DisplayBoard(show, row, col);
  59. win++;
  60. }
  61. }
  62. else
  63. {
  64. printf("输入错误,请重新输入/n");
  65. }
  66. }
  67. if (win == row * col - EASY_COUNT)
  68. {
  69. printf("你赢了,排雷成功!/n");
  70. }
  71. }

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/123358.html

相关文章

  • C语言实现入门级游戏——扫雷

    摘要:上一期咱们用语言实现了三子棋的小游戏语言实现三子棋今天我们再来写个扫雷的游戏,说起扫雷,相信大家都不陌生,可能许多朋友还是玩扫雷的高手。      上一期咱们用C语言实现了三子棋的小游戏  C语言实现三子棋       今天我们再来写个扫雷的游戏,说起扫雷,相信大家都不陌生,可能许多朋友还是...

    nevermind 评论0 收藏0
  • C语言实现简单游戏---扫雷

    摘要:如果整个游戏的数据设计都基于一个二维数组的话相对来说容易混淆,比如只有一个数组的话,除了要对区分雷区与非雷区加以处理,还有后续排雷的信息要处理。 今天要分享给大家的是扫雷的代码实现,和前几天写的那个三子棋差不多,大体思想就是以二维数组为载体,编写设计函数来实现它的各种功能。我们先来看看最后的...

    timger 评论0 收藏0
  • C语言学习笔记—P12(扫雷游戏<初级>+图解+题例)

    目录  前言:●由于作者水平有限,文章难免存在谬误之处,敬请读者斧正,俚语成篇,恳望指教!                                                                       ——By 作者:新晓·故知                                                                       ...

    lykops 评论0 收藏0
  • 扫雷连爆(望大佬也可以帮忙优化或提出意见)(C语言版)------上

    摘要:新人小白的第一篇博客,有什么不好之处望多提意见。这个扫雷小游戏主要是基于二维数组,循环与基本的函数知识等。请输入坐标提示玩家输入坐标。换行是为了看着好看,要不然打印出来的数组会变形的。用来接收判断输赢的函数的返回值。 ​​​​​​​新人小白的第一篇博客,有什么不好之处望多提意见。      ...

    incredible 评论0 收藏0
  • [ C语言 ] 扫雷 ------> 用C语言实现game2

    摘要:函数游戏菜单请选择扫雷游戏退出游戏选择错误解析函数内部利用时间戳,形成随机数,主要目的是实现游戏中地雷的随机埋放。 前言 本篇文章使用C语言实现简单小游戏---扫雷。(文章最后有完整代码链接) 想必大多数人都玩过或者了解过扫雷的游戏规则,但是在这里,我们在一起重温一下扫雷的游戏规则,也更好...

    I_Am 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<