基于C语言控制台输出的扫雷游戏

test.c

 1 #define _CRT_SECURE_NO_WARNINGS
 2 
 3 #include "game.h"
 4 
 5 void menu()
 6 {
 7     printf("************************\n");
 8     printf("***** 1.开始游戏  ******\n");
 9     printf("***** 0.退出游戏  ******\n");
10     printf("************************\n");
11     printf("请选择>>\n");
12 }
13 
14 void game()
15 {
16     //创建数组
17     //存雷的数组
18     char mine[ROWS][COLS] = { 0 };
19     //显示面板的数组
20     char show[ROWS][COLS] = { 0 };
21     //初始化
22     InItBoard(mine, ROWS, COLS, '0');
23     InItBoard(show, ROWS, COLS, '*');
24     //打印面板
25     //PrintBoard(mine, ROW, COL);
26     PrintBoard(show, ROW, COL);
27     //埋雷
28     SetMine(mine,ROW,COL);
29     //PrintBoard(mine, ROW, COL);
30     //扫雷
31     ClearMine(show,mine,ROW,COL);
32 }
33 int main()
34 {
35     int input = 0;
36     srand((unsigned int)time(NULL));
37     do
38     {
39         menu();
40         scanf("%d", &input);
41         switch (input)
42         {
43         case 1:
44             game();
45             break;
46         case 0:
47             printf("退出游戏\n");
48             break;
49         default:
50             printf("选择错误,请重新选择\n");
51             break;
52         }
53 
54     } while (input);
55     return 0;
56 }

game.h

 1 #define _CRT_SECURE_NO_WARNINGS
 2 #define ROW 9
 3 #define COL 9
 4 #define ROWS ROW+2
 5 #define COLS COL+2
 6 #define MINE 10
 7 
 8 #include <stdio.h>
 9 #include <time.h>
10 #include <stdlib.h>
11 //初始化  参数(数组 ;行;列;字符)
12 void InItBoard(char Board[ROWS][COLS],int row,int col,char set);
13 //打印     参数(数组 ;行;列)
14 void PrintBoard(char Board[ROWS][COLS], int row, int col);
15 //埋雷   参数(数组 ;行;列)
16 void SetMine(char Mine[ROWS][COLS],int row,int col);
17 //扫雷  参数(数组 ;行;列)
18 void ClearMine(char Board[ROWS][COLS], char Mine[ROWS][COLS],int row, int col);

game.c

  1 #include "game.h"
  2 
  3 
  4 //初始化数组
  5 void InItBoard(char Board[ROWS][COLS], int row, int col, char set)
  6 {
  7     int i, j;
  8     for  (i = 0; i < ROWS; i++)
  9     {
 10         for (j = 0; j < COLS; j++)
 11         {
 12             Board[i][j] = set;
 13         }
 14     }
 15 }
 16 
 17 //打印
 18 void PrintBoard(char Board[ROWS][COLS], int row, int col)
 19 {
 20     int i, j;
 21     for (i = 0; i <= ROW;i++)
 22     {
 23         printf("%d ",i);
 24     }
 25     printf("\n");
 26     for (i = 1; i < ROWS-1; i++)
 27     {
 28         printf("%d ", i);
 29         for (j = 1; j < COLS-1; j++)
 30         {
 31             printf("%c ", Board[i][j]);
 32         }
 33         printf("\n");
 34     }
 35 }
 36 
 37 //埋雷
 38 void SetMine(char Mine[ROWS][COLS], int row, int col)
 39 {
 40     int x, y,i =0;
 41     
 42     while (i < MINE)
 43     {
 44         x = rand() % row+1;
 45         y = rand() % col+1;
 46         if (Mine[x][y] == '0')
 47         {
 48             Mine[x][y] = '1';
 49             i++;
 50         }
 51     }
 52 }
 53 
 54 //搜索周围8个格子有几个雷
 55 int SumMine(char Mine[ROWS][COLS], int x, int y)
 56 {
 57     return Mine[x - 1][y - 1] +
 58     Mine[x - 1][y] +
 59     Mine[x - 1][y + 1] +
 60     Mine[x][y + 1] +
 61     Mine[x + 1][y + 1] +
 62     Mine[x + 1][y] +
 63     Mine[x + 1][y - 1] +
 64     Mine[x][y - 1] - '0'*8;
 65 }
 66 
 67 //自动打开
 68 void AutoDisplay1(char Board[ROWS][COLS], char Mine[ROWS][COLS], int x, int y)
 69 {
 70     int i, j;
 71     if (Board[x][y] == '0'&&x > 0 && x<10 && y>0 && y < 10)
 72     {
 73         if (Board[x - 1][y] == '*')
 74         {
 75             Board[x - 1][y] = SumMine(Mine, x - 1, y) + '0';
 76             AutoDisplay1(Board, Mine, x-1, y);
 77             
 78         }
 79         if(Board[x][y + 1] == '*')
 80         {
 81             Board[x][y + 1] = SumMine(Mine, x, y + 1) + '0';
 82             AutoDisplay1(Board, Mine, x, y + 1);
 83         }
 84         if (Board[x + 1][y] =='*' )
 85         {
 86             Board[x + 1][y] = SumMine(Mine, x + 1, y) + '0';
 87             AutoDisplay1(Board, Mine, x + 1, y);
 88         }
 89         if (Board[x][y - 1]=='*')
 90         {
 91             Board[x][y - 1] = SumMine(Mine, x, y - 1) + '0';
 92             AutoDisplay1(Board, Mine, x , y-1);
 93         }
 94     }
 95     for (i = 0; i < ROWS; i++)
 96     {
 97         for (j = 0; j < COLS; j++)
 98         {
 99             if (Board[i][j] == '0')
100             {
101                 Board[i][j] = ' ';
102             }
103         }
104     }
105 }
106 //判断输赢
107 int IsWin(char Board[ROWS][COLS], int i, int j)
108 {
109     int ret=0;
110     for (i = 1; i < ROWS-1; i++)
111     {
112         for (j = 1; j < COLS-1; j++)
113         {
114             if (Board[i][j] == '*')
115             {
116                 ret++;
117             }
118         }
119     }
120     return ret;
121 }
122 //扫雷
123 void ClearMine(char Board[ROWS][COLS], char Mine[ROWS][COLS])
124 {
125     int x, y,ret,win;
126     while (1)
127     {
128         printf("请输入坐标>>\n");
129         scanf("%d %d",&x,&y);
130         if (x >= 0 && x<=9 && y>=0 && y <= 9)
131         {
132             if (Mine[x][y] == '1')
133             {
134                 printf("你输了!\n");
135                 PrintBoard(Mine, ROW, COL);
136                 break;
137             }
138             else
139             {
140                 ret = SumMine(Mine, x, y);
141                 Board[x][y] = ret + '0';
142                 AutoDisplay1(Board,Mine,x,y);
143                 PrintBoard(Board, ROW, COL);
144                 win =IsWin(Board, x, y);
145                 if ( win== MINE)
146                 {
147                     printf("恭喜你赢了!");
148                     break;
149                 }
150             }
151         }
152         else
153         {
154             printf("输入的参数不合法,请重新输入");
155         }
156     }
157 }

 

posted @ 2021-09-15 23:01  贞德窦  阅读(78)  评论(0)    收藏  举报