扫雷游戏-【C语言数组和函数的实践】

1.扫雷游戏分析和设计

1.1扫雷游戏需要具备的功能

(1)使用控制台实现经典的扫雷

(2)游戏可以通过选择实现继续或者退出游戏

(3)扫雷的棋盘是9*9的格子

(4)默认情况下布置10个雷

(5)可以排雷:如果位置不是雷,就显示周围有几个雷;

                           如果位置是雷,游戏就结束;

                          把除10个雷之外的所有雷都找出来,排雷成功,游戏结束;

1.2 分析和设计

1.2.1 结构的分析

我们在设计游戏时,要有一个布置雷的格子和一个储存排查雷信息的格子,这时我们就需要两个9*9的数组来存放信息。

0 1 2 3 4 5 6 7 8 9
1
2
3
4
5
6
7
8
9

我们如果设计 1 为雷 0 为空

扫雷游戏-【C语言数组和函数的实践】_第1张图片

这时我们想一下如果我们排雷拍的是边缘的格子 ,这时统计雷的时候坐标就会越界,为了防止越界,我们直接多创建一个11*11的格子,这时就解决了越界的问题

扫雷游戏-【C语言数组和函数的实践】_第2张图片

同时为了保持神秘,show数组(玩家看到的)开始时初始化为字符 '*',为了保持两个数组的类型⼀致,可以使⽤同⼀ 套函数处理,mine数组(布置了雷的)最开始也初始化为字符'0',布置雷改成'1'

1.2.2 结构的设计

我们之前学过了多文件的形式对函数的声明和定义,这里就着写这个游戏我们就来实践一下。我们需要设计三个文件

test.c //⽂件中写游戏的测试逻辑 
game.c //⽂件中写游戏中函数的实现等
game.h //⽂件中写游戏需要的数据类型和函数声明等

2.扫雷游戏的实现

game.h

#pragma once
#define row 9
#define col 9
#define EASY_COUNT 10
#define ROW row+2
#define COL col+2

#include
#include
#include

//初始化
void InitBoard(char arr[ROW][COL], int a, int b,char sz);
//打印
void print(char arr[ROW][COL], int a, int b);
//布置雷
void setmine(char arr[ROW][COL], int a, int b,int graded);
//排雷
void findmine(char mine[ROW][COL], char show[ROW][COL], int a, int b, int graded);
//判段周围的雷
int Getminecont(char mine[ROW][COL], int x, int y);

game.c

#include"game.h"
//初始化
void InitBoard(char arr[ROW][COL], int a, int b, char sz)
{
	int i = 0, j = 0;
		for (i = 0; i < a; i++)
		{
			for (j = 0; j < b; j++)
			{
				arr[i][j] = sz;
			}
		}
}
//打印棋盘
void print(char arr[ROW][COL], int a, int b)
{
	int i = 1, j = 1;
	for (i = 0; i <= a; i++)
	{
		printf("%d ", i);
	}
	printf("\n");
	for (i = 1; i <= a; i++)
	{
		printf("%d ", i);
		for (j = 1; j <= b; j++)
		{
			printf("%c ", arr[i][j]);
		}
		printf("\n");
	}

}
//布置雷
void setmine(char arr[ROW][COL], int a, int b,int graded)
{
	int conet = EASY_COUNT*graded;
	while (conet)
	{
		int x = rand() % row + 1;
		int y = rand() % col + 1;

		if (arr[x][y] == '0')
		{
			arr[x][y] = '1';
			conet--;
		}
	}
}
//排雷
void findmine(char mine[ROW][COL], char show[ROW][COL], int a, int b,int graded)
{
	int x, y;;
	int win = 0;
	while (win\n");
		scanf("%d %d", &x, &y);
		if (x >= 1 && x <= row && y >= 1 && y <= col)
		{
			if (mine[x][y] == '1')
			{
				printf("你被炸死了\n");
				print(mine, row, col);
				break;
			}
			else
			{
				int n = Getminecont(mine, x, y);
				show[x][y] = n+'0';
				print(show, row, col);
				win++;
			}
		}
		else
		{
			printf("坐标非法,请重新输入\n");
		}
	}
	if (win == row * col - EASY_COUNT* graded)
	{
		printf("恭喜你过关了\n");
	}
}
//判段周围的雷
int Getminecont(char mine[ROW][COL], int x, int y)
{
	return mine[x - 1][y] + mine[x - 1][y - 1] + mine[x][y - 1] + mine[x][y + 1] +
		mine[x + 1][y] + mine[x + 1][y + 1] + mine[x + 1][y - 1] +
		mine[x - 1][y + 1]-8*'0';
}

test.c

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

}
void  Graded()
{
	printf("***************************\n");
	printf("*******  简单——1 ********\n");
	printf("*******  中等——4 ********\n");
	printf("*******  地狱——7 ********\n");
	printf("***************************\n");
}

void game()
{
	char mine[ROW][COL];
	char show[ROW][COL];
	int graded = 1;
	scanf("%d", &graded);
	//初始化棋盘
	InitBoard(mine,ROW,COL,'0');
	InitBoard(show, ROW, COL, '*');

	//打印棋盘
	print(show, row, col);
	//print(mine, row, col);
	//布置雷
	setmine(mine, row, col,graded);
	//print(mine, row, col);
	//排查雷
	findmine(mine, show, row, col,graded);
}
int main()
{
	int input = 0;
	srand((unsigned int)time(NULL));
	do
	{
		menu();
		printf("请输入->:");
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			printf("扫雷\n");
			printf("请选择难度->\n");
			Graded();
			printf("请选择难度->\n");
			game();
			break;
		case 0:
			printf("退出游戏\n");
			break;
		default:
			printf("输入错误\n");
			break;
		}
	} while (input);
	return 0;
}

 游戏还在扩展,后面做出来了,再发出来。

 扫雷游戏-【C语言数组和函数的实践】_第3张图片

(WBG加油!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!) 

你可能感兴趣的:(C语言,小游戏,游戏)