扫雷小游戏(简易版)

写个小游戏娱乐娱乐!

目录:1.简要分析

           2.实现扫雷游戏细节

            3.总代码

1.简要分析

一般写这种小游戏要分为两个模块:头文件,源文件。头文件中声明各种函数和库函数以及宏定义,全局变量等。源文件中主要是实现函数和逻辑函数等。

在扫雷游戏中,我将我的模块分为三部分,一部分是game.h--声明头文件等,game.c--实现游戏函数,test.c--实现总体逻辑

接下来就是扫雷游戏的细节处理

2.游戏细节

1.定义两个数组

char mine[ROW][COL];//用于存放雷的位置,以及非雷的位置,初始化为‘0’,然后才将雷的位置‘1’来替换原来的字符

char show[ROW][COL];//用于展示在游戏界面的雷阵,并不会将雷的位置暴露,且初始化为‘*’。

2.布雷

srand((unsigned int )time(NULL));

int x=0,y=0;

x=rand()%row+1;//用srand((unsigned int )time(NULL))来随机生成雷的位置坐标

y=rand()%col+1;//生成10个雷,就循环十次,将雷的位置存放在mine[ROW][COL]中

3.排雷

if(arr[x][y]==1)//当位置输入坐标在mine[ROW][COL]中存放的字符为‘1’时,则为踩雷,游戏结束

printf("游戏结束!");

else

int count = get_mine(mine, x, y);

//当输入坐标中的字符不是雷所在的位置就判断该位置四周的八个做是否有雷并显示出四周雷的数量
                show[x][y] = count+'0';
                show_board(show, ROW, COL);

//判断并计算输入位置四周的八个坐标是否有雷以及雷的数量
int get_mine(char mine[ROWS][COLS], int x, int y)
{
    return (mine[x - 1][y - 1] + mine[x - 1][y] + mine[x - 1][x + 1] +
        mine[x][x - 1] + mine[x][x + 1] +
        mine[x + 1][y - 1] + mine[x + 1][y] + mine[x + 1][y + 1] - 8 * '0'
        );
}

4.判断什么时候排雷成功

int win=0;//定义一个变量来判断什么时候排雷成功;

void find_mine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col)
{
    int x;
    int y;
    int win=0;
    while (win<row*col-EASY)
    {
        printf("请输入你将排查的位置坐标:\n");
        scanf("%d%d", &x, &y);
        if (x >= 1 && x <= row && y >= 1 && y <= col)
        {
            if (mine[x][y] == '1')
            {
                printf("很遗憾,踩雷了,游戏结束!\n");
                show_board(mine, ROW, COL);
                break;
            }
            else
            {
                int count = get_mine(mine, x, y);
                show[x][y] = count+'0';
                show_board(show, ROW, COL);
                win++;
            }
        }
        else
        {
            printf("坐标非法,请重新输入:\n");
        }
    }
    if (win == row * col - EASY)
        printf("恭喜你,排雷成功!\n");
}

3.总代码

1.test.c

#define _CRT_SECURE_NO_WARNINGS
#include "game.h"

void menu()
{
	printf("*****************\n");
	printf("***  1.play   ***\n");
	printf("***  0.exit   ***\n");
	printf("*****************\n");
}

void game()
{
	char mine[ROWS][COLS];//存放雷
	char show[ROWS][COLS];//用于展示给玩家的棋盘;

	//初始化棋盘
	init_board(mine, ROWS, COLS, '0');
	init_board(show, ROWS,COLS,'*');

	//打印棋盘;
	show_board(show, ROW, COL);
	//show_board(mine, ROW, COL);

	//布置雷
	set_mine(mine, ROW, COL);
	//show_board(mine, ROW, COL);

	//排雷
	find_mine(mine, show, ROW, COL);

}

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

2.game.h

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

#define ROW 9
#define COL 9

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

#define EASY 10

//初始化棋盘
void init_board(char arr[ROWS][COLS], int rows, int cols, char set);

//打印棋盘
void show_board(char arr[ROWS][COLS], int row, int col);

//布置雷
void set_mine(char arr[ROWS][COLS], int row, int col);

//排雷
void find_mine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col);

3.game.c

#define _CRT_SECURE_NO_WARNINGS
#include "game.h"

void init_board(char arr[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++)
		{
			arr[i][j] = set;
		}
	}
}

void show_board(char arr[ROWS][COLS], int row, int col)
{
	int i = 1;
	int j = 1;
	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");
	}
}

//布置雷
void set_mine(char arr[ROWS][COLS], int row, int col)
{
	int count = EASY;
	int x=0, y=0;
	while (count)
	{
		x = rand() % row + 1;
		y = rand() % col + 1;
		if (arr[x][y] == '0')
		{
			arr[x][y] = '1';
			count--;
		}
	}
}


int get_mine(char mine[ROWS][COLS], int x, int y)
{
	return (mine[x - 1][y - 1] + mine[x - 1][y] + mine[x - 1][x + 1] +
		mine[x][x - 1] + mine[x][x + 1] +
		mine[x + 1][y - 1] + mine[x + 1][y] + mine[x + 1][y + 1] - 8 * '0'
		);
}
void find_mine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col)
{
	int x;
	int y;
	int win=0;
	while (win<row*col-EASY)
	{
		printf("请输入你将排查的位置坐标:\n");
		scanf("%d%d", &x, &y);
		if (x >= 1 && x <= row && y >= 1 && y <= col)
		{
			if (mine[x][y] == '1')
			{
				printf("很遗憾,踩雷了,游戏结束!\n");
				show_board(mine, ROW, COL);
				break;
			}
			else
			{
				int count = get_mine(mine, x, y);
				show[x][y] = count+'0';
				show_board(show, ROW, COL);
				win++;
			}
		}
		else
		{
			printf("坐标非法,请重新输入:\n");
		}
	}
	if (win == row * col - EASY)
		printf("恭喜你,排雷成功!\n");
}

评论 27
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值