制作扫雷(简易版)

这篇博客将为大家带来一个c语言写的小程序——扫雷。

用到的知识——数组,函数。

快来围观呀!

目录

1.网页版扫雷

1.1本篇扫雷与网页版扫雷的区别

2.自制扫雷

2.1新建文件

 ​编辑

2.2代码编写

2.2.1 整体思路

2.2.1  test.c

2.2.2  game.c

2.2.3  game.h

2.3 程序运行 

 


 

1.网页版扫雷

c60c6cd832194112b8758bbd23e78077.png

游戏规则 :

1.扫雷就是要把所有非地雷的格子揭开即胜利;踩到地雷格子就算失败

2.游戏主区域由很多个方格组成。使用鼠标左键随机点击一个方格,方格即被打开并显示出方格中的数字;方格中数字则表示其周围的8个方格隐藏了几颗雷;如果点开的格子为空白格,即其周围有0颗雷,则其周围格子自动打开;

3.1代表1的上下左右及斜角合计有一颗雷,依次轮推,2则有2颗,3则有3颗。在确实是炸弹的方格上点了旗子,就安全了,不是炸弹的被点了旗子,后面会被炸死的。问号就三不确定这里有没有炸弹,不会存在点错了被炸死的状况

1.1本篇扫雷与网页版扫雷的区别

游戏规则相同,但目前没法实现无雷地区展开一片(该步骤可以用递归实现) 

本篇扫雷通过依次排查无雷坐标进行实现

2.自制扫雷

2.1新建文件

 b16f233616764ce8bbda959e2bcded86.png

分别在源文件和头文件下创建game.c,test.c,和game.h

 test.c:用于构建扫雷的整体框架结构

game.h:用于存放扫雷中出现的函数的声明,以及所要用到的头文件(简单来说是main函数头上那一堆)

game.c:用于编写扫雷用到的函数定义

有了这些文件可以使程序看起来思路更加清晰,不理解没关系可以接着往下看

2.2代码编写

2.2.1 整体思路

主体: 输出菜单让用户选择——>根据选择判断是否进入游戏——>游戏运行——>游戏结束

游戏运行:

1.生成两个数组,分别代表用户界面的图和内部地雷图(0代表无雷,1代表有雷)

2.用户界面数组初始化为*,内部地雷数组初始化为0

3.用随机数在内部地雷数组中放置雷“1”

4.输出用户界面并让用户输入排查的坐标

5.判断坐标处是否为雷,是雷游戏结束(展示答案),不是雷计算并显示该坐标处的雷数

6.使用while循环,通过对操作次数进行计数判断游戏是否结束

2.2.1  test.c

#define _CRT_SECURE_NO_WARNINGS 1
#include"game.h"

int main()
{
	int a;
	while (1)
	{
		srand((unsigned int)time(NULL));
		menu();
		printf("请选择:");
		scanf("%d", &a);
		switch (a)
		{
		case 1:
			printf("开始扫雷\n");
			game();
			break;
		case 0:
			printf("游戏结束了\n");
			break;
		default:
			printf("输入错误,请重新输入\n");
			break;
		}
		if (a)
			;
		else
			break;
	}

	return 0;
}

用while(1)死循环来使用户可进行多次游戏

2.2.2  game.c

#define _CRT_SECURE_NO_WARNINGS 1
#include"game.h"

//输出菜单
void menu(void)
{
	printf("***********************\n");
	printf("******  1.play  *******\n");
	printf("******  0.exit  *******\n");
	printf("***********************\n");
}

//初始化数组
void initi(char arr[ROWW][COLL], char ch)
{
	int i, j;
	for (i = 0; i < ROWW; i++)
	{
		for (j = 0; j < COLL; j++)
		{
			arr[i][j] = ch;
		}
	}
}

//输出数组
void print(char arr[ROWW][COLL])
{
	int i, j;
	for (i = 0; i <= ROW; i++)
	{
		printf("%2d ", i);
	}
	printf("\n");
	for (i = 1; i <= ROW; i++)
	{
		printf("%2d ", i);
		for (j = 1; j <= COL; j++)
		{
			printf("%2c ", arr[i][j]);
		}
		printf("\n");
	}
}

//放置雷
void place(char arr[ROWW][COLL], int n)
{
	int count = COUNT;
	while (count)
	{
		int x = rand() % ROW + 1;
		int y = rand() % COL + 1;
		if (arr[x][y] != '1')
		{
			arr[x][y] = '1';
			count--;
		}
	}
}

