超级腻害滴扫雷大作战 ! ! !

目录

一.扫雷游戏概述

1.游戏概述

2.游戏规则

二.代码实现的过程

1.创建一个菜单界面函数,用于选择退出游戏或者是进入游戏

2.创建两个棋盘,并初始化

3.在棋盘board放雷

4.可展示玩家棋盘(棋盘revealed),和布雷棋盘(棋盘board)

5.排雷

①玩家输入坐标

 ②检验坐标

③正式排雷

 ④展示完整代码

 三.完整的扫雷游戏的源码

学完数组和函数就可以实现的小游戏,一起来看看吧!

一.扫雷游戏概述

1.游戏概述

扫雷游戏是一款大众类的益智小游戏,目标是在最短的时间内根据点击格子出现的数字找出所有非雷格子,同时避免踩到地雷。
游戏有初级、中级、高级和自定义等模式,难度逐渐增加。玩家需要运用逻辑推理和判断来找出所有非雷方块,挑战自己的智慧和反应速度。

欢迎大家去尝试哦,玩两把游戏有助于更好的理解呢!!!

扫雷游戏网页版 - Minesweeper

2.游戏规则

玩家在一个由方块组成的雷区中,需要尽快找出所有不是地雷的方块,但不能踩到地雷。每个方块在点击后,会显示出周围有多少个地雷,数字是几,就代表周围有几个地雷。

而可以确定是雷的可以按右键做标记

二.代码实现的过程

1.创建一个菜单界面函数,用于选择退出游戏或者是进入游戏


void menu()
{
	printf("***********************\n");
	printf("***********************\n");
	printf("******  1.play  *******\n");
	printf("******  0.exit  *******\n");
	printf("***********************\n");
	printf("***********************\n");
}
.......
.......
 do{
    	menu();
		printf("请输入你的选择:");
		scanf("%d", &input);
		switch (input)//switch语句,判断执行内容
		{
			case 1:
				printf("\n请开始扫雷\n");
				game();
				break;
			case 0:
				printf("\n已退出游戏!\n");
				break;
			default:
				printf("\n选择错误,请重新输入!\n");
				break;
		}
    }while(input);

游戏开始!!

 下图是主要函数

void game()
{
	//打印棋盘
	DisplayBoard(revealed);//打印9×9显示给用户看的棋盘
 
	//布置雷
	placeMines();
	
	//布置好雷之后可以打印雷,查看是否布置成功
	//DisplayBoard(board);
 
	//开始排查雷
	FindMine();
	
}

 

2.创建两个棋盘,并初始化

棋盘board为放雷的棋盘

棋盘revealed为展示给别人看的

#define N 9 //棋盘显示的长宽
#define NS N+2 //存储的棋盘的长宽

char board[NS][NS];//放雷的棋盘 
char revealed[NS][NS];//显示给用户看的棋盘 
//初始化棋盘 
void initializeBoard(){
    int i, j;
    for (i = 0; i < NS; i++) {
        for (j = 0; j < NS; j++) {
            board[i][j] = '0';
            revealed[i][j] = '.';
        }
    }
}

3.在棋盘board放雷


//安置雷 雷的数量为N
void PlaceMines() {
    int count = 0;
    while (count < N) {
        int x = rand() % N+1;
        int y = rand() % N+1;
        if (board[x][y] == '0') {
            board[x][y] = '*';
            count++;
        }
    }
}

其中rand()可产生随机数,以保证每次游戏雷的位置不同

下图是产生随机数的函数

 srand((unsigned int)time(NULL));//随机数

 下图是该函数的头文件

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

4.可展示玩家棋盘(棋盘revealed),和布雷棋盘(棋盘board)

//打印显示的棋盘
void DisplayBoard(char arr[][NS])
{
	int i = 0; //控制行
	for (i = 0; i <= N; i++)//打印列号
	{
		printf("%d ", i);
	}
	printf("\n");
	for (i = 1; i <= N; i++)                                     
	{
		int j = 0;
		printf("%d ",i);//打印行号
		for (j = 1; j <= N; j++)//控制列
		{
			printf("%c ", arr[i][j]);//循环打印数组里的所有内容
		}printf("\n");//每一行打印完之后换行
	}
	printf("\n");
}

效果如下图所示 

5.排雷

①玩家输入坐标

	printf("请输入要排查的坐标(例如:3 2):");
	scanf("%d %d", &x, &y);//输入排查坐标

 ②检验坐标

if (x >= 1 && x <= N && y >= 1 && y <= N)//排查坐标需要在1-9之间
		{
			...
		}
else
		{
			printf("输入坐标错误,请重新输入\n");
		}

③正式排雷

if (board[x][y] == '*')//如果输入的坐标位置是‘*’,则被炸死
		{
			printf("啊哦,你被炸飞啦!!!!\n");
			printf("\n");
			DisplayBoard(board);//被炸死了将布置雷的棋盘打印出来
			break;//跳出
		}

		else//输入位置不是雷,则显示当前位置的周围有几个雷
		{
            int num = countMines(x, y);//九宫格雷的数量函数
            //将雷的数量放入show数组中, + ‘0’是将num由int类型转换为字符char类型
            revealed[x][y] = num + '0';
               
			DisplayBoard(revealed);//显示排查过后的用户棋盘
			cnt++;
		}

 ④展示完整代码


