目录
实现功能
1. 能自由选择三种游戏级别,对应5、7、9阶方阵,5阶方阵有5个雷,7阶方阵有9个雷,9阶方阵有15个雷;
2. 自动统计非雷坐标附近8个位置的地雷总数;
3. 记录时间,展示最佳成绩(5、7、9方阵分开记录,下同)
4. 计算胜率
思路
如何实现“输入坐标即展开”操作
1.创建三个二维方阵,arr1,arr2,arr3,初始化赋值为’#’;
2.对arr2利用随机函数,埋下地雷 ‘*’;
3.遍历arr1,对arr1中对应arr2中非雷的位置赋值(附近8个位置地雷总数);
4.当输入坐标x y,若坐标为雷,游戏结束,若坐标非雷,将坐标及其附近8个位置的arr1的值赋给arr3;
5.每次输入坐标x y后打印arr3,利用while(1)循环打印,利用system(“cls”)循环清屏幕,实现展开功能;
以5阶雷阵为例
(因为 * 号在文本中难以对齐输出,在文本中以 ‘k’ 替代,但在代码中仍为 * 号)
arr1,arr2,arr3初始赋值后的样子:
arr1
‘#’ ‘#’ ‘#’ ‘#’ ‘#’
‘#’ ‘#’ ‘#’ ‘#’ ‘#’
‘#’ ‘#’ ‘#’ ‘#’ ‘#’
‘#’ ‘#’ ‘#’ ‘#’ ‘#’
arr2
‘#’ ‘#’ ‘#’ ‘#’ ‘#’
‘#’ ‘#’ ‘#’ ‘#’ ‘#’
‘#’ ‘#’ ‘#’ ‘#’ ‘#’
‘#’ ‘#’ ‘#’ ‘#’ ‘#’
arr3
‘#’ ‘#’ ‘#’ ‘#’ ‘#’
‘#’ ‘#’ ‘#’ ‘#’ ‘#’
‘#’ ‘#’ ‘#’ ‘#’ ‘#’
‘#’ ‘#’ ‘#’ ‘#’ ‘#’
随机数生成arr2雷阵(5个雷 ‘*’,arr1,arr3保持不变)
arr1
‘#’ ‘#’ ‘#’ ‘#’ ‘#’
‘#’ ‘#’ ‘#’ ‘#’ ‘#’
‘#’ ‘#’ ‘#’ ‘#’ ‘#’
‘#’ ‘#’ ‘#’ ‘#’ ‘#’
arr2
‘#’ ‘#’ ‘#’ ‘#’ ‘k’
‘#’ ‘#’ ‘k’ ‘#’ ‘#’
‘#’ ’k’ ‘#’ ‘#’ ‘#’
‘#’ ‘k’ ‘#’ ‘k’ ‘#’
arr3
‘#’ ‘#’ ‘#’ ‘#’ ‘#’
‘#’ ‘#’ ‘#’ ‘#’ ‘#’
‘#’ ‘#’ ‘#’ ‘#’ ‘#’
‘#’ ‘#’ ‘#’ ‘#’ ‘#’
arr1赋值(每个对应arr2中非雷坐标赋值为其周围八个坐标地雷个数,若为雷,则符号不变)
周围八个坐标即为上下左右,左上,左下,右上,右下,若坐标位于边缘区域,如坐标(0,0)位置,则指统计能扫描到的坐标,即3个坐标,其它情况以此类推;
arr1
‘0’ ‘1’ ‘1’ ‘2’ ‘#’
‘1’ ‘2’ ‘#’ ‘2’ ‘1’
‘2’ ‘#’ ‘4’ ‘2’ ‘1’
‘2’ ‘#’ ‘3’ ‘#’ ‘1’
arr2
‘#’ ‘#’ ‘#’ ‘#’ ‘k’
‘#’ ‘#’ ‘k’ ‘#’ ‘#’
‘#’ ‘k’ ‘#’ ‘#’ ‘#’
‘#’ ‘k’ ‘#’ ‘k’ ‘#’
arr3
‘#’ ‘#’ ‘#’ ‘#’ ‘#’
‘#’ ‘#’ ‘#’ ‘#’ ‘#’
‘#’ ‘#’ ‘#’ ‘#’ ‘#’
‘#’ ‘#’ ‘#’ ‘#’ ‘#’
arr3为每次我们要打印的方阵,当还未输入x y时,打印arr3,输入x y后,先判断arr2[x][y]是否为雷,若不为雷,将横坐标 i<=x-1 至 i>=x+1 ;纵坐标 j<=y-1 至 j>=y+1 的arr1中的值赋值给arr3对应坐标。
如此,我们只需要每次打印出arr3就可以实现展开操作。
利用while(1)循环,只要不踩雷,重复“提示输入x y”,“用arr1赋值arr3”,“展开arr3”的操作,若踩雷,或判断出arr3中’#“的个数等于地雷数(已经排查出所有的地雷),利用 break; 指令,跳出循环;
clock()函数——计时
对应头文件
#include<time.h>
在time.h文件中,有常量CLOCKS_PER_SEC,表示一秒钟内CPU运行的时钟周期数,所以用clock()函数获得的值除以CLOCK_PER_SEC,单位即可换算为秒s。
对应数据类型
clock_t
如:clock_t begin, end;
使用范例:
#include<stdio.h>
#include<time.h>
int main()
{
clock_t begin, end;
double ret;
begin = clock();
for (int i = 0; i < 10; i++)
{
for (int j = 0; j < 10; j++)
printf("Hello world!\n");
}
end = clock();
ret = double(end - begin) / CLOCKS_PER_SEC;
printf("%f", ret);
return 0;
}
(end-begin),即为for循环运行时间,除以CLOCKS_PER_SEC,即为以秒为单位的时间值。
效果:打印100个"Hellow world!",记录用时0.033000s;
rand()函数——随机生成地雷
对应头文件
#include<stdlib.h>
对应数据类型
int
使用范例
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
int main()
{
for (int i = 0; i < 10; i++)
{
srand((unsigned)time(NULL));
int x = rand() % 10;
printf("%d\n", x);
system("pause");
}
return 0;
}
效果:随机生成10个数字;
注:rand()函数在调用时会自动设随机数种子为1,通过调用srand()函数(srand函数是随机数发生器的初始化函数),设置随机数种子,而time()这个函数保存的是一个历史时间,用NULL把时间清空,time()则保存当前时间。
可以简单理解为,srand((unsigned)time(NULL))+rand()函数,生成随机数。
我们能够利用这一随机数生成原理,随机生成埋下地雷的数组坐标,即(i,j)
system(“cls”)——画面连续
对应头文件
#include<stdlib.h>
用途
清屏
使用方法
头文件+system(“cls”);即可;
通过循环清屏实现画面的连续;详细效果可运行完整代码查看;
如何实现最佳成绩和胜率计算
最佳成绩
1.先设置初始成绩,5、7、9阶方阵的初始成绩均设置为0s;
2.成绩判断
若踩中雷,则只展示ret(所用时间)的值,若第一次排雷成功,则直接将ret赋值最佳记录,若不是第一次,则判断ret与目前最佳成绩大小,若小于最佳成绩,则输出最新最佳成绩ret,与原记录best_record;
end = clock(); //踩中地雷,计时结束
ret = double(end <