C/C++扫雷小游戏


实现功能

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 <
  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是使用 C 语言编写的扫雷小游戏代码: #include <stdio.h> #include <stdlib.h> #include <time.h> #define ROW 9 #define COL 9 #define MINE_NUM 10 void init_board(char board[ROW][COL], int row, int col, char ch); void print_board(char board[ROW][COL], int row, int col); void set_mine(char board[ROW][COL], int row, int col, int num); int get_mine_count(char board[ROW][COL], int row, int col, int x, int y); int main() { char board[ROW][COL]; int x, y, count = 0; srand((unsigned int)time(NULL)); // 初始化随机数种子 init_board(board, ROW, COL, ' '); set_mine(board, ROW, COL, MINE_NUM); printf("扫雷小游戏开始!\n"); print_board(board, ROW, COL); while (1) { printf("请输入要扫描的坐标(x,y):"); scanf("%d,%d", &x, &y); if (x < 1 || x > ROW || y < 1 || y > COL) { printf("坐标输入有误,请重新输入!\n"); continue; } if (board[x - 1][y - 1] == '*') { printf("很遗憾,你踩到了地雷,游戏结束!\n"); break; } count = get_mine_count(board, ROW, COL, x - 1, y - 1); board[x - 1][y - 1] = count + '0'; if (count == 0) { int i, j; for (i = x - 2; i <= x; i++) { for (j = y - 2; j <= y; j++) { if (i >= 0 && i < ROW && j >= 0 && j < COL && board[i][j] == ' ') { count = get_mine_count(board, ROW, COL, i, j); board[i][j] = count + '0'; } } } } print_board(board, ROW, COL); int i, j, win = 1; for (i = 0; i < ROW; i++) { for (j = 0; j < COL; j++) { if (board[i][j] == ' ') { win = 0; break; } } } if (win) { printf("恭喜你,扫雷成功!\n"); break; } } return 0; } void init_board(char board[ROW][COL], int row, int col, char ch) { int i, j; for (i = 0; i < row; i++) { for (j = 0; j < col; j++) { board[i][j] = ch; } } } void print_board(char board[ROW][COL], int row, int col) { int i, j; printf(" "); for (i = 1; i <= col; i++) { printf("%d ", i); } printf("\n"); for (i = 0; i < row; i++) { printf("%d ", i + 1); for (j = 0; j < col; j++) { printf("%c ", board[i][j]); } printf("\n"); } } void set_mine(char board[ROW][COL], int row, int col, int num) { int i, j, count =

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值