0
点赞
收藏
分享

微信扫一扫

C语言实战项目【3】简易扫雷

自由情感小屋 2022-04-13 阅读 62
c语言

在学习C语言的二维数组之后,我们就有能力做一个简单的扫雷游戏了

还是老规矩,分析思路

目录

1.目录

2.持续游戏

3.制作棋盘

4.埋雷

5.排雷

6.打印棋盘

7.全部代码


1.目录

最开始要给玩家选择是进入游戏还是退出游戏,所以给一个目录,这里我做出来的是这样的

2.持续游戏

制作一个持续进行游戏,这里我用dowhile来实现,具体代码如下

	int input;

	do
	{
		menu();
		scanf("%d",&input);
		switch (input)
		{
		case 1:
		{
			game();
			break;
		}
		case 0:
		{
			printf("退出游戏\n");
			break;
		}
		default:
		{
			printf("输入错误,请重新输入\n");
			break;
		}
		}
	} while (input);

这样就可以让用户自己选择是继续游戏还是退出游戏

3.制作棋盘

制作棋盘,对于棋盘我选择用二维是数组来解决,这里我们需要设置两个棋盘,一个是埋雷的棋盘,一个是用户排雷的棋盘,然后为了美观给棋盘排雷的棋盘初始化为'*',为了方便,给埋雷的棋盘初始化成'0'具体初始化代码如下

void Init(char arr[ROWS][COLS], int  rows, int cols, char set)
{
	for (int i = 0; i < rows; i++)
	{
		for (int j = 0; j < cols; j++)
		{
			arr[i][j] = set;
		}
	}
}

这里的set是为了初始化两个棋盘的时候更加方便,所以我就封装成了一个初始化函数

4.埋雷

埋雷我们需要给对应的埋雷棋盘的对应位置把'0'更改成成'1',这样设计是为了方便我们进行是否有类判断的时候更加方便,在进行埋雷之前要对对应的棋盘进行初始化,这里我还是用随机数的函数来设置雷,如果不知道设置随机数函数的,可以看我之前的文章猜数字C语言实战项目【猜数字】埋雷具体代码如下

void set_mine(char arr[ROWS][COLS], int row, int col)
{
	int x = 0;
	int y = 0;
	for (int i = 1; i <= EASY_COUNT; i++)
	{
		while(1)
		{
			x = rand() % 9 + 1;//1-9
			y = rand() % 9 + 1;
			if (arr[x][y] == '0')
			{
				arr[x][y] = '1';
				break;
			}
		}
	}
}

5.排雷

埋雷之后需要玩家进行排雷,这里我把判胜负的代码直接放到这里面了,如果想的话,也可以重新封装成一个函数来调用,这里排雷需要让玩家输入,然后判断胜负,循环知道雷排完,或者踩到雷为止,玩家每次输入一次之后,我们需要对排雷的棋盘进行打印,让玩家知道自己的操作是否踩到雷和附近是否有雷,这里我们用加减法来判断玩家排雷处有多少雷,这里就和前面关联起来了,我们设置'0'和'1‘,九宫格相减的结果就是附近具体的雷数,具体代码如下

void find_mine(char arr[ROWS][COLS], char mine[ROWS][COLS] ,int row, int  col)
{
	int x = 0,y = 0,sum=0,n;
	while (1)
	{
		static int count = 0;
		if (count == ROW * COL - EASY_COUNT)
		{
			printf("you win");
			break;
		}
		else
		{
			printf("请输入:>\n");
			scanf("%d %d", &x, &y);
			if (arr[x][y] == '1')
			{
				printf("你输了\n");
				print_board(arr, ROW, COL);

				break;
			}
			else
			{
				sum = 0;
				for (int i = -1; i <= 1; i++)
				{
					for (int j = -1; j <= 1; j++)
					{
						sum = sum + arr[x + i][y + j];
					
					}

				}
				n = sum - 9 * '0';
				mine[x][y] = '0' + n;
				print_board(mine, ROW, COL);

			}
			count++;
		}

6.打印棋盘

这里我们可以把打印棋盘封装成一个函数,给上面的代码进行调用,也就是我上面的printf_board函数,具体代码如下

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

		}
		
		printf("\n");

	}
	printf("———————————————\n");
}

到这里,扫雷的全部功能就已经实现了,剩下的就是用代码来执行了

7.全部代码

全部代码在这里

//game.h
#define _CRT_SECURE_NO_WARNINGS
#pragma once
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<string.h>
#define ROW 9
#define COL 9
#define ROWS ROW+2
#define COLS COL+2
#define EASY_COUNT 10

void Init(char arr[ROWS][COLS],int  rows, int cols, char set);
void print_board(char arr[ROWS][COLS], int row , int col);
void set_mine(char arr[ROWS][COLS], int row, int col);
void find_mine(char arr[ROWS][COLS],char mine[ROWS][COLS] ,int row,int  col);




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

}

void game()
{
	srand((unsigned int)time(NULL));
	char arr[ROWS][COLS];
	char mine[ROWS][COLS];
	Init(arr, ROWS, COLS, '0');
	Init(mine, ROWS, COLS, '*');
	set_mine(arr, ROW, COL);
	print_board(mine, ROW, COL);
	find_mine(arr,mine, ROW, COL);
	print_board(mine, ROW, COL);

}
int main()
{
	int input;

	do
	{
		menu();
		scanf("%d",&input);
		switch (input)
		{
		case 1:
		{
			game();
			break;
		}
		case 0:
		{
			printf("退出游戏\n");
			break;
		}
		default:
		{
			printf("输入错误,请重新输入\n");
			break;
		}
		}
	} while (input);

	return 0;
}



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

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

		}
		
		printf("\n");

	}
	printf("———————————————\n");
}


void set_mine(char arr[ROWS][COLS], int row, int col)
{
	int x = 0;
	int y = 0;
	for (int i = 1; i <= EASY_COUNT; i++)
	{
		while(1)
		{
			x = rand() % 9 + 1;//1-9
			y = rand() % 9 + 1;
			if (arr[x][y] == '0')
			{
				arr[x][y] = '1';
				break;
			}
		}
	}
}


void find_mine(char arr[ROWS][COLS], char mine[ROWS][COLS] ,int row, int  col)
{
	int x = 0,y = 0,sum=0,n;
	while (1)
	{
		static int count = 0;
		if (count == ROW * COL - EASY_COUNT)
		{
			printf("you win");
			break;
		}
		else
		{
			printf("请输入:>\n");
			scanf("%d %d", &x, &y);
			if (arr[x][y] == '1')
			{
				printf("你输了\n");
				print_board(arr, ROW, COL);

				break;
			}
			else
			{
				sum = 0;
				for (int i = -1; i <= 1; i++)
				{
					for (int j = -1; j <= 1; j++)
					{
						sum = sum + arr[x + i][y + j];
					
					}

				}
				n = sum - 9 * '0';
				mine[x][y] = '0' + n;
				print_board(mine, ROW, COL);

			}
			count++;
		}
		

	}
}

快去试试吧

举报

相关推荐

0 条评论