C语言数组应用的简单应用———扫雷游戏

1.扫雷游戏——————C初学者的简单版本

        实现: ①难度选择,不同的雷数的计算方法产生不同的难度;

                   ②第一次踩到雷不会跳出;

                   ③如果坐标周围没有雷的时候,扩展坐标。


源代码:

game.h

//*Copyright(c) 2018,葵司
//*All rights reserved.
//*
//*文件名称:排雷游戏
//*
//*当前版本:1.1
//*作者:葵司
//*完成日期:2018年4月23日
//*
//*取代版本:1.0
//*作者:葵司
//*


#ifndef  _GAME_H_
#define  _GAME_H_


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


enum OPTION
{
	PLAY = 1,
	EXIT = 2
};


#define ROW 10
#define COL 10
#define ROWS ROW+2
#define COLS COL+2
extern int nume ;//置0和不置0有区别
extern int Spacenumber;

void interface();
int  Choose(int a);
void InitBoard(char board[ROWS][COLS], int rows, int cols, char set);
void PrintBoard(char board[ROWS][COLS], int rows, int cols);
void SetMine(char board[ROWS][COLS],int row,int col);
void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col);
int GetMineCount(char mine[ROWS][COLS], int x, int  y);
void expand(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col, int x, int y);


#endif//_GAME_H_


game.c

#include "game.h"
int nume;//全局变量定义
int Spacenumber;//全局变量定义


//初始化数组
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 PrintBoard(char board[ROWS][COLS], int row, int col)
{
	int i = 0;
	int j = 0;
	for (j = 0; j <= row; j++)
	{
		printf("%-2d ", j);
	}
	printf("\n");
	for (i = 0; i < row; i++)
	{
		printf("%-2d", i+1);
		for (j = 0; j < col; j++)
		{
			printf(" %c ", board[i][j]);
		}
		printf("\n");
	}
	printf("\n");
}


//设置炸弹
void SetMine(char board[ROWS][COLS])
{
	int count =nume;
	int x = 0;
	int y = 0;
	while (count)
	{
		x = rand() % ROW + 1;
		y = rand() % COL + 1;
		if ('0' == board[x][y])
		{
			board[x][y] = '1';//有雷的地方设置为字符1
			count--;
		}
	}
}



//返回玩家输入坐标周围的雷数
static int GetMineCount(char mine[ROWS][COLS], int x, int y)
{

	int minecount = 0;


	if (mine[x - 1][y] == '1')
		minecount++;
	if (mine[x - 1][y + 1] == '1')
		minecount++;
	if (mine[x - 1][y + 1] == '1')
		minecount++;
	if (mine[x][y + 1] == '1')
		minecount++;
	if (mine[x + 1][y + 1] == '1')
		minecount++;
	if (mine[x + 1][y] == '1')
		minecount++;
	if (mine[x + 1][y - 1] == '1')
		minecount++;
	if (mine[x][y - 1] == '1')
		minecount++;
	if (mine[x - 1][y - 1] == '1')
		minecount++;
	return minecount;
}



//利用函数递归调用实现的扩展函数
void expand(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col, int x, int y)
{
	if (0 == GetMineCount(mine, x, y))
		{
			show[x][y] = ' ';
			Spacenumber++;

			if (show[x][y - 1] == '*')
			{
				expand(mine, show, row, col, x, (y - 1));
			}

			if (show[x][y + 1] == '*')
			{
				expand(mine,show, row, col, x, (y + 1));
			}

			if (show[x - 1][y] == '*')
			{
				expand(mine, show, row, col, (x - 1), y);
			}

			if (show[x + 1][y] == '*')
			{
				expand(mine, show, row, col, (x + 1), y);
			}
		}
	else
	{
		show[x][y] = GetMineCount(mine, x, y) + '0';
	}
}



