用c语言实现的扫雷游戏

//sweep.h

#include<stdio.h>
#include<stdlib.h>
#include<windows.h>
#include<time.h>
#define ROWS 8
#define COLS 8
#define MINES 30
void menu();//打印菜单
void init_mine(char mine[][COLS+2], int x, int y);//初始化雷阵
void print_mine(char mine[ ][COLS+2], int x, int y);//打印雷阵
void init_show(char show[][COLS+2], int x, int y);//初始化显示雷个数的矩阵
void print_show(char show[ ][COLS+2], int x, int y);//打印雷的个数
void lay_mines( char mine[][COLS+2]);//布雷
void play(char mine[ ][COLS+2],char show[ ][COLS+2]);//扫雷

//sweep.c
#include"sweep.h"

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

void init_mine(char mine[][COLS+2], int x, int y)//初始化雷阵
{
    int i = 0;
    int j = 0;
    for (i = 0; i<x; i++)
    {
        for (j = 0; j<y; j++)
        {
            mine[i][j] ='+'; 
        }
    }
}

void init_show(char mine[][COLS+2], int x, int y)//初始化显示雷个数的数组
{
    int i = 0;
    int j = 0;
    for (i = 0; i<x; i++)
    {
        for (j = 0; j<y; j++)
        {
            mine[i][j] ='*';
        }
    }
}

void print_mine(char mine[ ][COLS+2], int x, int y)//打印雷阵
{
    int i = 0;
    int j = 0;
    printf("       ");
    for (i = 1; i < x-1; i++)//输出行的标号
    {
            printf(" %d ",i);
    }
            printf("\n    ");


    for (i = 0; i < x; i++)
    {    
            if (i > 0 && i < 9)
            {
                    printf("%d ",i);
            }

    if (i == 9)
    {
            printf("  ");
    }

    for (j = 0; j < y; j++)//输出雷阵
    {
            printf(" %c ",mine[i][j]);
    }
            printf("\n  ");
    }
            printf("\n");
}

void print_show(char show[ ][COLS+2], int x, int y)
{
        int i = 0;
        int j = 0;
        printf("    ");
        for (i = 0; i < x; i++)
        {
                printf(" %d ",i);
        }
        printf("\n  ");

        for (i = 0; i < x; i++)
        {   
                printf("%d ",i);


        for (j = 0; j < y; j++)
        {
                printf(" %c ",show[i][j]);
        }
                printf("\n  ");

        }
}

void lay_mines( char mine[][COLS+2])//布雷
{   
        int count = MINES;//定义雷的个数
        srand((unsigned int)time(NULL));//为了每次产生不同的随机数
flag:
        while (count>0)//当雷没有布完时,执行循环
        {
            int x = rand()%(ROWS)+1;//产生随机的下标
            int y = rand()%(COLS)+1;
            if(mine[x][y] =='@')//如果这个位置已经布过雷,则重新生成下标
            {
                    goto flag;
            }
            else
            {
                    mine[x][y] = '@';
                    count--;//布一个雷之后雷的个数应该减一
            }
        }
}

void play(char mine[ ][COLS+2],char show[ ][COLS+2])//扫雷
{   
        int i = 0;
        int j = 0;
        int x = 0;
        int y = 0;
        printf("请输入第一次要点击的位置>");
        scanf("%d %d",&x, &y);

        if (mine[x][y] == '@')//如果第一次点击的就是雷的位置,则应该把这个雷移走
        {   
            for (i=0; i<x; i++)
            {
                    for (j = 0; j<y; j++)
                    {
                            if (mine[i][j] != '@')
                            {   
                                    mine[i][j] = mine[x][y];
                                    mine[x][y] = '+';
                            }
                    }
            }
        }
        else
        {
                //如果点击的位置不是雷,则应该统计雷的个数
            show[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] == '@')
                     + (mine[x-1][y] == '@'))+ '0';


        }
        print_show(show, ROWS, COLS);
        //print_mine(mine, ROWS, COLS);//打印出雷阵
        while(1)
        {
            printf("请输入要点击的位置(小于10):>");
            scanf("%d %d",&x,&y);
            if(mine[x][y] == '@')
            {   
                printf("炸死了\n");
                break;
            }
            else
            {     //如果点击的位置不是雷,则应该统计雷的个数
                show[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] == '@')
                          + (mine[x-1][y] == '@'))+ '0';

            }
            print_show(show, ROWS+2, COLS+2);//打印显示雷的个数的数组
        }
}
//test.c
#include"sweep.h"
void game()
{
        int x = 0;
        int y = 0;
        char mine[ROWS + 2][ COLS + 2]; 
        char show[ROWS + 2][COLS + 2];
        init_mine( mine, ROWS+2, COLS+2);
        init_show( show,ROWS+2, COLS+2);
        print_mine(mine, ROWS+2, COLS+2);
        lay_mines(mine);
        //print_mine(mine, ROWS+2, COLS+2);
        play(mine,show);

}

int main()
{   
    int choose = 0;
    do
    { 
        menu();
        printf("请输入要选择的数字:");
        scanf("%d",&choose);
        switch (choose)
        {
            case 0:
                  exit(1);
            case 1:
                  game();
        }
      }

      while(choose);

      system("pause");
      return 0;
}

玩游戏的过程:

这里写图片描述

这里写图片描述

做一个M*N的扫雷游戏,每个方格包含两种状态:关闭和打开,初始化时每个方格都是关闭的,一个打开的方格也会包含两种状态:一个数字或者一个雷。你可以打开一个方格,如果你打开的是一个雷,那么就失败;否则就会打开一个数字,该数字是位于[0,8]的一个整数,该数字表示其所有邻居方格所包含的雷数,应用该信息可以帮助你扫雷。 要求细节: (1) 能够打开一个方格,一个已打开的方格不能再关闭。 (2) 能够标记一个方格,标记方格的含义是对该方格有雷的预测,当一个方格标记后该方格不能被打开,只能执行取消标记的操作,取消标记后才能被打开。 (3) 合理分配各个操作的按键,以及各方格各种状态如何合理显示。 基本要求: 能够给出游戏结果(输,赢,剩余雷数,用掉的时间按秒计)。 游戏界面最好图形化,否则一定要有清楚的字符界面。 输入: 用户鼠标左键点击界面格子打开格子,鼠标右键点击界面格子进行标记。 输出: 界面上用户点击的格子打开,计时器开始计时并显示在界面上。如果不是雷,则显示格子周围格子数目,如果数目是0,则自动打开周围雷数为0的格子,如果是雷,游戏结束。当用户标记一个格子,对应格子显示被标记符号,同时界面显示的剩余雷数减1。当扫完所有雷,玩家获胜,游戏结束。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值