C语言小游戏—扫雷

简介: C语言小游戏—扫雷

一.前言
人尽皆知的扫雷小游戏,原理简单,写法也简单,我会通过C语言分各个部分将这个小游戏进行剖析,一看就会!

二.资源环境的配置
我们需要新建一个头文件game.h,两个源文件game.c和text.c,一共三个文件
他们的关系是这样的:

test.c是主体,是游戏的测试逻辑
game.c是游戏的实现逻辑
game.h是实现游戏函数的声明

也就是说,main函数在test.c内,游戏所需要实现的各项功能写在game.c内,我们需要在text.c内使用,必须要引用他们,game.h则是各个函数的声明。将一整个游戏分为这三个部分来写,不仅可以很好的区分内容,而且不会让我们的代码看起来杂乱无序,便于后期的修改。

三.游戏整体构思
最基本的扫雷游戏需要以下几个功能

1.游戏打开首先需要有菜单,它要有让我们实现自由进入游戏和退出游戏的功能
2.需要两个二维数组存放布置雷和排查雷的信息
3.初始化棋盘
4.布置雷
5.打印棋盘
6.排查雷

1.游戏的开始与结束(菜单)
为了有利于分析,我会把各个部分的功能分解,主体在text.c内实现
别忘了我们函数的声明全部在game.h内,使用时必须包含头文件(include “game.h”)

text.c
菜单

{ void menu()

printf("***************************\n");
printf("********* 1.play **********\n");
printf("********* 0.exit **********\n");
printf("***************************\n");

}

游戏的开始与退出

int main()
{

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


return 0;

}

2.创建二维数组用来布置雷和排查雷的信息
本来我们存放棋盘数据只需要两个9 * 9的二维数组
但是我们扫雷,需要排查一个坐标周围八个坐标是否有雷,如果那个坐标在边界,我们定义的数组只是9 9的,那么这个时候数组则会越界,所以我们要将数组创建为1111的,这样数组就不会越界了
棋盘内数据为字符,数组定义为char类型即可

为了便于区分,先在game.h内定义ROW(行)和COL(列)为9,ROWS和COLS就是ROW和COL分别加2.

在 text.c的game()内创建

char mineROWS = { 0 };
char showROWS = { 0 };
1
2
3.初始化棋盘
未开始扫雷时,我们要让棋盘上显示*,因为还没安放雷,所以我们排查的坐标点开为‘0’
text.c内

InitBoard(mine, ROWS, COLS, '0');
InitBoard(show, ROWS, COLS, '*');
1
2
game.h内

void InitBoard(char boardROWS, int rows, int cols, char set);
1
game.c内

void InitBoard(char boardROWS, int rows, int 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;
    }
}

}

4.打印棋盘
虽然我们的棋盘大小是1111的,但是我们需要的只是9 9,所以只接收9 * 9的就可以了,下面的布置雷和排查雷也同理

text.c

DisplayBoard(show, ROW, COL);
1
game.h

void DisplayBoard(char boardROWS, int row, int col);
1
game.c

void DisplayBoard(char boardROWS, int row, int col)
{

int i = 0;
int j = 0;
printf("******* 扫雷 *******\n");
for (j = 0; j <= row; j++)
{
    printf("%d ",j);
}
    printf("\n");
for (i = 1; i <= row; i++)
{        
      printf("%d ",i);
        
    for (j = 1; j <= col; j++)
    {
        printf("%c ",board[i][j]);
    }
    printf("\n");
}

}

5.布置雷
在布置雷的代码中,我们会用上随机数rand()函数和时间戳,所以我们要在game.h中包含它们头文件#include<stdlib.h>和#include<time.h>。同时在主函数内要补上这行代码

srand((unsigned int)time(NULL));
1
text.c

SetMine(mine, ROW, COL);
1
game.h

void SetMine(char mineROWS, int row, int col);

1
2
game.c

void SetMine(char mineROWS, int row, int col)
{



int count = Easy_Count;
while(count)
{   int x = rand() % row + 1;
    int y = rand() % col + 1;
    if (mine[x][y] == '0')
    {
        mine[x][y] = '1';
        count--;
    }        
}

}

6.排查雷
在排查雷的过程中,如果我们刚好排到了雷,那么我们就被炸死,不用排查周围的雷.
但是如果没有排到雷,就要排查非雷坐标周围的雷,所以我们还需要一个函数来排查非雷坐标周围的雷。
game.h
排查非雷坐标周围的雷

int GetMineCount(char mineROWS, int row, int col);
1
game.c
原理:因为我们非雷显示的是0,有雷则显示1,所以我们把非雷坐标周围八个坐标加起来,然后减去8*‘0’就知道周围有几个雷了,别忘记了‘0’加上1就是‘1’哦!

int GetMineCount(char mineROWS, int x, int y)
{

return (mine[x - 1][y + 1] + mine[x][y + 1]
    + mine[x + 1][y + 1] + mine[x - 1][y]
    + mine[x + 1][y]+ mine[x - 1][y - 1]
+ mine[x][y - 1] + mine[x + 1][y - 1] - 8 * '0');
      

}

text.c

FindMine(mine, show, ROW, COL);
1
game.h

