编程实现扫雷小游戏

编程实现扫雷小游戏

  • 头文件部分
#define _CRT_SECURE_NO_WARNINGS 1 
#ifndef __SANZIQI_H__     

#define __SANZIQI_H__     

#define ROW 10
#define COL 10

//初始化雷区
void Initboom(char boom[ROW][COL], int row, int col);  
//初始化覆盖区  
void Initbomb(char arr[ROW][COL], int row, int col);  
//生成地雷
void makeboom(char boom[ROW][COL], int row, int col, int l);  
//打印雷区
void OutPut(char boom[ROW][COL], int row, int col);  
//打印显示区
int OutPu(char arr[ROW][COL], int row, int col, int x);  
//输入坐标判断是否有雷并且显示周围的数字提示周围有多少雷
int is_boom(char boom[ROW][COL], char arr[ROW][COL], int row, int col);
//显示周围雷的个数
void OutBoom(char arr[ROW][COL],char boom[ROW][COL], int i, int j);

#endif
  • 函数部分
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <time.h>
#include <stdlib.h>

#include "SAOLEI.h"

//初始化雷区
void Initboom(char boom[ROW][COL], int row, int col)
{
    int i = 0;
    int j = 0;
    for(i=0; i<row; i++)
    {
        for(j=0; j<col; j++)
        {
            boom[i][j] = '0';
        }
    }
}

//初始化覆盖区 
void Initbomb(char arr[ROW][COL], int row, int col)
{
    int i = 0;
    int j = 0;
    for(i=0; i<row; i++)
    {
        for(j=0; j<col; j++)
        {
            arr[i][j] = '*';
        }
    }
}
//生成地雷
void makeboom(char boom[ROW][COL], int row, int col, int l)
{
    int i = 0;
    int j = 0;
    int x = 0;
    srand((unsigned int)time(NULL));
    i = (rand()%(ROW-2))+1;
    j = (rand()%(ROW-2))+1;
    for(x=0; x<l; x++)
    {
        i = (rand()%(ROW-2))+1;
        j = (rand()%(ROW-2))+1;
        if(boom[i][j] == '0')
        {
            boom[i][j] = '1';
        }
        else
        {
            x--;
        }
    }
}

//打印雷区
void OutPut(char boom[ROW][COL], int row, int col)
{
    int i = 0;
    int j = 0;
    for(i=0; i<row; i++)
    {
        for(j=0; j<col; j++)
        {
            printf("%c ", boom[i][j]);
        }
        printf("\n");
    }
}

//打印显示区
int OutPu(char arr[ROW][COL], int row, int col, int x)
{
    int i = 0;
    int j = 0;
    int y = 1;
    printf("   ");
    for(y=1; y<row-1; y++)
    {
        printf("%d ",y);
    }
    printf("\n   ---------------");
    printf("\n");
    for(i=0; i<row-2; i++)
    {
        printf("%d |",i+1);
        for(j=0; j<col-2; j++)
        {
            printf("%c ", arr[i+1][j+1]);
            //根据剩余雷区确定雷的个数
            if(arr[i+1][j+1] == '*')
            {
                x++;
            }
        }
        printf("\n");
    }
    return x;
}

//显示周围雷的个数
void OutBoom(char arr[ROW][COL],char boom[ROW][COL], int i, int j)
{
    arr[i][j] = (boom[i-1][j-1]-'0'+boom[i-1][j]-'0'+boom[i-1][j+1]-'0'+
    boom[i][j-1]-'0'+boom[i][j+1]-'0'+boom[i+1][j-1]-'0'
    +boom[i+1][j]-'0'+boom[i+1][j+1]-'0')+'0';
}
//输入坐标判断是否有雷并且显示周围的数字提示周围有多少雷
int is_boom(char boom[ROW][COL], char arr[ROW][COL], int row, int col)
{
    int i = 0;
    int j = 0;
    while(1)
    {
    scanf("%d,%d",&i,&j);
    if((1<=i && i<=9)&&(1<=j && j<=9))
    {
        if(boom[i][j] == '1')
        {
            return 0;
        }
        else
        {
            //显示雷的个数
            OutBoom(arr, boom, i, j);
            //如果这个数为0,说明周围没有雷,所以显示出周围每个数组周围的雷的个数
            if(arr[i][j] == '0')
            {
                OutBoom(arr, boom, i-1, j-1);
                OutBoom(arr, boom, i-1, j);
                OutBoom(arr, boom, i-1, j+1);
                OutBoom(arr, boom, i, j-1);
                OutBoom(arr, boom, i, j+1);
                OutBoom(arr, boom, i+1, j-1);
                OutBoom(arr, boom, i+1, j);
                OutBoom(arr, boom, i+1, j+1);
            }
            return 1;
        }
    }
    else
    {
        printf("输入错误,请重新输入:\n");
    }
    }
}
  • 主函数部分
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <time.h>
#include <stdlib.h>

#include "SAOLEI.h"

menu()
{
    printf("+------------+\n");
    printf("  1.开始游戏  \n");
    printf("  0.退出游戏  \n");
    printf("+------------+\n");
}

game()
{
    char boom[ROW][COL];
    char arr[ROW][COL];
    int n = 0; //判定是否踩雷
    int x = 0; //计算剩余雷区个数
    int i = 0; //接收剩余雷区个数
    int l = 0;
    printf("请设置雷的个数\n");
    scanf("%d",&l);
    //初始化雷区
    Initboom(boom, ROW, COL);
    //初始化显示区
    Initbomb(arr, ROW, COL);
    //生成地雷
    makeboom(boom, ROW, COL, l);
    //打印雷区
    //OutPut(boom, ROW, COL);
    //打印显示区
    OutPu(arr, ROW, COL, x);
    printf("游戏开始:\n");
    //输入坐标判断是否有雷并且显示周围的数字提示周围有多少雷
    do
    {
       printf("游戏开始,请输入坐标\n");
       n = is_boom(boom, arr, ROW, COL);
       if(n == 0)
       {
           break;
       }
       else
       {
           i = OutPu(arr, ROW, COL, x);
       }
       //计算剩余雷的个数
       printf("剩余未知区域个数%d\n",i);
    }while(i>l);//剩余雷区个数等于雷个数则扫雷完成
    if(n == 0)
    {
        printf("踩到雷了,游戏结束\n");
    }
     else
    {
        printf("恭喜扫雷完成\n");
    }
}

int main()
{
    int i = 0;
    do
    {
        menu();
        scanf("%d",&i);
        switch(i)
        {
        case 1:
            game();
            break;
        case 0:
            printf("退出游戏\n");
            break;
        default:
            printf("输入错误\n");
            break;
        }
    }while(i);
    return 0;
}
  • 编程结果

设置个简单的,设置雷数为1并开始。
这里写图片描述
逐步完成扫雷。
这里写图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值