1.思路:创建两个二维数组,一个用来显示最终结果,一个用来显示排查结果,布置炸弹时可用
srand函数、rand函数、time函数配合使用,生成随机数,可通过%的方法控制其生成范围
(srand函数、rand函数、time函数三子棋章节略有介绍)
2.在计算排查炸弹数时,为了防止计算越界可额外扩大其访问空间一圈,并将其初始值赋值为字符‘0’,使后面便于计算排查炸弹
3.实现扫雷小游戏
(1)头文件lin.h(声明函数)
#pragma once
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
//行
#define ROW 9
//列
#define COL 9
//防止计算越界
#define ROWS ROW+2
//防止计算越界
#define COLS ROW+2
//设置炸弹个数
#define NUMBER 10
//声明控制间距
void distance();
//声明初始化
void My_lin(char arr[ROWS][COLS], int rows, int cols);
//声明打印
void My_print(char str[ROWS][COLS], int row, int col);
//声明布置炸弹
void My_qin(char num[ROWS][COLS], int row, int col);
//声明排查结果
void My_yan(char arr[ROWS][COLS], char str[ROWS][COLS], int row, int col);
(2)源文件lin.c(实现函数)
#include"lin.h"
//实现控制间距
void distance()
{
printf("\n\n\n");
}
//实现初始化
void My_lin(char num[ROWS][COLS], int rows, int cols,char set)
{
int i = 0;
for (i = 0; i < rows; i++)
{
int j = 0;
for (j = 0; j < cols; j++)
{
num[i][j] = set;
}
}
}
//实现打印棋盘
void My_print(char num[ROWS][COLS], int row, int col)
{
int i = 0;
for (i = 0; i <= col; i++)
{
printf(" %d ", i);
}
printf("\n\n");
for (i = 1; i <= row; i++)
{
printf(" %d ", i);
int j = 0;
for (j = 1; j <= col; j++)
{
printf(" %c ",num[i][j]);
}
printf("\n\n");
}
}
//实现布置炸弹
void My_qin(char num[ROWS][COLS], int row, int col)
{
int x = 0;
int y = 0;
int count = NUMBER;
while (count)
{
//设置生成随机数的取值范围[1,row]
x = rand() % row+1;
//设置生成随机数的取值范围[1,col]
y = rand() % col + 1;
if ('0' == num[x][y])
{
num[x][y] = '1';
count--;
}
}
}
//实现排查炸弹数
int My_li(char arr[ROWS][COLS], int x, int y)
{
return arr[x - 1][y - 1]
+ arr[x - 1][y]
+ arr[x - 1][y + 1]
+ arr[x - 1][y - 1]
+ arr[x][y + 1]
+ arr[x + 1][y - 1]
+ arr[x + 1][y]
+ arr[x + 1][y + 1]
- 8 * '0';
}
//实现排查结果
void My_yan(char arr[ROWS][COLS], char str[ROWS][COLS], int row, int col)
{
int x = 0;
int y = 0;
int le = 0;
while(le<row*col-NUMBER)
{
printf("请输入排查的坐标(坐标请用空格隔开):");
scanf("%d %d", &x, &y);
//控制间距
distance();
if (x >= 1 && x <= row && y >= 1 && y <= col)
{
//排查出炸弹
if ('1' == arr[x][y])
{
printf("很遗憾,你被炸死了\n");
break;
}
//未排查出炸弹
else
{
/排查数
int count=My_li(arr, x, y);
str[x][y] = count + '0';
//打印排查后的棋盘
My_print(str, ROW, COL);
le++;
}
}
else
{
printf("坐标无效,请重新输入\n");
}
}
if (le == row * col - NUMBER)
{
printf("恭喜你,获胜啦\n");
}
}
(3)源文件test.c(主函数)
#include "lin.h"
void menu()
{
//控制间距
distance();
printf(" 1.开始游戏\n");
printf(" 2.退出游戏\n");
//控制间距
distance();
}
void lin()
{
char arr[ROWS][COLS] = { 0 };
char str[ROWS][COLS] = { 0 };
//初始化为0
My_lin(arr, ROWS, COLS,'0');
//初始化为*
My_lin(str, ROWS, COLS,'*');
//布置炸弹
My_qin(arr,ROW,COL);
//打印棋盘
My_print(str, ROW, COL);
//控制间距
distance();
//排查结果
My_yan(arr, str, ROW, COL);
//控制间距
distance();
//打印棋盘
My_print(arr, ROW, COL);
//控制间距
distance();
}
void test()
{
int input = 0;
srand((unsigned int)time(NULL));
do
{
//打印菜单
menu();
printf("请输入选项:");
scanf("%d", &input);
//控制间距
distance();
switch (input)
{
case 1:
lin(); break;
case 2:
input = 0;
printf("退出游戏\n"); break;
default:
printf("选择无效,请重新选择\n");
}
}while (input);
}
int main()
{
test();
return 0;
}
|