1.扫雷游戏的分析和设计
1.1扫雷游戏的功能说明
*使用控制台实现经典的扫雷游戏
*游戏可以通过菜单实现继续玩或者退出游戏
*扫雷的棋盘是经典的9*9的格子
*默认随机布置10个雷
*可以排查雷
1.2游戏的分析和设计
1.2.1数据结构的分析
扫雷过程中,布置的雷和排查出的雷的信息都需要储存,所以我们需要一定的数据结构来储存这些信息,因此我们可以创建两个9*9的二维数组来达到储存的目的。一个数组名mine,另一个数组名为show。mine数组用来储存布置雷的信息,show数组用来储存排查出雷的信息。
假设我们排查(2,5)这个坐标时,我们访问周围的⼀圈8个黄色位置,统计周围雷的个数是1. 假设我们排查(8,6)这个坐标时,我们访问周围的⼀圈8个黄色位置,统计周围雷的个数时,最下⾯的三 个坐标就会越界,为了防止越界,我们在设计的时候,给数组扩大一圈,雷还是布置在中间的9*9的坐 标上,周围⼀圈不去布置雷就行,这样就解决了越界的问题。所以我们将存放数据的数组创建成11*11 是⽐较合适。
mine数组最开始初始化为'0',show数组初始化为'*'.
布置完雷后的mine数组
show数组
1.2.2文件结构设计
这里设计了三个文件
(1)头文件game.h(文件中需要的函数声明和一些数据类型)
(2)test.c(文件中游戏逻辑)
(3)game.c(文件中函数的实现)
2.扫雷游戏代码
game.h
#pragma once
#include<stdlib.h>
#define EASY_COUNT 10
#define Row 9
#define Col 9
#define Rows Row+2
#define Cols Col+2
//对两个数组进行初始化
void Initarr(char arr[Rows][Cols], int rows, int cols, char set);
//打印show数组
void displayarr(char arr[Rows][Cols], int row, int col);
//布置雷
void setarr(char arr[Rows][Cols], int row, int col);
//找雷
void findarr(char arr1[Rows][Cols], char arr2[Rows][Cols], int row, int col);
game.c
#define _CRT_SECURE_NO_WARNINGS 1
#include"game.h"
#include<stdio.h>
void Initarr(char arr[Rows][Cols], int row, int col, char set)
{
int i = 0, j = 0;
for (i = 0; i < row; i++)
{
for (j = 0; j < col; j++)
{
arr[i][j] = set;
}
}
}
void displayarr(char arr[Rows][Cols], int row, int col)
{
int i = 0, j = 0;
for (i = 0; i <= col; i++)
{
printf("%d ", i);
}
printf("\n");
for (i = 1; i <= row; i++)
{
printf("%d ", i);
for (j = 1; j <= col; j++)
{
printf("%c ", arr[i][j]);
}
printf("\n");
}
}
void setarr(char arr[Rows][Cols], int row, int col)
{
int count = EASY_COUNT;
while (count)
{
int x = rand() % row + 1;
int y = rand() % col + 1;
if (arr[x][y] == '0')
{
arr[x][y] = '1';
count--;
}
}
}
void findarr(char arr1[Rows][Cols], char arr2[Rows][Cols], int row, int col)
{
int x = 0, y = 0, win = 0;
while (win < (row * col - EASY_COUNT))
{
printf("请输入坐标:");
scanf("%d %d", &x, &y);
if(x>=1&&x<=row&&y>=1&&y<=col)
{
if (arr1[x][y] == '1')
{
printf("oh!你被炸死了!\n");
displayarr(arr1, Row, Col);
break;
}
else
{
win++;
int count = 0;
count = arr1[x - 1][y - 1] + arr1[x - 1][y] + arr1[x - 1][y + 1] + arr1[x][y - 1] + arr1[x][y + 1] + arr1[x + 1][y - 1] + arr1[x + 1][y] + arr1[x + 1][y + 1] - 8 * '0';
arr2[x][y] = count+'0';
displayarr(arr2, Row, Col);
}
}
else
{
printf("非法坐标,请重新输入。\n");
}
}
if (win == row * col - EASY_COUNT)
{
printf("恭喜你,扫雷成功了!\n");
displayarr(arr1, Row, Col);
}
}
test.c
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include"game.h"
void menu()
{
printf("*******************\n");
printf("***** 1.play ******\n");
printf("***** 0.exit ******\n");
printf("*******************\n");
}
void game()
{
printf("-----扫雷游戏开始-----\n");
char mine[Rows][Cols], show[Rows][Cols];
//对数组初始化,mine初始化为'0',show初始化为'*'
Initarr(mine, Rows, Cols, '0');
Initarr(show, Rows, Cols, '*');
//打印棋盘
displayarr(show, Row, Col);
//设置雷
setarr(mine, Row, Col);
//找雷
findarr(mine, show, Row, Col);
}
void test()
{
int x;
do
{
menu();
scanf("%d", &x);
switch (x)
{
case 1:
game();
break;
case 0:break;
default:printf("输入错误,请重新输入\n");
}
} while (x);
}
int main()
{
test();
return 0;
}
扫雷游戏到此就结束咯!当然还有更高难度的扫雷游戏,例如16*16棋盘的,30*16棋盘的等等。
大家可以试着去写写哦!目前雯雯文能力有限,和你们一起努力!