//计算雷数
char Num(char arr[ROWW][COLL], int a, int b)
{
	int i, j, sum = 0;
	char result = '0';
	for (i = a - 1; i <= a + 1; i++)
	{
		for (j = b - 1; j <= b + 1; j++)
		{
			sum += arr[i][j] - 48;
		}
	}
	result += sum;
	return result;
}

//扫雷实现
void game(void)
{
	int a, b;
	int freq = 0;
	char mine[ROWW][COLL], show[ROWW][COLL];
	initi(mine, '0');
	initi(show, '*');//初始化数组

	place(mine, COUNT);

	while (freq < ROW * COL - COUNT)//判断排查次数是否到达无雷数
	{
		printf("-------扫雷游戏-------\n");
		print(show);//输出数组
		printf("\n");
		
		printf("请输入:");
		scanf("%d%d", &a, &b);
		if (a >= 1 && a <= ROW && b >= 1 && b <= COL)
		{
			if (show[a][b] == '*')
			{
				if (mine[a][b] == '1')
				{
					printf("恭喜你,你被炸死了\n");
					printf("-----以下展示答案-----\n");
					print(mine);
					break;
				}
				else if (mine[a][b] == '0')
				{
					show[a][b] = Num(mine, a, b);
					freq++;
				}
			}
			else {
				printf("输入重复,请重新输入\n");
			}
		}
		else {
			printf("越界输入,错误!\n");
		}
	}
	if (freq == ROW * COL - COUNT)
	{
		printf("恭喜你,扫清所有雷!\n");
	}

}

2.2.3  game.h

#pragma once
#define ROW 9
#define COL 9
#define ROWW 11
#define COLL 11
#define COUNT 10
#include<stdio.h>
#include<time.h>
#include<stdlib.h>

//输出菜单
void menu(void);

//扫雷实现
void game(void);

//初始化数组
void initi(char arr[ROWW][COLL], char ch);

//输出数组
void print(char arr[ROWW][COLL]);

//放置雷
void place(char arr[ROWW][COLL], int n);

//雷数
char Num(char arr[ROWW][COLL], int a, int b);

2.3 程序运行 

813773bfbf164279b457184de1d3b0aa.png

好了,以上就是简易版扫雷的全部内容,还不快点动手去试试~ 

 

 

  • 35
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
下面是一个简单的Python实现扫雷的示例代码: ```python import random # 游戏参数 ROWS = 10 COLUMNS = 10 MINES = 10 # 方格状态 UNREVEALED = -1 MINE = -2 # 创建游戏面板 board = [[UNREVEALED for _ in range(COLUMNS)] for _ in range(ROWS)] # 随机布雷 mines = random.sample(range(ROWS * COLUMNS), MINES) for mine in mines: row, col = divmod(mine, COLUMNS) board[row][col] = MINE # 计算周围地雷数量 for row in range(ROWS): for col in range(COLUMNS): if board[row][col] == MINE: continue count = 0 for r in range(max(0, row - 1), min(row + 2, ROWS)): for c in range(max(0, col - 1), min(col + 2, COLUMNS)): if board[r][c] == MINE: count += 1 board[row][col] = count # 显示游戏面板 def print_board(): print(" ", end="") for col in range(COLUMNS): print(f"{col:2d}", end="") print() for row in range(ROWS): print(f"{row:2d} ", end="") for col in range(COLUMNS): if board[row][col] == UNREVEALED: print(" .", end="") elif board[row][col] == MINE: print(" *", end="") else: print(f" {board[row][col]}", end="") print() # 点击方格 def click(row, col): if board[row][col] == MINE: print("你踩到了地雷,游戏结束!") return False elif board[row][col] == UNREVEALED: board[row][col] = 0 for r in range(max(0, row - 1), min(row + 2, ROWS)): for c in range(max(0, col - 1), min(col + 2, COLUMNS)): if board[r][c] == UNREVEALED: click(r, c) return True else: return True # 开始游戏 print_board() while True: row = int(input("请输入行号:")) col = int(input("请输入列号:")) if not click(row, col): break print_board() ``` 这个简易版扫雷游戏使用的是命令行界面,先随机生成地雷,然后根据地雷数量计算每个方格周围的地雷数量。玩家输入行号和列号来点击方格,如果踩到地雷,则游戏结束,否则会递归地展开周围未点击过的方格,直到点击到有地雷的方格或者所有非地雷方格都被点击为止。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值