简易版扫雷游戏【C语言版】

一、游戏说明

首先打开游戏界面会出现一个扫雷区,有三种扫雷区可供选择,各扫雷区的扫雷难度依次递增
初级:81个方块,10个雷(这里实现的是初级版的扫雷)
中级:256个方块,40个雷
高级:480个方块,99个雷
玩法
扫雷游戏的规则非常简单:
挖开地雷(即点到设置成为雷的方块),被炸,游戏结束。
挖开空方块,可以继续玩。
挖开数字,则表示在其周围的八个方块中共有多少个雷,可以使用该信息推断能够安全单击附近的哪些方块。
玩游戏过程中的情况如下:
在这里插入图片描述

二、游戏设计步骤

1.创建菜单
2.创建和初始化游戏扫雷区
3.设置雷的位置
4.打印出扫雷区
5.开始扫雷

三、代码实现

1.创建菜单

规定输入 1 为玩游戏,输入 0 为退出游戏

void menu()
{
	printf("****************************\n");
	printf("********   1.play   ********\n");
	printf("********   0.exit   ********\n");
	printf("****************************\n");
}

2.创建和初始化游戏扫雷区

首先创建雷区需要两个二维数组

  1. Mine[ROWS][COLS] 用来存储布置雷区的信息,不会显示出来
  2. Show[ROWS][COLS] 用来显示出扫雷游戏过程中的数据
  3. InitBoard(char board[ROWS][COLS], int rows, int cols,char set)函数用来初始化游戏界面
  4. InitBoard(Mine, ROWS, COLS,‘0’) 函数将Mine数组中每个元素全部初始为字符 ‘ 0 ’
  5. InitBoard(Show, ROWS, COLS, ‘*’) 函数将Show数组中的每个元素全部初始化为 ‘ * ’
void InitBoard(char board[ROWS][COLS], int rows, int cols,char set)
{
	int i = 0;
	int j = 0;
	for (i = 0; i < rows; i++)
	{
		for (j = 0; j < cols; j++)
		{
			board[i][j] = set;
		}
	}
}

3.设置雷

利用随机数产生机制(若不明白随机数的产生,可以看:如何生成随机数)在数组 Mine[ROWS][COLS] 中随机产生所需个数的雷,规定字符 ‘ 1 ’ 为雷,字符 ‘ 0 ’,不为雷

void SetMine(char Mine[ROWS][COLS], int row, int col)
{
	int x = rand() % row + 1;
	int y = rand() % col + 1;
	int count =  EASY_COUNT;
	while (count)
	{
		int x = rand() % row + 1;
		int y = rand() % col + 1;
		if (Mine[x][y] == '0')
		{
			Mine[x][y] = '1';
			count--;
		}
	}
}

4.打印扫雷区

同理,相应的Mine数组或者Show数组传入
DisplayBoard(char board[ROWS][COLS], int row, int col) 函数中就可实现对应界面的打印

void DisplayBoard(char board[ROWS][COLS], int row, int col)
{
	int i = 0;
	for (i = 0; i <= row; i++)
	{
		printf("%d ", i);
	}
	printf("\n");
	int j = 0;
	for (i = 1; i <= row; i++)
	{
		printf("%d ", i);
		for (j = 1; j <= col; j++)
		{
			printf("%c ", board[i][j]);
		}
		printf("\n");
	}
}

5.扫雷

FineMine(char Mine[ROWS][COLS], char Show[ROWS][COLS], int row, int col) 为扫雷函数

首先输入要排雷的坐标,若坐标合法,则排雷
当被排的坐标为雷是,则被炸;若不是雷,则在此坐标显示周围的雷数
显示雷数的函数为Get_mine_count(char Mine[ROWS][COLS], int x, int y)
当排完所有雷后,则排雷成功

