码迷,mamicode.com
首页 > 其他好文 > 详细

扫雷小游戏

时间:2019-02-09 19:12:13      阅读:204      评论:0      收藏:0      [点我收藏+]

标签:并且   地图   ring   ret   提示   ini   过程   坐标   棋盘   

  1 #define _CRT_SECURE_NO_WARNINGS
  2 #include<stdio.h>
  3 #include<stdlib.h>
  4 #include<string.h>
  5 
  6 #define ROW 9
  7 #define COL 9
  8 #define MINE_COUNT 10
  9 
 10 int Menu()
 11 {
 12     printf("=======================\n");
 13     printf("1.开始游戏\n");
 14     printf("0.结束游戏\n");
 15     printf("=======================\n");
 16     int choice = 0;
 17     printf("请输入您的选择!\n");
 18     scanf("%d", &choice);
 19     return choice;
 20 }
 21 
 22 void Init(char mine_map[ROW + 2][COL + 2],
 23     char show_map[ROW + 2][COL + 2])
 24 {
 25     //1.show_map都初始化成 * (表示没有翻开的位置)
 26     for (int row = 0;row < ROW + 2;++row)
 27     {
 28         for (int col = 0;col < COL + 2;++col)
 29         {
 30             show_map[row][col] = *;
 31         }
 32     }
 33     //2.mine_map都初始化为‘0‘
 34     for (int row = 0;row < ROW + 2;++row)
 35     {
 36         for (int col = 0;col < COL + 2;++col)
 37         {
 38             mine_map[row][col] = 0;
 39         }
 40     }
 41     //除了上面的方法还可以:利用memset对一段连续的内存空间进行赋值
 42     //二维数组也是在一个连续的内存空间上
 43     //memset(mine_map, ‘0‘, (ROW + 2)*(COL + 2));
 44     //memset(show_map, ‘*‘, (ROW + 2)*(COL + 2));
 45 
 46     //3.对mine_map进行雷阵的布置
 47     int mine_count = MINE_COUNT;
 48     while (mine_count > 0)
 49     {
 50         //这个循环尝试进行布雷,每次布置成功一个则mine_count--
 51         //magice number
 52         int row = rand() % 9 + 1;
 53         int col = rand() % 9 + 1;
 54         if (mine_map[ROW][COL] == 1)
 55         {
 56             continue;
 57         }
 58         //当前位置可以用来设置地雷
 59         mine_map[row][col] = 1;
 60         --mine_count;
 61     }
 62     return;
 63 }
 64 
 65 void DisplayMap(char map[ROW + 2][COL + 2])
 66 {
 67     //先打印四个空格
 68     printf("    ");
 69     //打印列的坐标
 70     for (int i = 1;i <= COL;++i)
 71     {
 72         printf("%d ", i);
 73     }
 74     printf("\n");
 75     //第一行打印完成
 76     //这里打印上边框
 77     for (int i = 1;i <= COL;++i)
 78     {
 79         printf("---");
 80     }
 81     printf("\n");
 82     //打印棋盘的每一行,注意,每一行最前面的要带上行号
 83     for (int row = 1;row <= ROW;++row)
 84     {
 85         printf("  %d|", row);
 86         for (int col = 1;col <= COL;++col)
 87         {
 88             printf("%c ", map[row][col]);
 89         }
 90         printf("\n");
 91     }
 92 }
 93 
 94 void UpdateShowMap(char mine_map[ROW + 2][COL + 2],
 95     char show_map[ROW + 2][COL + 2], int row, int col)
 96 {
 97     //每次翻开一个格子的时候,如果这个格子不是雷,就需要跟新show_map
 98     //把当前位置替换成一个数字(数字就表示了当前位置周围8个格子中有几个地雷)
 99     int mine_count =
100         (mine_map[row - 1][col - 1] - 0)
101         + (mine_map[row - 1][col] - 0)
102         + (mine_map[row - 1][col + 1] - 0)
103         + (mine_map[row][col - 1] - 0)
104         + (mine_map[row][col + 1] - 0)
105         + (mine_map[row + 1][col - 1] - 0)
106         + (mine_map[row + 1][col] - 0)
107         + (mine_map[row + 1][col + 1] - 0);
108     //由于show_map中都是字符,需要把这个数字转换为字符
109     show_map[row][col] = mine_count + 0;
110 }
111 
112 void Game()
113 {
114     printf("‘0‘表示没有地雷,‘1‘表示有地雷\n");
115     //1.设定一个二维数组,作为表示地雷的地图,‘0‘表示没有地雷,‘1‘表示有地雷
116     //  设定一个二维数组,作为给玩家看的地图,每个位置是否被翻开,如果翻开
117     //在此处加了2表示加了一圈边框:
118     char mine_map[ROW + 2][COL + 2];
119     char show_map[ROW + 2][COL + 2];
120     //2.对地图进行初始化(包含布置地雷的过程)
121     Init(mine_map, show_map);
122     int blank_not_mine_count = 0;//不是雷的个数
123                                  //3.先打印一下初始地图
124     DisplayMap(show_map);
125     while (1)
126     {
127         //4.提示玩家输入一组坐标,并且对玩家输入进行合法性检查
128         printf("请输入一组坐标(row col):");
129         int row = 0;
130         int col = 0;
131         scanf("%d %d", &row, &col);
132         //row,col的有效范围[1,row][1,col]地图上有边框
133         if (row<1 || row>ROW || col<1 || col>COL)
134         {
135             printf("您输入的坐标非法,请重新输入:\n");
136             continue;
137         }
138         //5.提示玩家翻开的位置是否是地雷,如果是地图就游戏结束
139         if (mine_map[row][col] == 1)
140         {
141             printf("您踩雷了,游戏结束!\n");
142             //玩家踩雷后,需要告诉玩家当前地图上都有哪些位置是地雷
143             DisplayMap(mine_map);
144             break;
145         }
146         //6.如果当前位置已经把最后一个不是雷的位置翻开了,游戏结束,玩家胜利
147         ++blank_not_mine_count;
148         if (blank_not_mine_count == ROW * COL - MINE_COUNT)
149         {
150             printf("扫雷成功!\n");
151             DisplayMap(mine_map);
152             break;
153         }
154         //7.把这个位置翻开,并计算当前位置周围8个格子中包含几个雷
155         UpdateShowMap(mine_map, show_map, row, col);
156         DisplayMap(show_map);
157         //回到3循环执行
158 
159     }
160 
161 }
162 
163 int main()
164 {
165     while (1)
166     {
167         int choice = Menu();
168         if (choice == 1)
169         {
170             Game();
171         }
172         else
173         {
174             printf("Goodbye!\n");
175             break;
176         }
177     }
178 
179 
180 
181     return 0;
182 }

 

扫雷小游戏

标签:并且   地图   ring   ret   提示   ini   过程   坐标   棋盘   

原文地址:https://www.cnblogs.com/cuckoo-/p/10357769.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!