这篇博客将为大家带来一个c语言写的小程序——扫雷。
用到的知识——数组,函数。
快来围观呀!
目录
1.网页版扫雷
游戏规则 :
1.扫雷就是要把所有非地雷的格子揭开即胜利;踩到地雷格子就算失败
2.游戏主区域由很多个方格组成。使用鼠标左键随机点击一个方格,方格即被打开并显示出方格中的数字;方格中数字则表示其周围的8个方格隐藏了几颗雷;如果点开的格子为空白格,即其周围有0颗雷,则其周围格子自动打开;
3.1代表1的上下左右及斜角合计有一颗雷,依次轮推,2则有2颗,3则有3颗。在确实是炸弹的方格上点了旗子,就安全了,不是炸弹的被点了旗子,后面会被炸死的。问号就三不确定这里有没有炸弹,不会存在点错了被炸死的状况
1.1本篇扫雷与网页版扫雷的区别
游戏规则相同,但目前没法实现无雷地区展开一片(该步骤可以用递归实现)
本篇扫雷通过依次排查无雷坐标进行实现
2.自制扫雷
2.1新建文件
分别在源文件和头文件下创建game.c,test.c,和game.h
test.c:用于构建扫雷的整体框架结构
game.h:用于存放扫雷中出现的函数的声明,以及所要用到的头文件(简单来说是main函数头上那一堆)
game.c:用于编写扫雷用到的函数定义
有了这些文件可以使程序看起来思路更加清晰,不理解没关系可以接着往下看
2.2代码编写
2.2.1 整体思路
主体: 输出菜单让用户选择——>根据选择判断是否进入游戏——>游戏运行——>游戏结束
游戏运行:
1.生成两个数组,分别代表用户界面的图和内部地雷图(0代表无雷,1代表有雷)
2.用户界面数组初始化为*,内部地雷数组初始化为0
3.用随机数在内部地雷数组中放置雷“1”
4.输出用户界面并让用户输入排查的坐标
5.判断坐标处是否为雷,是雷游戏结束(展示答案),不是雷计算并显示该坐标处的雷数
6.使用while循环,通过对操作次数进行计数判断游戏是否结束
2.2.1 test.c
#define _CRT_SECURE_NO_WARNINGS 1
#include"game.h"
int main()
{
int a;
while (1)
{
srand((unsigned int)time(NULL));
menu();
printf("请选择:");
scanf("%d", &a);
switch (a)
{
case 1:
printf("开始扫雷\n");
game();
break;
case 0:
printf("游戏结束了\n");
break;
default:
printf("输入错误,请重新输入\n");
break;
}
if (a)
;
else
break;
}
return 0;
}
用while(1)死循环来使用户可进行多次游戏
2.2.2 game.c
#define _CRT_SECURE_NO_WARNINGS 1
#include"game.h"
//输出菜单
void menu(void)
{
printf("***********************\n");
printf("****** 1.play *******\n");
printf("****** 0.exit *******\n");
printf("***********************\n");
}
//初始化数组
void initi(char arr[ROWW][COLL], char ch)
{
int i, j;
for (i = 0; i < ROWW; i++)
{
for (j = 0; j < COLL; j++)
{
arr[i][j] = ch;
}
}
}
//输出数组
void print(char arr[ROWW][COLL])
{
int i, j;
for (i = 0; i <= ROW; i++)
{
printf("%2d ", i);
}
printf("\n");
for (i = 1; i <= ROW; i++)
{
printf("%2d ", i);
for (j = 1; j <= COL; j++)
{
printf("%2c ", arr[i][j]);
}
printf("\n");
}
}
//放置雷
void place(char arr[ROWW][COLL], int n)
{
int count = COUNT;
while (count)
{
int x = rand() % ROW + 1;
int y = rand() % COL + 1;
if (arr[x][y] != '1')
{
arr[x][y] = '1';
count--;
}
}
}
//计算雷数
char Num(char arr[ROWW][COLL], int a, int b)
{
int i, j, sum = 0;
char result = '0';
for (i = a - 1; i <= a + 1; i++)
{
for (j = b - 1; j <= b + 1; j++)
{
sum += arr[i][j] - 48;
}
}
result += sum;
return result;
}
//扫雷实现
void game(void)
{
int a, b;
int freq = 0;
char mine[ROWW][COLL], show[ROWW][COLL];
initi(mine, '0');
initi(show, '*');//初始化数组
place(mine, COUNT);
while (freq < ROW * COL - COUNT)//判断排查次数是否到达无雷数
{
printf("-------扫雷游戏-------\n");
print(show);//输出数组
printf("\n");
printf("请输入:");
scanf("%d%d", &a, &b);
if (a >= 1 && a <= ROW && b >= 1 && b <= COL)
{
if (show[a][b] == '*')
{
if (mine[a][b] == '1')
{
printf("恭喜你,你被炸死了\n");
printf("-----以下展示答案-----\n");
print(mine);
break;
}
else if (mine[a][b] == '0')
{
show[a][b] = Num(mine, a, b);
freq++;
}
}
else {
printf("输入重复,请重新输入\n");
}
}
else {
printf("越界输入,错误!\n");
}
}
if (freq == ROW * COL - COUNT)
{
printf("恭喜你,扫清所有雷!\n");
}
}
2.2.3 game.h
#pragma once
#define ROW 9
#define COL 9
#define ROWW 11
#define COLL 11
#define COUNT 10
#include<stdio.h>
#include<time.h>
#include<stdlib.h>
//输出菜单
void menu(void);
//扫雷实现
void game(void);
//初始化数组
void initi(char arr[ROWW][COLL], char ch);
//输出数组
void print(char arr[ROWW][COLL]);
//放置雷
void place(char arr[ROWW][COLL], int n);
//雷数
char Num(char arr[ROWW][COLL], int a, int b);
2.3 程序运行
好了,以上就是简易版扫雷的全部内容,还不快点动手去试试~