//排查雷
void FindMine()
{
	int x, y;//排查的坐标
	int cnt = 0;//可排查的次数
	while(cnt <=N*N - N)
	{
		printf("请输入要排查的坐标(例如:3 2):");
	    scanf("%d %d", &x, &y);//输入排查坐标
		
		if (x >= 1 && x <= N && y >= 1 && y <= N)//排查坐标需要在1-9之间
		{
			if (board[x][y] == '*')//如果输入的坐标位置是‘*’,则被炸死
			{
				printf("啊哦,你被炸飞啦!!!!\n");
				printf("\n");
				DisplayBoard(board);//被炸死了将布置雷的棋盘打印出来
				break;//跳出
			}
 
			else//输入位置不是雷,则显示当前位置的周围有几个雷
			{
                int num = countMines(x, y);//九宫格雷的数量函数
                //将雷的数量放入show数组中, + ‘0’是将num由int类型转换为字符char类型
                revealed[x][y] = num + '0';
                
				DisplayBoard(revealed);//显示排查过后的用户棋盘
				cnt++;
			}
		}
		else
		{
			printf("输入坐标错误,请重新输入\n");
		}
	}
}

 三.完整的扫雷游戏的源码

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define N 9 //棋盘显示的长宽
#define NS N+2 //存储的棋盘的长宽

char board[NS][NS];//放雷的棋盘 
char revealed[NS][NS];//显示给用户看的棋盘 

void menu()
{
	printf("***********************\n");
	printf("***********************\n");
	printf("******  1.play  *******\n");
	printf("******  0.exit  *******\n");
	printf("***********************\n");
	printf("***********************\n");
}
//初始化棋盘 
void initializeBoard(){
    int i, j;
    for (i = 0; i < NS; i++) {
        for (j = 0; j < NS; j++) {
            board[i][j] = '0';
            revealed[i][j] = '.';
        }
    }
}

//打印显示的棋盘
void DisplayBoard(char arr[][NS])
{
	int i = 0; //控制行
	for (i = 0; i <= N; i++)//打印列号
	{
		printf("%d ", i);
	}
	printf("\n");
	for (i = 1; i <= N; i++)                                     
	{
		int j = 0;
		printf("%d ",i);//打印行号
		for (j = 1; j <= N; j++)//控制列
		{
			printf("%c ", arr[i][j]);//循环打印数组里的所有内容
		}printf("\n");//每一行打印完之后换行
	}
	printf("\n");
}

//安置雷 雷的数量为N
void PlaceMines() {
    int count = 0;
    while (count < N) {
        int x = rand() % N+1;
        int y = rand() % N+1;
        if (board[x][y] == '0') {
            board[x][y] = '*';
            count++;
        }
    }
}

//数安全区雷数 
int countMines(int x, int y) {
    int count = 0;
    int i, j;
    for (i = -1; i <= 1; i++) {
        for (j = -1; j <= 1; j++) {
            if (board[x + i][y + j] =='*') {
                count++;
            }
        }
    }
    return count;
}

//排查雷
void FindMine()
{
	int x, y;//排查的坐标
	int cnt = 0;//可排查的次数
	while(cnt < =N*N - N)
	{
		printf("请输入要排查的坐标(例如:3 2):");
	    scanf("%d %d", &x, &y);//输入排查坐标
		
		if (x >= 1 && x <= N && y >= 1 && y <= N)//排查坐标需要在1-9之间
		{
			if (board[x][y] == '*')//如果输入的坐标位置是‘*’,则被炸死
			{
				printf("啊哦,你被炸飞啦!!!!\n");
				printf("\n");
				DisplayBoard(board);//被炸死了将布置雷的棋盘打印出来
				break;//跳出
			}
 
			else//输入位置不是雷,则显示当前位置的周围有几个雷
			{
                int num = countMines(x, y);//九宫格雷的数量函数
                //将雷的数量放入show数组中, + ‘0’是将num由int类型转换为字符char类型
                revealed[x][y] = num + '0';
                
				DisplayBoard(revealed);//显示排查过后的用户棋盘
				cnt++;
			}
		}
		else
		{
			printf("输入坐标错误,请重新输入\n");
		}
	}
}

void game()
{
	//打印棋盘
	DisplayBoard(revealed);//打印9×9显示给用户看的棋盘
 
	//布置雷
	PlaceMines();
	
	//布置好雷之后可以打印雷,查看是否布置成功
	//DisplayBoard(board);
 
	//开始排查雷
	FindMine();
	
}
int main() {
    srand((unsigned int)time(NULL));//随机数 
    initializeBoard();

    int x, y;
    int input=0; 

    do{
    	menu();
		printf("请输入你的选择:");
		scanf("%d", &input);
		switch (input)//switch语句,判断执行内容
		{
			case 1:
				printf("\n请开始扫雷\n");
				game();
				break;
			case 0:
				printf("\n已退出游戏!\n");
				break;
			default:
				printf("\n选择错误,请重新输入!\n");
				break;
		}
    }while(input);

    return 0;
}

  • 5
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值