用函数和数组实现扫雷游戏(从0开始)

发布于:2024-03-23 ⋅ 阅读:(33) ⋅ 点赞:(0)

概要

学完数组和函数后我们可以通过所学知识写一个扫雷游戏,并实现一些拓展功能。
我们采用多文件联调的模式来制作,这里需要先建好三个文件
game.h
game.c
mine sweeper.c

整体架构流程(这里用VS2023来制作)

  1. 在mine sweeper.c中我们要先实现游戏的整体架构一开始要有一个菜单面板呈现在我们面前,所以我们可以设计一个menu()的函数来实现,因为不需要返回值所以我们建一个void类型的就可以。menu函数

  2. 然后我们继续写main函数,因为我们至少玩一次所以我们选择do-while循环,根据菜单我们要选择一下先建立一个整型input变量,然后用Switch做为开关来设计
    在这里插入图片描述

  3. 做完上面这些,我们就要开始扫雷游戏函数的实现了,这里命名它为game(),根据前面的推理我们先在game.h上利用宏定义ROWS,COLS,ROW,COL,利用这些就可以定义两个数组一个数组用来存放雷的信息,一个数组用来存放展示的信息,因为如果定义数字数组,会与排雷时的数字有冲突所以定义两个字符数组,并在最前面加上game.h
    在这里插入图片描述

    在这里插入图片描述

  4. 然后我们开始初始化棋盘,建立一个初始化棋盘的函数InitializeBoard(char arry[ROWS][COLS], int row, int col, char set)后面的set是为了方便赋予值,建立一个打印棋盘的函数void PrintBoard(char arry[ROW][COL],int row,int col)
    在这里插入图片描述

    在这里插入图片描述
    在这里插入图片描述

    在这里插入图片描述
    5. 初始化完棋盘然后我们就可以布置雷了,布置雷我们需要建立一个布置雷的函数void PutMine(char mine[ROW][COL], int row, int col),这里需要用到rand()所以我们先在main函数里面布下随机种子srand并且用到时间戳具体做法请看图片(注意补充头文件stdlib.h和time.h)
    在这里插入图片描述
    然后开始写布置雷的函数
    因为我们不只有一个雷所以要用到while循环(具体做法看图片)
    在这里插入图片描述

然后写排查雷的函数
在这里插入图片描述
还有设置一个获取排查雷周围信息的函数
在这里插入图片描述

代码实现

game.h

#pragma once

#include<stdio.h>
#include<stdlib.h>
#include<time.h>

#define ROW 9
#define COL 9

#define ROWS ROW + 2
#define COLS COL + 2

#define COUNT 10

void InitializeBoard(char arry[ROWS][COLS], int row, int col, char set);//初始化棋盘
void PrintBoard(char arry[ROWS][COLS],int row,int col);//打印棋盘
void PutMine(char board[ROWS][COLS], int row, int col);//布置雷
void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col);//排查雷


game.c

#define _CRT_SECURE_NO_WARNINGS 1

#include"game.h"


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

void PrintBoard(char arry[ROW][COL], int row, int col)
{
	int i = 0;
	printf("——————扫雷游戏——————\n");
	//打印列
	for (i = 0;i <= col;i++)
	{
		printf("%d ", i);
	}
	printf("\n");
	for (i = 1;i <= row;i++)
	{
		int j = 0;
		printf("%d ", i);
		for (j = 1;j <= col;j++)
		{
			printf("%c ", arry[i][j]);
		}
		printf("\n");
	}
}

void PutMine(char board[ROWS][COLS], int row, int col)
{
	int count = COUNT;
    
	while (count)
	{
		int x = rand() % row + 1;
		int y = rand() % col + 1;

		if (board[x][y] == '0')
		{
			board[x][y] = '1';
			count--;
		}
	}

}


int GetMine(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 show[ROWS][COLS], int row, int col)
{
	int x = 0;
	int y = 0;
	int win = 0;
	while (win < row*col-COUNT)
	{
		printf("请输入坐标-》");
		scanf("%d %d", &x, &y);
		

		if (x >= 1 && x <= row && y >= 1 && y <= col)
		{
			if (mine[x][y] == '1')
			{
				printf("很遗憾你被炸死了\n");
				PrintBoard(mine, ROW, COL);
				break;
			}
			else
			{
				int count = GetMine(mine, x, y);
				show[x][y] = count + '0';
				PrintBoard(show, ROW, COL);
				win++;
			}
		}
		else
		{
			printf("坐标非法请重新输入\n");
		}
	}
	if (win == row * col - COUNT)
	{
		printf("恭喜您扫雷成功\n");
		PrintBoard(mine, ROW, COL);
		
	}
}

mine sweeper.c

#define _CRT_SECURE_NO_WARNINGS 1

#include<stdio.h>
#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 };//展示出的信息
	
	//初始化棋盘
	InitializeBoard(mine, ROWS, COLS, '0');
	InitializeBoard(show, ROWS, COLS, '*');
	//打印棋盘
	//PrintBoard(mine, ROW, COL);
	PrintBoard(show, ROW, COL);
	//布置雷
	PutMine(mine, ROW, COL);
	PrintBoard(mine, ROW, COL);
	//排查雷
	FindMine(mine, show, ROW, COL);
}
int main()
{
	srand((unsigned int)time(NULL));
	int input = 0;
	
	do
	{
		menu();
		printf("请选择——》");
		scanf("%d", &input);

		switch (input)
		{
		case 1:
			game();
			break;
		case 0:
			printf("退出游戏");
			break;
		default:
			printf("选择错误,请重新输入");
			break;
		}


	} while (input);
	return 0;
}

小结

写扫雷这个小项目一开始虽然有点困难,但好在坚持了下来

本文含有隐藏内容,请 开通VIP 后查看