扫雷游戏大家都不陌生,1992年4月6日,扫雷和纸牌、空当接龙等小游戏搭载在Windows 3.1系统中与用户见面,主要目的是让用户训练使用鼠标。这个游戏的玩法很简单,有初级、中级、高级和自定义等模式,雷区中随机布置一定数量的地雷,玩家需要尽快找出所有不是地雷的方块,但不许踩到地雷。
胜利条件:你需要在不点错雷的情况下尽可能快的将所有的雷都标记出来,如果你点错,就得重新开始,所以扫雷也有一定的运气成分。
如何操作:左键翻开这一格,右键标记地雷,双击左键(或者左右键一起点)可以看到这个数字的可点击范围,你点出了一个数字,是1,就说明它周围的8的格子里有1个雷,是2就有两个雷,是3就有三个雷···以此类推。如果你把数字周围的雷全扫出后还有空格,不必再一格一格翻开,直接双击左键就可以了。但如果你标记错了雷,那就会"boom!"一切重新开始。
那么如何让我们实现9*9扫雷代码那
设计思路:
1.建立菜单函数和game函数,跟之前我发的井字棋代码一样,所以第一个步骤我就跳过了哈哈哈
2.首先我们需要两个数组arr1和arr2储存两个棋盘的信息,第一个棋盘是布置雷的棋盘(客户看不到的),第二个是排查雷的棋盘(客户能看到并能操作的棋盘),数组的行和列虽说是9*9的棋盘,但存在边角也有可能是雷的情况来计算,所以实际数组行ROW和列COL需要各扩大两行两列,所以实际数组行ROWS和列COLS是11,
3.声明并定义一个函数chu,用来初始化俩棋盘,arr1初始化全为‘0’,arr2初始化全为‘*’
4.创建一个函数dischu打印arr2棋盘,注:打印的时候只需要中间的9*9范围所以此时的行和列范围是1~9,所以要用ROW和COL传参数,不能用ROWS和COLS!!!
5.布置雷,定义一个常量EASY_COUNT代表雷的个数,创建一个函数setlei来布置雷。随机取布置雷的坐标,期间需要用到rand()和game()函数来设置随机数,要调用头文件<stdlib.h>和<time.h>
6.排查雷,创建一个函数findlei用来排查雷,首先确保玩家输入的坐标都在1~9范围内,才可判断是不是雷,若选的坐标不是雷,我们需要创建一个函数panduan返回周围雷的个数,又因为数组储存的是字符类型所以+‘0’转换字符类型赋值给你选的坐标,再打印就行了。
注:字符‘1’-字符‘0’=数字1,我们可以根据这一点返回对应的雷的总数,但要打印到arr2棋盘中的总数是字符,所以返回来总值之后还要加'0'变回字符再打印,在panduan函数里我们可以直接返回该坐标周围8个格子里雷的数量
game.h文件用来存放头文件,定义常量,声明函数
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define ROW 9
#define COL 9
#define ROWS ROW+2
#define COLS COL+2
#define EASY_COUNT 10 //定义雷的个数
void chu(char board[ROWS][COLS],int rows,int cols,char ar);//初始化函数说明
void dischu(char board[ROWS][COLS],int rows,int cols);//打印棋盘函数声明
void setlei(char board[ROWS][COLS], int row, int col);//布置雷函数声明
void finDlei(char arr1[ROWS][COLS],char arr2[ROWS][COLS],int row,int col);//排查雷函数声明
game.c 文件用来定义函数
#define _CRT_SECURE_NO_WARNINGS 1
#include "game.h"
void chu(char board[ROWS][COLS],int rows,int cols,char ar) //初始化函数定义
{
int i = 0;
for (i = 0; i < rows; i++)
{
int j = 0;
for (j = 0; j <cols; j++)
{
board[i][j] = ar;
}
}
}
void dischu(char board[ROWS][COLS], int row, int col)//打印棋盘函数定义
{
int i = 0;
int j = 0;
printf("-----------------------------扫雷游戏-----------------------------\n");
for (j = 0; j <= col; j++)
{
printf("%d ",j);//打印列数
}
printf("\n");//换行
for (i = 1; i <= row; i++)
{
printf("%d ", i);//打印行数
for (j = 1; j <=col; j++)
{
printf("%c ", board[i][j]);
}
printf("\n");//换行
}
printf("-----------------------------扫雷游戏-----------------------------\n");
}
void setlei(char board[ROWS][COLS], int row, int col)//布置雷函数定义
{
int count = EASY_COUNT;
while (count)
{
int x = rand() % row + 1;//随机生成1~9
int y = rand() % col + 1;
if (board[x][y] == '0')
{
board[x][y] = '1';
count--;
}
}
}
static int panduan(char arr1[ROWS][COLS], int x, int y)
{
return arr1[x - 1][y] + arr1[x + 1][y] +
arr1[x][y - 1] + arr1[x][y + 1] +
arr1[x - 1][y - 1] + arr1[x + 1][y + 1] +
arr1[x - 1][y + 1] + arr1[x + 1][y - 1]-8 * '0';
}
void finDlei(char arr1[ROWS][COLS], char arr2[ROWS][COLS], int row, int col)//排查雷函数定义
{
int x = 0;
int y = 0;
int sum = 0;
while (sum<row*col- EASY_COUNT)
{
printf("请输入排查雷的坐标>");
scanf("%d%d", &x, &y);
if (x >= 1 && x <= 9 && y <= 9 && y >= 1)//输入合法
{
//选到雷了
if (arr1[x][y] == '1')
{
printf("很遗憾,你被炸死了\n");
dischu(arr1, ROW, COL);
break;
}
else//不是雷
{
int count = panduan(arr1, x, y);//计算坐标周围有几个雷函数
arr2[x][y] = count+'0';
dischu(arr2, ROW, COL);
sum++;
}
}
else
{
printf("输入非法,请重新输入\n");
}
}
if (sum == 71)
{
printf("恭喜你找到全部的雷\n");
dischu(arr1, ROW, COL);
}
}
test.c文件中主要是game函数中执行的每一个函数的步骤,main函数和菜单函数创建
#define _CRT_SECURE_NO_WARNINGS 1
#include "game.h"
void menu()
{
printf("************************************\n");
printf("***** 1.开始游戏 ******\n");
printf("***** 0.退出游戏 ******\n");
printf("************************************\n");
printf("*********************制作人:********\n");
printf("*********************小张同学*******\n");
printf("************************************\n");
}
void game()
{
char arr1[ROWS][COLS] = { 0 };//存放布置雷的信息
char arr2[ROWS][COLS] = { 0 };//存放排雷的信息
//初始化数组的内容为指定的内容
//arr1数组在没有布置雷时,都是'0'
chu(arr1, ROWS, COLS,'0');
chu(arr2, ROWS, COLS, '*');
//arr2数组在没有排雷的时,都是'*'
//打印
dischu(arr2, ROW, COL);
//布置雷
setlei(arr1, ROW, COL);
//排查雷
finDlei(arr1, arr2, ROW, COL);
}
int main()
{
int input = 0;
srand((unsigned int)time(NULL));
do
{
menu();//调用菜单函数
printf("请选择>");
scanf("%d", &input);
switch (input)//switch语句判断
{
case 1:
game();//调用game函数
break;
case 0:
printf("游戏已退出\n");
break;
default:
printf("输入错误,请重新输入\n");
break;
}
} while (input);
return 0;
}