static int Get_mine_count(char Mine[ROWS][COLS], int x, int y)
{
	return Mine[x - 1][y - 1] +
		Mine[x - 1][y] +
		Mine[x - 1][y + 1] +
		Mine[x][y - 1] +
		Mine[x][y + 1] +
		Mine[x + 1][y - 1] +
		Mine[x + 1][y] +
		Mine[x + 1][y + 1] - 8 * '0';
}

void FineMine(char Mine[ROWS][COLS], char Show[ROWS][COLS], int row, int col)
{
	int x = 0;
	int y = 0;
	int win = 0;
	while (win<row*col-EASY_COUNT)
	{
		printf("请输入排查的坐标>:");
		
		scanf("%d %d", &x, &y);
		if (x >= 1 && x <= row && y >= 1 && y <= col)
		{
			if (Mine[x][y] == '1')
			{
				printf("此坐标为雷,轰!被炸啦!\n");
				DisplayBoard(Mine, row, col);
				break;
			}
			if (Mine[x][y] == '0')
			{
				int count = Get_mine_count(Mine, x, y);
				Show[x][y] = count + '0';//因为Show数组为字符数组,所以数   
				                         //字元素在内存中以ASCII码存储 
				                         //count+'0'就可将该位置用字
				                         //符数字的形式表示出来
				DisplayBoard(Show, row, col);
				win++;
			}
		}
		else
		{
			printf("坐标不合法,请重新输入\n");
		}
    }
	if (win == row * col - EASY_COUNT)
	{
		printf("恭喜你,排雷成功!\n");
	}
}

以上是各各步骤函数的具体实现,而为了方便,我们将代码分为三个文件:
1.game.h------关于游戏相关的函数声明,符号声明及头文件的包含
2.game.c------游戏相关函数的实现
3.test.c------测试游戏的逻辑

game.h
说明:当扫雷的坐标为扫雷区的边缘时,为了方便打印扫雷区边缘上坐标附近雷的数目,这里设置的实际上的数组比显示出来的数组要“大上一圈”,即上下多一行,左右多一列

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define ROW 9//显示出来的行数
#define COL 9//显示出来的列数
#define ROWS ROW+2//未了方便统计雷的数目,实际上扫雷区的行数
#define COLS COL+2//实际上扫雷区的列数
#define EASY_COUNT 10//设置雷的数目
void InitBoard(char board[ROWS][COLS], int rows, int cols,char set);
void DisplayBoard(char board[ROWS][COLS], int row, int col);
void SetMine(char Mine[ROWS][COLS], int row, int col);
void FineMine(char Mine[ROWS][COLS],char Show[ROWS][COLS], int row, int col);

game.c

#include"game.h"
void InitBoard(char board[ROWS][COLS], int rows, int cols,char set)
{
	int i = 0;
	int j = 0;
	for (i = 0; i < rows; i++)
	{
		for (j = 0; j < cols; j++)
		{
			board[i][j] = set;
		}
	}
}

void DisplayBoard(char board[ROWS][COLS], int row, int col)
{
	int i = 0;
	for (i = 0; i <= row; i++)
	{
		printf("%d ", i);
	}
	printf("\n");
	int j = 0;
	for (i = 1; i <= row; i++)
	{
		printf("%d ", i);
		for (j = 1; j <= col; j++)
		{
			printf("%c ", board[i][j]);
		}
		printf("\n");
	}
}

void SetMine(char Mine[ROWS][COLS], int row, int col)
{
	int x = rand() % row + 1;
	int y = rand() % col + 1;
	int count =  EASY_COUNT;
	while (count)
	{
		int x = rand() % row + 1;
		int y = rand() % col + 1;
		if (Mine[x][y] == '0')
		{
			Mine[x][y] = '1';
			count--;
		}
	}
}

static int Get_mine_count(char Mine[ROWS][COLS], int x, int y)
{
	return Mine[x - 1][y - 1] +
		Mine[x - 1][y] +
		Mine[x - 1][y + 1] +
		Mine[x][y - 1] +
		Mine[x][y + 1] +
		Mine[x + 1][y - 1] +
		Mine[x + 1][y] +
		Mine[x + 1][y + 1] - 8 * '0';
}