void FindMine(char mingROWS, char showROWS, int row, int col);
1
game.c
游戏为简单难度,在game.h内定义Easy_Count为10,代表9*9=81个地方共有十个雷
创建一个整形变量win,如果排查到非雷,则win++,当win<ROW * COL-Easy_Count则扫雷成功

void FindMine(char mineROWS, char showROWS, int row, int col)
{

int x = 0;
int y = 0;
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 = GetMineCount(mine, x, y);
            show[x][y] = count + '0';
            DisplayBoard(show, ROW, COL);
            win++;
                    
        }
    }
    else
    {
        printf("坐标非法,请重新输入\n");
    }

}
    

}

四.所有代码及效果展示
text.c

define _CRT_SECURE_NO_WARNINGS 1

include"game.h"

void menu()
{

printf("***************************\n");
printf("********* 1.play **********\n");
printf("********* 0.exit **********\n");
printf("***************************\n");

}
void game()
{ //mine 数组用来存放布置雷的信息

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

}

int main()
{

srand((unsigned int)time(NULL));
int input = 0;    
do 
{
    menu();
    printf("请输入:>");
    scanf("%d",&input);
    switch (input)
    {
      case 1:
          game();
          break;
      case 0:
          printf("退出游戏\n");
          break;
      default:
          printf("选择错误,请重新选择\n");
          break;

    }
    
} while (input);


return 0;

}

game.h

pragma once

include<stdio.h>

include<stdlib.h>

include<time.h>

define ROW 9

define COL 9

define ROWS ROW+2

define COLS COL+2

define Easy_Count 10

//初始化棋盘
void InitBoard(char boardROWS, int rows, int cols, char set);
//打印棋盘
void DisplayBoard(char boardROWS, int row, int col);
//布置雷
void SetMine(char mineROWS, int row, int col);
//排查雷
void FindMine(char mingROWS, char showROWS, int row, int col);
//排查非雷坐标周围的雷
int GetMineCount(char mineROWS, int row, int col);

game.c

define _CRT_SECURE_NO_WARNINGS 1

include"game.h"

void InitBoard(char boardROWS, int rows, int 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 boardROWS, int row, int col)
{

int i = 0;
int j = 0;
printf("******* 扫雷 *******\n");
for (j = 0; j <= row; j++)
{
    printf("%d ",j);
}
    printf("\n");
for (i = 1; i <= row; i++)
{        
      printf("%d ",i);
        
    for (j = 1; j <= col; j++)
    {
        printf("%c ",board[i][j]);
    }
    printf("\n");
}

}
void SetMine(char mineROWS, int row, int col)
{



int count = Easy_Count;
while(count)
{   int x = rand() % row + 1;
    int y = rand() % col + 1;
    if (mine[x][y] == '0')
    {
        mine[x][y] = '1';
        count--;
    }
    
}

}
int GetMineCount(char mineROWS, int x, int y)
{

return (mine[x - 1][y + 1] + mine[x][y + 1]
    + mine[x + 1][y + 1] + mine[x - 1][y]
    + mine[x + 1][y]+ mine[x - 1][y - 1]
+ mine[x][y - 1] + mine[x + 1][y - 1] - 8 * '0');
      

}
void FindMine(char mineROWS, char showROWS, int row, int col)
{

int x = 0;
int y = 0;
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 = GetMineCount(mine, x, y);
            show[x][y] = count + '0';
            DisplayBoard(show, ROW, COL);
            win++;
            
        }
    }
    else
    {
        printf("坐标非法,请重新输入\n");
    }

}
    

}

目录
相关文章
|
6天前
|
C语言
【C语言】猜数字小游戏的一步一步实现2
【C语言】猜数字小游戏的一步一步实现
|
6天前
|
算法 C语言
【C语言】猜数字小游戏的一步一步实现1
【C语言】猜数字小游戏的一步一步实现
|
6天前
|
C语言
C语言之三子棋小游戏
C语言之三子棋小游戏
|
6天前
|
C语言
C语言 扫雷详解
C语言 扫雷详解
|
21小时前
|
C语言
C语言初阶⑤(数组)扫雷游戏(分步实现+效果图)
C语言初阶⑤(数组)扫雷游戏(分步实现+效果图)
7 1
|
4天前
|
C语言
C语言扫雷代码(蹦蹦炸弹)(下)
C语言扫雷代码(蹦蹦炸弹)(下)
5 0
|
4天前
|
存储 C语言
关于我在C语言中玩扫雷(上)
关于我在C语言中玩扫雷(上)
5 0
|
6天前
|
C语言
以c语言为基础实现的简易扫雷游戏(游戏代码附在文章最后,如有需要请自取)
以c语言为基础实现的简易扫雷游戏(游戏代码附在文章最后,如有需要请自取)
55 1
|
6天前
|
C语言
爱上C语言:扫雷小游戏,展开一片功能实现
爱上C语言:扫雷小游戏,展开一片功能实现
爱上C语言:扫雷小游戏,展开一片功能实现
|
6天前
|
人工智能 机器人 测试技术
【C语言】C语言实现猜单词小游戏(源码+报告)【独一无二】
【C语言】C语言实现猜单词小游戏(源码+报告)【独一无二】

相关实验场景

更多