扫雷(C语言)

●游戏规则

 

       在扫雷游戏中,当你点开一个格子的时候,里面会随机出现一个数字,而这个数字代表了该格子周围有多少颗炸弹,你要推理出炸弹在哪里并避开它,每个难度下的炸弹数量不一样,当你把所有没有炸弹的格子都点开之后,雷就被排了,你就赢了。

●游戏函数

       在扫雷游戏中,我们需要定义两个棋盘,一个是放置雷的棋盘,一个是玩家进行操作的棋盘,我们通过玩家输入的坐标,在第一个棋盘是否踩雷,在第二个棋盘对输入过的坐标进行标记,并显示周围8个格内的雷数.

void game()
{
	char Mine[ROWS][COLS] = { 0 };
	char board[ROWS][COLS] = { 0 };
	int row = ROW;
	int col = COL;
	int rows = ROWS;
	int cols = COLS;
	intiboard(Mine, rows, cols, '0');
	intiboard(board, rows, cols, '*');
	displayboard(board, row, col);
	setmine(Mine, row, col);
	findmine(Mine,board, row, col);
}

●初始化棋盘

       在这里,和三子棋相比,我们额外设置了一个ret参数,来初始化两个棋盘,因为两个棋盘内的符号需要设置成不同的符号,在放置雷的棋盘中,需要把雷设置成‘1’,以便于计算雷的个数. 

void intiboard(char board[ROWS][COLS], int row, int col, char ret)
{
	for (int i = 0; i < row; i++)
	{
		for (int j = 0; j < col; j++)
		{
			board[i][j] = ret;
		}
	}
}

 ●放置雷

       使用rand()函数生成随机值,设置为雷的坐标。

(在主函数中使用srand((unsigned int)time(NULL)),防止每次开始游戏,生成的坐标相同)

void setmine(char Mine[ROWS][COLS], int row, int col)
{

	int count = 10;
	while (count)
	{
		int x = rand() % row + 1;
		int y = rand() % row + 1;
		if (Mine[x][y] == '0')
		{
			Mine[x][y] = '1';
			count--;
		}
	}
}

 ●排雷

void findmine(char Mine[ROWS][COLS], char board[ROWS][COLS], int row, int col)
{
	int x = 0;
	int y = 0;
	int win = 0;
	while (win < row * col - 10)//如果中途没有被雷炸死,会一直循环,直到只剩下10个雷
	{
		printf("请输入要排查的坐标:>");
		scanf("%d %d", &x, &y);
		if (x >= 1 && x <= row && y >= 1 && y <= col)
		{
			if (Mine[x][y] == '1')//'1'为雷
			{
				printf("很遗憾你被炸死了n");
				displayboard(Mine, row, col);
				break;
			}
			else
			{
				int n = getcount_mine(Mine, x, y);//计算x,y坐标周围有几个雷
				board[x][y] = n + '0';
				displayboard(board, row, col);
				win++;
			}
		}
		else
		{
			printf("输入坐标非法,无法排雷,请重新输入n");
		}
	}
	if (win == row * col - 10)
	{
		printf("恭喜你,排雷成功n");
		displayboard(Mine, row, col);
	}
}

●完整代码

text.c

#define _CRT_SECURE_NO_WARNINGS 1
#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 board[ROWS][COLS] = { 0 };
	int row = ROW;
	int col = COL;
	int rows = ROWS;
	int cols = COLS;
	intiboard(Mine, rows, cols, '0');
	intiboard(board, rows, cols, '*');
	displayboard(board, row, col);
	setmine(Mine, row, col);
	findmine(Mine,board, row, col);
}
int main()
{
	srand((unsigned int)time(NULL));
	int input = 0;
	do
	{
		menu();
		printf("请输入1/0进入或退出游戏n");
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			game();
			break;
		case 0:
			printf("退出游戏n");
			break;
		default:
			printf("输入错误重新输入n");
			break;
		}
	} while (input);
	return 0;
}

game.c

#define _CRT_SECURE_NO_WARNINGS 1
#include"game.h"
void intiboard(char board[ROWS][COLS], int row, int col, char ret)
{
	for (int i = 0; i < row; i++)
	{
		for (int j = 0; j < col; j++)
		{
			board[i][j] = ret;
		}
	}
}
void displayboard(char board[ROWS][COLS], int row, int col)
{
	for (int i = 0; i <= col; i++)
		printf("%d ", i);
	printf("n");
	for (int i = 1; i <= row; i++)
	{
		printf("%d ", i);
		for (int j = 1; j <= col; j++)
		{
			printf("%c ", board[i][j]);
		}
		printf("n");
	}
}
void setmine(char Mine[ROWS][COLS], int row, int col)
{

	int count = 10;
	while (count)
	{
		int x = rand() % row + 1;
		int y = rand() % row + 1;
		if (Mine[x][y] == '0')
		{
			Mine[x][y] = '1';
			count--;
		}
	}
}
int getcount_mine(char Mine[ROWS][COLS],int x,int y)
{
	return Mine[x - 1][y] +
		Mine[x - 1][y - 1] +
		Mine[x][y - 1] +
		Mine[x + 1][y - 1] +
		Mine[x + 1][y] +
		Mine[x + 1][y + 1] +
		Mine[x][y + 1] +
		Mine[x - 1][y + 1] - 8 * '0';
}
void findmine(char Mine[ROWS][COLS], char board[ROWS][COLS], int row, int col)
{
	int x = 0;
	int y = 0;
	int win = 0;
	while (win < row * col - 10)
	{
		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;
			}
			else
			{
				int n = getcount_mine(Mine, x, y);
				board[x][y] = n + '0';
				displayboard(board, row, col);
				win++;
			}
		}
		else
		{
			printf("输入坐标非法,无法排雷,请重新输入n");
		}
	}
	if (win == row * col - 10)
	{
		printf("恭喜你,排雷成功n");
		displayboard(Mine, row, col);
	}
}

game.h

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define ROW 9
#define COL 9
#define ROWS ROW+2
#define COLS COL+2
void intiboard(char board[ROWS][COLS], int row, int col, char ret);
void displayboard(char board[ROWS][COLS], int row, int col);
void setmine(char Mine[ROWS][COLS],int row,int col);
void findmine(char Mine[ROWS][COLS], char board[ROWS][COLS],int row,int col);

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
THE END
分享
二维码
< <上一篇
下一篇>>