扫雷小游戏

  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 }

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

时间: 2025-01-13 09:02:19

扫雷小游戏的相关文章

一款JavaScript开发的扫雷小游戏

<style><!-- #FLM_main { margin:50px auto; padding:20px; background:#EEE; zoom:1; width:650px; } #FLM_main table { border-collapse:collapse; background:#EEE; float:left; } #FLM_main table td { border:1px solid #CCC; font-size:20px; width:38px; hei

练手WPF(三)——扫雷小游戏的简易实现(中)

原文:练手WPF(三)--扫雷小游戏的简易实现(中) 八.随机布雷 /// <summary> /// 随机布地雷 /// </summary> /// <param name="mineNum">地雷数</param> private void SetRndMine(int mineNum) { for (int k = 0; k < mineNum; k++) { int nullnum = 0; for (int j = 0;

结对博客(扫雷小游戏)

结对题目:基于一款课下娱乐的小游戏—扫雷 一.需求分析: 1.背景:在现在社会,人们的工作和学习压力不断增大,空余时间时间日益减少,一些大型的娱乐游戏又耗费大量的娱乐时间, 又不一定对身体有益,因此不耗费大量时间的小游戏,方便有趣,是大势所趋. 2.目的:编译此系统是为了在工作和学习之余得到适当的放松,既不浪费大量时间,又可以锻炼自己的思维,缓解疲劳. 3.应用人群:本游戏是基于windows下的小游戏,对人基本没有害处,因此能接触computer的人都可以玩这款游戏. 4.设计概述: 本游戏界

2017.12.16 扫雷小游戏未完成

package saolei; /* * 设计一个二维数组,用于存放雷和周围八个格子雷的个数, * 再定义两个一维数组分别存放雷的X和Y坐标, * 布雷,记录周围八个格子雷的个数. */ import java.util.Random; public class Block { protected int[][] Array;//用于存放雷和周围雷的个数 protected int[] ArrayTestX;//用于存放雷的X坐标 protected int[] ArrayTestY;//用于存

练手WPF(三)——扫雷小游戏的简易实现(上)

一.创建项目1.创建WPF项目,设置初始化窗口大小(初级难度):高x宽为430x350.2.添加文件夹Images,并添加相关图片. 3.xaml中引入图片资源. <Window.Resources> <BitmapImage x:Key="ImgSpace" UriSource="/Images/space.bmp"/> <BitmapImage x:Key="ImgMine" UriSource="/I

练手WPF(三)——扫雷小游戏的简易实现(下)

十四.响应鼠标点击事件    (1)设置对应坐标位置为相应的前景状态 /// <summary> /// 设置单元格图样 /// </summary> /// <param name="x"></param> /// <param name="y"></param> /// <param name="state"></param> private vo

C语言写扫雷小游戏2

这是下午写的,这次的修改增加了鼠标的事件,需要的是windows的消息机制,WinAPI函数,以下是新添加的定义 struct { int num;//格子当前状态,1表示有雷,0表示无雷或已经显示数字 int roundnum;//统计格子周围的雷数 int flag;//右键按下显示红旗标志,0表示没有,1表示有 }Mine[10][10]; POINT Mouse;//定义鼠标事件 int MouseX, MouseY;//鼠标的x,y坐标 int mineNUM;//统计处理过的格子数

一款扫雷小游戏

扫雷 简单 一般 困难 地雷总数:   剩余方块: Coded by HerveyHall|查看源码 颇有不足,望大家指点

C语言写扫雷小游戏1

用的ide是vs 2013,自己学习都是参考网上的代码,由于vs不带tc的graphics.h,所以下载easyx库,将include和lib复制到vc的目录. easyx的graphics.h和tc的还是有区别的,百科上的示例 使用上,基本和 Turbo C没太大区别.启动Visual C++,创建一个控制台项目(Win32 Console Application),然后引用 graphics.h 头文件就可以了.看一个画圆的例子: #include <graphics.h> // 就是需要