简易扫雷游戏的实现——C

文章目录


一、基本思路

        需要显示两个相同大小的棋盘(代码中分别命名为mine和show),用mine来实现对雷的布置操作,把show数组打印在屏幕上,需要把玩家对show数组的处理变成对mine数组的处理         1.编写一个简易的菜单来进行选择开始或退出游戏
       2.对mine数组和show数组进行初始化
       3.对mine数组操作,布下雷的信息
       4.打印show数组,扫雷并判断输、赢或继续游戏

二、代码实

 1.编写一个简易的菜单来进行选择开始或退出游戏

首先可以设制一个简易的菜单(这里的菜单无需太复杂,能实现游戏开始和退出即可),
由于不论玩家是否想继续游戏,菜单都必须至少出现一次进行判断,所以使用do……while循环 。代码如下(示例):

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

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

void test()
{
	int input = 0;
	srand((unsigned int)time(NULL));//生成随机数,在布雷时,随机生成雷的坐标;

	do
	{
		menu();

		printf("请选择:>");
		scanf("%d", &input);
		switch(input)
		{
		case 1:
			{
			game();
			break;
			}
		case 0:
			{
			printf("请退出游戏\n");
			break;
			}
		default:
			{
			printf("选择错误,请重新选择!\n");
			break;
			}
		}
	}while (input);
}

int main()
{
	test();

	return 0;
}
  • 2.对mine数组和show数组进行初始化

  • 初始化mine数组考虑用字符’0’ 表示该处为空。初始化show数组的每一个元素初始化为’*’。代码如下(示例):

#define ROW 9
#define COL 9 //设置的扫雷棋盘大小为9*9;

#define ROWS ROW+2
#define COLS COL+2 由于扫雷是需要打印出某个位置周围8个位置的雷的数量,则边界处会发生数组访问越界,所以在原数组基础上增加两行两列,这样访问数组是不会发生越界;

//初始化棋盘
void initboard(char board[ROWS][COLS], int rows, int cols, char set)
{ //参数char set,可以将mine, show两个棋盘用一个函数初始化;
	int i, j;
	for (i = 0; i < rows; i++)
	{
		for (j = 0; j < cols; j++)
		{
			board[i][j] = set;
		}
	}

}

//打印棋盘
void displayboard(char board[ROWS][COLS], int row, int col)
{
	int i, j;
	for (i = 1; i <= row; i++)
	{
		printf("%d ", i); //这里打印出棋盘的行号,扫雷时方便确定坐标;
	}
	printf("\n");
	for (i = 0; i <= row; i++)
	{
     printf("%d ", i);
		for (j = 1; j <= col; j++)
		{
			printf("%c ", board[i][j]); //这里打印出棋盘
		}
		printf("\n");
	}
}
  • 3.对mine数组操作,布下雷的信息

        代码如下(示例):

#define easy_count 10 //设定当前模式下需排雷的数量;

void setmine(char board[ROWS][COLS], int row, int col)
{
	int count = easy_count;
	while (count)
	{
		int x = rand() % row+1;
		int y = rand() % col+1; //设置雷的x,y 随机坐标;

        if (board[x][y] == '0') //'0'表示无雷;
		{
            board[x][y] = '1';  //'1'表示雷;
			count--;   //成功布雷后,雷总数减1;
		}
	}
}
  • 4.打印show数组,开始扫雷并判断输、赢或继续游戏

           将show数组显示在屏幕上,下面是玩家看到的雷阵

           

 玩家输入认为是非雷的坐标,由于show与mine大小相同且mine数组已设置雷的信息,所以玩家通过对show数组的操作,可用来处理mine数组,进行扫雷,并判断输赢。

代码如下(示例):

int get_mine_count(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';
}  //如果有雷,返回值不为0;如果无雷,返回值为0;