void FineMine(char Mine[ROWS][COLS], char Show[ROWS][COLS], int row, int col)
{
	int x = 0;
	int y = 0;
	int win = 0;
	while (win<row*col-EASY_COUNT)
	{
		printf("请输入排查的坐标>:");
		
		scanf("%d %d", &x, &y);
		if (x >= 1 && x <= row && y >= 1 && y <= col)
		{
			if (Mine[x][y] == '1')
			{
				printf("此坐标为雷,轰!被炸啦!\n");
				DisplayBoard(Mine, row, col);
				break;
			}
			if (Mine[x][y] == '0')
			{
				int count = Get_mine_count(Mine, x, y);
				Show[x][y] = count + '0';
				DisplayBoard(Show, row, col);
				win++;
			}
		}
		else
		{
			printf("坐标不合法,请重新输入\n");
		}
    }
	if (win == row * col - EASY_COUNT)
	{
		printf("恭喜你,排雷成功!\n");
	}
}

test.c

#include"game.h"
void menu()
{
	printf("****************************\n");
	printf("********   1.play   ********\n");
	printf("********   0.exit   ********\n");
	printf("****************************\n");
}

void game()
{
	char Mine[ROWS][COLS] = { 0 };
	char Show[ROWS][COLS] = { 0 };
	InitBoard(Mine, ROWS, COLS,'0');
	InitBoard(Show, ROWS, COLS, '*');
	SetMine(Mine, ROW, COL);
	//DisplayBoard(Mine, ROW, COL);
	printf("--------扫雷----------\n");
	DisplayBoard(Show, ROW, COL);
	printf("--------扫雷----------\n");
	FineMine(Mine, Show, ROW, COL);
}

int main()
{
	srand((unsigned int)time(NULL));
	int input = 0;
	do
	{
		menu();
		printf("请选择>:");
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			printf("扫雷\n");
			game();
			break;
		case 0:
			printf("退出游戏\n");
			break;
		default:
			printf("请重新输入\n");
			break;
		}
	} while (input);
		return 0;
}

四、运行效果

在这里插入图片描述
简易版的扫雷游戏就此完成!

  • 22
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 10
    评论
