0
点赞
收藏
分享

微信扫一扫

C语言基础-简单不简单的扫雷游戏(六)

王老师说 2022-03-11 阅读 20
c语言

扫雷

扫雷游戏-1、扫雷游戏-2

  • test.c:扫雷游戏的测试
  • game.c:游戏的函数的实现
  • game.h:游戏的函数的声明

image-20220302093504203

很巧妙的创建两个数组,一个数组用来存放累,一个用来周边雷的个数;

image-20220302093925690

选择一个位置排除周边8个格子,但是选到边上的格子,就没办法,产生越界,又很巧妙的,我们创建比9*9大一点的数组,让它不越界;

image-20220302094313847

image-20220302094325004

还有一个很妙的地方是,统计周围有几个雷,我们用1代表雷,正常的统计方式,把周围的数匹配是否等于1:

image-20220302104825808

但是我们这里不用这种方法,我用字符1代表雷,周围的字符1相加等于多少不久代表周围有几个雷吗?但是是字符1怎么相加,利用ASCII码转换:

image-20220302105003528

//test.c

#include "game.h"

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

void game()
{
    char mine[ROWS][COLS] = {0};//存放布置好的雷的信息
    char show[ROWS][COLS] = {0};//存放排查出的雷的信息
    //初始化棋盘
    InitBoard(mine,ROWS,COLS,'0');
    InitBoard(show,ROWS,COLS,'*');
    
    //打印棋盘
    //DisplayBoard(mine,ROW,COL);
    DisplayBoard(show,ROW,COL);
    
    //布置雷
    SetMine(mine,ROL,COL);
    //DisplayBoard(mine,ROW,COL);
    
    //排查雷
    FindMine(mine,show,ROW,COL);
    
}


int main()
{	
    int input  = 0;
    srand((unsigned int)time(NULL));
    
    do
    {
        menu();
        printf("请选择:>");
        scanf("%d",&input);
        switch (input)
        {
            case 1:
              	game();//扫雷游戏
                break;
            case 0:
                printf("退出游戏\n");
            default:
                printf("选择错误,重新选择\n");
                break;
        }
        
    }while (input);
    return 0;
}
//game.c
#include "game.h"

void InitBoard(char board[ROWS][COLS],int rows,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 DisplayBoard(char board[ROWS][COLS],int row,in col)
{
    int i = 0;
    int j = 0;
    printf("----------扫雷游戏------------");
    //打印列号
    for(i= 0;i<=col;i++)
    {
        printf("%d",i);
    }
    printf("\n");
    for (i = 1;i<= row;i++)
    {
        printf("%d ",i);
        for(i = 1;j<=col;j++)
        {
            printf("%c ",board[i][j]);
        }
        printf("\n");
    }
    printf("----------扫雷游戏------------");
}
void SetMine(char mine[ROWS][COLS],int row,int col)
{
    //布置10个雷
    int count = 10;
    while(c)
    {
        //生成随机的下标
        int x = rand()%row+1;
        int y = rand()%col+1;
        if (mine[x][y] =='0')
        {
            mine[x][y] = '1';
            count--;
        }
        
    }
}

static int get_mine_count(char mine[ROWS][COLS],int x,int y)
{
    return mine[x][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)
{
    //1. 输入排查的坐标
    //2. 检查坐标是不是雷
    	//(1)是雷 - 很遗憾炸死了 - 游戏结束
    	//(2)不是雷 - 统计坐标周围有几个雷 - 存储排查雷的信息到show数组,游戏继续
    int x = 0;
    int y = 0;
    int win = 0;
    
    while (win<row*col - EASY_COUNT)
    {
    	printf("请输入要排查的坐标:>");
    	scanf("%d%d,&x,&y");//x~y(1~9)
    	//判断坐标合法性
    	if (x >= 1 && x<= row && y>= 1 && x<= col)
    	{
        	if(mine[x][y] =='1')
        	{
            	printf("很遗憾,你被炸死了\n");
           	 	DisplayBoard(mine,row,col);
            	break;
        	}
        	else
        	{
            	//不是雷情况下,统计x,y坐标周围有几个数组;
            	int count = get_mine_count(mine,x,y);
            	show[x][y] = count+'0';//count是int型,数组show是char,所以利用AScii表的特性,字符0的ascii码是整数48表示,字符1用49表示,依次类推就行了;
            	DisplayBoard(show,row,col);
            	win++;
        	}
    	}
    	else
    	{
        	printf("坐标不合法,请重新输入:\n")
    	}
    
	}
	if (win == row*col-EASY_COUNT)
	{
    printf("恭喜你,排雷成功\n");
    Displayboard(mine,row,col);
	}
}

//game.h
#include <stdio.h>
#include <stdlib.h>

#define EASY_COUNT 10
#define ROW 9
#define COL 9

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

//初始化棋盘
InitBoard(char board[ROWS][COLS],int rows,cols,char set);

//打印棋盘
void DisplayBoard(char board[ROWS][COLS],int row,in col);

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

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


三子棋里出现了随机函数sand(),没有重点去记,这里也出现了,还是记下来吧:

  • 标准库函数rand(),它会产生一个无符号整数,范围在0~32767;

  • 可以表示为:int num = rand() % n +a;其中的a是起始值,n-1+a是终止值,n是整数的范围;

  • 要产生0~99这100个整数中的一个随机整数,可以表达为:int num = rand() % 100

  • 要产生1~100,则是这样:int num = rand() % 100 + 1;

  • 添加头文件:#include <stdlib.h>;

  • 强制类型转换:srand((unsigned int)time(NULL));

举报

相关推荐

0 条评论