//找雷函数
void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col)
{
	int x = 0;
	int y = 0;
	int sum = 0;
	int count = 0;
	int ret = 0;

	while (row*col-sum>nume)
	{
		printf("请输入您的坐标:");
		scanf("%d%d", &x, &y);
		printf("\n");
		count++;

		while (1 == (x >= 1 && x <= row && y >= 1 && y <= col))
		{
			sum++;
			x--;
			y--;
			if ('1' == mine[x][y])
			{
				if (1 == count)//判断是否第一次就踩到雷了
				{
					printf("炸了!再给你一次机会!\n");
					printf("\n");
					break;
				}
				else
				{
					printf("恭喜你中奖了,你踩到雷了!GAME OVER!\n");
					printf("\n");
					return 0;
				}
			}
			else
			{
				expand(mine, show, row, col, x, y);
				PrintBoard(show, ROW, COL);
				break;
			}

			if (0 == (x >= 1 && x <= row && y >= 1 && y <= col))
			{
				printf("输入非法!请重新输入!\n");
				printf("\n");
			}
		}
	}
	if (row*col-sum == nume)
	{
				printf("恭喜你,扫雷成功!\n");
				printf("\n");
	}
}


find.c

#include "game.h"
int nume;//全局变量定义
int Spacenumber;//全局变量定义


//菜单函数
void MENU()
{
		printf("                          #####                             \n");
		printf("                   ######       ######                      \n");
		printf("              #######    1.PLAY     #######                 \n");
		printf("              #######    2.EXIT     #######                 \n");
		printf("                   ######       ######                      \n");
		printf("                          #####                             \n");
}


//选择界面
void interface()
{
	printf("*********************************************************************\n");
	printf("********************   1.菜鸟   *************************************\n");
	printf("********************   2.高手   *************************************\n");
	printf("********************   3.老鸟   *************************************\n");
	printf("*********************************************************************\n");
	printf("\n");
}


//难度选择,返回不同的雷的数目
int  Choose(int a)
{
	switch (a)
	{
	case 1:
		return ROW;
	case 2:
		return ROW + ROW / 2;
	case 3:
		return ROW * 2 ;
	default:
	{
			   printf("输入错误,请重新输入!");
			   break;
	}
	}
}



//游戏函数
void game()
{
	char mine[ROWS][COLS] = { '0' };  
	char show[ROWS][COLS] = { '0' };



	InitBoard(mine, ROW, COL, '0');//布雷的函数初始化为‘0’
	InitBoard(show, ROWS, COLS, '*');//显示的函数初始化为‘0’



	//PrintBoard(mine, ROW, COL);
	PrintBoard(show, ROW, COL);


	SetMine(mine,ROW,COL);//生成随机位置的雷
	//PrintBoard(mine, ROW, COL);
	FindMine(mine, show, ROW, COL);//找雷函数
}


//执行函数
void TEST()
{
	srand((unsigned)time(NULL));
	int input = 0;
	int i = 0;
	do
	{
		MENU();
		printf("请选择->");
		scanf("%d", &input);
		switch (input)
		{
		case 1:
		{
				  interface();
				  printf("请选择难度");
				  scanf("%d", &i);
				  nume= Choose(i);//全局变量赋予其雷的数目
				  game();
				  break;
		}
		case 2:
			printf("您将退出游戏!\n");
			break;
		default:
			printf("您输错了,请再输入!\n");
			break;
		}
	} while (input);
}



//主函数
int main()
{
	TEST();
	system("pause");
	return 0;
}

注:代码在VS2013上已运行,无误。


已知bug:(我也想改,但不会,所以会继续以优化-_+)

                ①:当游戏是 9*9 时,如果我把雷数设置成80个时,编译成功,但运行会出现问题

                ②..............

发现的问题:

                ①:全局变量在头文件中初始化为0和不为0效果不一样,待解决,

                ②............

    


猜你喜欢

转载自blog.csdn.net/kuisi95/article/details/80056745