以下是一个简单的基于Linux的扫雷游戏C语言代码。代码实现了一个简单扫雷游戏,玩家可以选择不同的难度级别并尝试找到所有地。 ```c #include <stdio.h> #include <stdlib.h> #include <time.h> #define ROW 10 #define COL 10 #define EASY 10 #define MEDIUM 20 #define HARD 30 int main() { int board[ROW][COL], num_mines, num_flags; int i, j, r, c, count, gameover = 0, win = 0, choice; char action; srand(time(NULL)); printf("Welcome to Minesweeper\n"); printf("----------------------\n"); printf("Choose a difficulty level:\n"); printf("1. Easy\n2. Medium\n3. Hard\n"); scanf("%d", &choice); switch (choice) { case 1: num_mines = EASY; break; case 2: num_mines = MEDIUM; break; case 3: num_mines = HARD; break; default: printf("Invalid choice. Defaulting to Easy difficulty.\n"); num_mines = EASY; break; } //initialize board with 0's for (i = 0; i < ROW; i++) { for (j = 0; j < COL; j++) { board[i][j] = 0; } } //place mines randomly for (i = 0; i < num_mines; i++) { r = rand() % ROW; c = rand() % COL; if (board[r][c] == -1) { //already a mine here i--; continue; } board[r][c] = -1; } //fill in numbers for (i = 0; i < ROW; i++) { for (j = 0; j < COL; j++) { if (board[i][j] == -1) { //skip mines continue; } count = 0; if (i-1 >= 0 && j-1 >= 0 && board[i-1][j-1] == -1) count++; if (i-1 >= 0 && board[i-1][j] == -1) count++; if (i-1 >= 0 && j+1 < COL && board[i-1][j+1] == -1) count++; if (j-1 >= 0 && board[i][j-1] == -1) count++; if (j+1 < COL && board[i][j+1] == -1) count++; if (i+1 < ROW && j-1 >= 0 && board[i+1][j-1] == -1) count++; if (i+1 < ROW && board[i+1][j] == -1) count++; if (i+1 < ROW && j+1 < COL && board[i+1][j+1] == -1) count++; board[i][j] = count; } } //game loop while (!gameover && !win) { num_flags = 0; printf("\n\n"); for (i = 0; i < ROW; i++) { printf("%d ", i); for (j = 0; j < COL; j++) { if (board[i][j] == -2) { //flag printf("F "); num_flags++; } else if (board[i][j] >= 0 && board[i][j] <= 8) { printf("%d ", board[i][j]); } else { printf("X "); } } printf("\n"); } printf(" "); for (i = 0; i < COL; i++) { printf("%d ", i); } printf("\n\n"); printf("Number of flags: %d\n", num_flags); printf("Enter coordinate and action (f = flag, u = unflag, r = reveal): "); scanf("%d %d %c", &r, &c, &action); if (r < 0 || r >= ROW || c < 0 || c >= COL) { printf("Invalid coordinate.\n"); continue; } if (action == 'f' || action == 'F') { //flag if (board[r][c] != -2) { board[r][c] = -2; } else { board[r][c] = 0; } } else if (action == 'r' || action == 'R') { //reveal if (board[r][c] == -1) { //mine gameover = 1; } else { board[r][c] += 10; //reveal if (board[r][c] == 9) { //win win = 1; } else if (board[r][c] == 10) { //empty square //reveal adjacent squares if (r-1 >= 0 && c-1 >= 0 && board[r-1][c-1] >= 0 && board[r-1][c-1] <= 8) board[r-1][c-1] += 10; if (r-1 >= 0 && board[r-1][c] >= 0 && board[r-1][c] <= 8) board[r-1][c] += 10; if (r-1 >= 0 && c+1 < COL && board[r-1][c+1] >= 0 && board[r-1][c+1] <= 8) board[r-1][c+1] += 10; if (c-1 >= 0 && board[r][c-1] >= 0 && board[r][c-1] <= 8) board[r][c-1] += 10; if (c+1 < COL && board[r][c+1] >= 0 && board[r][c+1] <= 8) board[r][c+1] += 10; if (r+1 < ROW && c-1 >= 0 && board[r+1][c-1] >= 0 && board[r+1][c-1] <= 8) board[r+1][c-1] += 10; if (r+1 < ROW && board[r+1][c] >= 0 && board[r+1][c] <= 8) board[r+1][c] += 10; if (r+1 < ROW && c+1 < COL && board[r+1][c+1] >= 0 && board[r+1][c+1] <= 8) board[r+1][c+1] += 10; } } } else if (action == 'u' || action == 'U') { //unflag if (board[r][c] == -2) { board[r][c] = 0; } } else { printf("Invalid action.\n"); } } //game over, reveal all squares printf("\n\n"); for (i = 0; i < ROW; i++) { printf("%d ", i); for (j = 0; j < COL; j++) { if (board[i][j] == -2) { //flag printf("F "); } else if (board[i][j] >= 0 && board[i][j] <= 8) { printf("%d ", board[i][j]); } else if (board[i][j] == -1) { //mine printf("M "); } else { printf("X "); } } printf("\n"); } printf(" "); for (i = 0; i < COL; i++) { printf("%d ", i); } printf("\n\n"); if (gameover) { printf("Game over! You hit a mine.\n"); } else { printf("Congratulations, you win!\n"); } return 0; } ``` 该代码包括以下功能: - 难度选择 - 地随机放置 - 数字填充 - 可以插旗 - 可以取消插旗 - 可以揭开方块 - 只有揭开所有非地方块才能获胜 这个代码还有可以改进的地方,比如增加计时器和玩家得分等等。但是,希望这个代码可以给你提供一个基础的思路和参考。
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值