扫雷游戏的C语言实现

在学习C语言初期,我们可以找一些平常玩的游戏进行简单的C语言实现。今天就和大家分享一下关于windows中扫雷游戏的实现。

在正式写代码前,简单说一下对这个游戏的分析:
1.先提示的应该是一个简单的menu,其中包括“play”和“exit”;
2.在main函数中应该是一个test的函数,主要测试整个游戏;
3.在test中应该是可以让游戏进行循环玩的,所以需要包括一个while语句,while语句的主要部分是每次提示玩游戏;
4.关于扫雷的整个实现是用play_game实现的,在这个部分我们需要考虑怎样去实现这个功能;
5.根据上面分析,我们只需要在play_ game中实现初始化扫雷(init_game)和扫雷(sweep)即可;
6.在初始化扫雷(init_game)中,我们需要对界面中雷的位置进行处理,需要一个set _mine;
7.在扫雷(sweep)中,按照整个游戏的逻辑,需要对坐标进行一个判断,有无雷,没有雷的话,周围有多少颗雷。

整个游戏的逻辑就是这些,每一个函数的实现中嵌套了一个函数。
main->test->play_game->init _game和sweep

Mine_sweeper.h(头文件)

#ifndef __MINE_H__
#define __MINE_H__

enum op
{
    EXIT,
    PLAY
};

#define ROWS 11
#define COLS 11
#define COUNT 30

void init_game(char mine[ROWS][COLS],char show[ROWS][COLS]);   //初始化扫雷界面
void set_mine(char mine[ROWS][COLS]);    //设置雷区
void get_num(int x, int y);    //随机产生雷的位置
void display(char show[ROWS][COLS]);   //打印出界面
void sweep(char mine[ROWS][COLS], char show[ROWS][COLS]);  //开始扫雷
int get_mine(char mine[ROWS][COLS], int x, int y);   //附近雷的个数

#endif
Mine_sweeper.c(扫雷主要功能实现)

#define _CRT_SECURE_NO_WARNINGS 1
#include"Mine_sweeper.h"
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<string.h>

void init_game(char mine[ROWS][COLS], char show[ROWS][COLS]) //初始化扫雷界面
{
    memset(mine, '0', ROWS*COLS*sizeof(char));
    memset(show, '*', ROWS*COLS*sizeof(char));
    set_mine(mine);
}

int get_mine_num(int x, int y)   //随机产生雷的位置
{
    return rand() % (y - x + 1) + x;
}

void set_mine(char mine[ROWS][COLS])   //设置雷区
{
    int count = COUNT;
    int x = 0;
    int y = 0;
    srand((unsigned)time(NULL));
    while (count)
    {
        x = get_mine_num(1, 9);
        y = get_mine_num(1, 9);
        if (mine[x][y] == '0')
        {
            mine[x][y] = '1';
            count--;
        }
    }
}

void display(char show[ROWS][COLS])  //打印出界面
{
    int i = 0;
    int j = 0;
    printf(" ");
    for (i = 1; i < COLS - 1; i++)
    {
        printf(" %d ", i);
    }
    printf("\n");
    for (i = 1; i < ROWS - 1; i++)
    {
        printf("%d", i);
        for (j = 1; j < COLS - 1; j++)
        {
            printf(" %c ", show[i][j]);
        }
        printf("\n");
    }
}

void sweep(char mine[ROWS][COLS], char show[ROWS][COLS])//开始扫雷
{
    int count = 0;
    int x = 0;
    int y = 0;
    while(count!=((ROWS-2)*(COLS-2)-COUNT))
    {
        printf("请输入坐标>:");
        scanf("%d%d", &x, &y);
        if (mine[x][y] == '1')
        {
            printf("踩雷了!\n");
            return;
        }
        else
        {
            int ret = get_mine(mine, x, y);
            show[x][y] = ret + '0';
            display(show);
            count++;
        }
    }
    printf("恭喜你赢了!\n");
    display(mine);
}

int get_mine(char mine[ROWS][COLS], int x, int y)   //附近雷的个数
{
    int count = 0;
    if (mine[x - 1][y - 1] == '1') count++; //坐标位置的上3个
    if (mine[x - 1][y] == '1') count++;
    if (mine[x - 1][y + 1] == '1') count++;

    if (mine[x][y - 1] == '1') count++;  //坐标位置的左右
    if (mine[x][y + 1] == '1') count++;

    if (mine[x + 1][y - 1] == '1') count++; //坐标位置的下3个
    if (mine[x + 1][y] == '1') count++;
    if (mine[x + 1][y + 1] == '1') count++;

    return count;
}
test.c(测试函数)

#define _CRT_SECURE_NO_WARNINGS 1
#include"Mine_sweeper.h"
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
void menu()
{
    printf("********************\n");
    printf("****  1.play  ******\n");
    printf("****  0.exit  ******\n");
    printf("********************\n");
}

void play_game()
{
    char mine[ROWS][COLS];
    char show[ROWS][COLS];
    init_game(mine, show);
    display(show);
    sweep(mine, show);
}

void test()
{
    int input = 0;
    do
    {
        menu();
        printf("请输入指令>:");
        scanf("%d", &input);
        switch (input)
        {
        case PLAY:
            play_game();
            break;
        case EXIT:
            break;
        }
    } while(input);
}

int main()
{
    test();
    system("pause");
}

踩雷
赢了
(1表示雷的位置,0表示没有雷。带*的是显示的界面,1/0的是带雷的界面。)

整个代码就是这么多,总体来说游戏的界面是比较low的,但是游戏的功能还是比较完善的。在写代码的时候一定先要梳理好整个逻辑,然后一步一步实现。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值