void findmine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col)
{
	int x, y;
	int win = 0;
	while (win < row*col - easy_count) //row * col - EASY_COUNT就是安全的空格的数量;
	{                                  //如果排出的空格小于这个数就继续排雷;
	   printf("请输入排查雷的坐标:>");
	   scanf("%d%d", &x, &y);
	   if (x >=1 && x <= row && y >=1 && y <=col)
	   {
          if (mine[x][y] == '1')
		  {
			printf("很遗憾,你被炸死了\n");
            displayboard(mine, row, col);
			break;
		  }
		  else
		  {
			 int count = get_mine_count(mine, x, y);
			 show[x][y] = count + '0'; //显示这个位置周围八个位置的雷的个数;
             displayboard(show, row, col);
			 win++;
	      }
      }
	  else
		printf("输入坐标非法,请重新输入!\n");
	}
	if (win == row*col-easy_count)
    {
		printf("恭喜你,排雷成功!\n");
         displayboard(mine, row, col);
    }
}
  • 三、全部代码

    #define ROW 9
    #define COL 9
    
    #define ROWS ROW+2
    #define COLS COL+2
    
    #define easy_count 10 //设置当前模式下雷的数量;
    
    # include <stdio.h>
    # include <stdlib.h>
    # include <time.h>
    
    void initboard(char board[ROWS][COLS], int rows, int cols, char set); //初始化
    void displayboard(char board[ROWS][COLS], int row, int col);//打印棋盘
    void setmine(char board[ROWS][COLS], int row, int col);//设置雷
    void findmine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col);//扫雷
    
    
    void menu()
    {
    	printf("******************************\n");
    	printf("***** 1.play    2.exit   *****\n");
    	printf("******************************\n");
    }
    
    void game()
    {
        char mine[ROWS][COLS] = {0};//mine数组用于布置雷的信息
    	char show[ROWS][COLS] = {0};//show数组用于排查雷的信息
    
    	initboard(mine, ROWS, COLS, '0');//初始化
    	initboard(show, ROWS, COLS, '*');
        displayboard(mine, ROW, COL);//打印棋盘
    	displayboard(show, ROW, COL);
    	setmine(mine, ROW, COL);//设置雷
        findmine(mine, show, ROW, COL);//扫雷
    }
    
    void test()
    {
    	int input = 0;
    	srand((unsigned int)time(NULL));
    	
    	do
    	{
    		menu();
    		printf("请选择:>");
    		scanf("%d", &input);
    		switch(input)
    		{
    		case 1:
    			{
    				game();
    				break;
    			}
    		case 0:
    			{
    				printf("请退出游戏\n");
    				break;
    			}
    		default:
    			{
    				printf("选择错误,请重新选择!\n");
    				break;
    			}
    		}
    	}while (input);
    	
    }
    
    int main()
    {
    	test();
    	return 0;
    }
    
    
    void initboard(char board[ROWS][COLS], int rows, int cols, char set)
    {
    	int i, j;
    	for (i = 0; i < rows; i++)
    	{
    		for (j = 0; j < cols; j++)
    		{
    			board[i][j] = set;
    		}
    	}
    	
    }
    
    void displayboard(char board[ROWS][COLS], int row, int col)
    {
    	int i, j;
    	for (i = 1; i <= row; i++)
    	{
    		printf("%d ", i);
    	}
    	printf("\n");
    	for (i = 0; i <= row; i++)
    	{
    		printf("%d ", i);
    		for (j = 1; j <= col; j++)
    		{
    			printf("%c ", board[i][j]);
    		}
    		printf("\n");
    	}
    }
    
    void setmine(char board[ROWS][COLS], int row, int col)
    {
    	int count = easy_count;
    	while (count)
    	{
    		int x = rand() % row+1;
    		int y = rand() % col+1;  //设置雷的x,y 随机坐标;
            if (board[x][y] == '0') //'0'表示无雷;
    		{
                board[x][y] = '1';
    			count--;
    		}
    	}
    }
    
    int get_mine_count(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, y;
    	int win = 0;
    	while (win < row*col-easy_count)
    	{
    		printf("请输入排查雷的坐标:>");
    		scanf("%d%d", &x, &y);
    		if (x >=1 && x <= row && y >=1 && y <=col)
    		{
    			if (mine[x][y] == '1')
    			{
    				printf("很遗憾,你被炸死了\n");
    				displayboard(mine, row, col);
    				break;
    			}
    			else
    			{
    				int count = get_mine_count(mine, x, y);
    				show[x][y] = count + '0';
    				displayboard(show, row, col);
    				win++;
    			}
    		}
    		else
    			printf("输入坐标非法,请重新输入!\n");
    	}
    	if (win == row*col-easy_count)
    	{
    		printf("恭喜你,排雷成功!\n");
    		displayboard(mine, row, col);
    	}
    }
    

    感谢阅读,如有错误请批评指正!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值