用C语言简单实现扫雷小游戏

 更新时间:2021年08月03日 08:39:41   作者:长路不漫漫  
这篇文章主要为大家详细介绍了用C语言简单实现扫雷小游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

本文实例为大家分享了C语言简单实现扫雷小游戏的具体代码,供大家参考,具体内容如下

设计思路

1. 定义两个二维数组,一个存放炸弹信息,一个隐藏信息后向玩家展示。

2. 玩家每一次选择都要判断是否踩到炸弹,如果踩雷,将结束游戏,否则继续游戏。

3.玩家每一次判断后要将新棋盘展示给玩家,且将该位置附近雷的个数展示出来。

4.最后如果玩家找到所有非雷区时,玩家获胜。

首先,我们设计一个简单的主函数

方便玩家自由选择进入游戏与退出游戏

int main()
{
 int input = 0;
    srand((unsigned int)time(NULL));//随机数用于随机存放炸弹
 do 
 {
  menu();//打印菜单
  printf("请选择>\n");
  scanf("%d", &input);
  switch (input)
  {case 1:
   game();
   break;
  case 0:
   break;
  default:
   printf("输入错误,重新输入>\n");
    break;
  } 
 } while (input);
}

菜单我们可以自由设计,这里是我设计的一个简单菜单:

void menu()
{
 printf("******************************\n");
 printf("********** 1. play  **********\n");
 printf("********** 0. 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(show, ROWS, COLS);
 //布置雷
 SetMine(mine, ROW, COL); 
  //排查雷
  FindMine(mine,show,ROW,COL); 
}

这里我们定义了两个二维数组,mine和show,其中mine用于我们储存炸弹的信息,而show则用于向玩家展示游戏棋盘

一开始我们要考虑我们的棋盘大小与数组大小的关系

棋盘的大小就等于我们创建的数组大小吗? 等于吗?啊哈?

当然不等于了,想什么呢小伙子!!!

我们可是要考虑每一个位置周围的炸弹数量的,你让我最外层的怎么办!

于是我们定义了以下几个常数用于定义棋盘的长度宽度,还有多了一圈的数组

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

接下来就是对数组进行初始化

void InitBoard(char board[ROWS][COLS], 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 board[ROWS][COLS], int rows, int cols)
{
 int i = 0;
 int j = 0;
 printf("----------------------------\n");
 printf( "%d ", j);
 for (i = 1; i < rows - 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 ", board[i][j]);
  }
  printf("\n");
 }
 printf("----------------------------\n");
}

随机放雷

void SetMine(char board[ROWS][COLS], int row, int col)
{
 int count = EASY_COUNT;
 while (count)
 {
  int x = rand() % row + 1;//+1可以保证每一个位置都能随机放雷
  int y = rand() % col + 1;
  if (board[x][y] == '0')//在没有放过雷的位置放雷
  {
   board[x][y] = '1';
   count--;
  }
 }
}

排雷函数

int GetMineCount(char mine[ROWS][COLS], int x, int y)
{
 return mine[x-1][y]+mine[x+1][y]+
  mine[x-1][y-1]+mine[x][y-1]+mine[x+1][y-1]+
  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)
{
 int x = 0;
 int y = 0;
 int win = 0;
 while (win<row*col-EASY_COUNT)
 {
  printf("请输入要排查的坐标>\n");
  scanf("%d%d", &x, &y);
  if(x>=1&&x<=row&&y>=1&&y<=col)
  {
   if (mine[x][y] == '0')//保证每一次都在新的位置
   {
    int count = GetMineCount(mine,  x,  y);
    show[x][y] = count+'0';//以字符形式
    DisplayBoard(show, ROWS, COLS);
    win++;
   }
   else
   {
    printf("很遗憾,踩到雷了\n");
    DisplayBoard(mine,ROWS,COLS);//向玩家展示所有雷的位置
    break;
   }  
  }
  else
  {
   printf("输入不合法,请重新输入>\n");
  }
 }
 if (win == row * col - EASY_COUNT)//判断是否排雷成功
 {
  printf("恭喜您,排雷成功\n");
  DisplayBoard(mine, ROWS, COLS);
 }
}

至此我们的扫雷小游戏就制作完成了,可以进行愉快的游戏啦!

下面是三个整体代码

1.   game.h

#pragma once
#define ROW 9
#define COL 9
#define ROWS ROW+2
#define COLS COL+2
#define EASY_COUNT 10
#include<stdio.h>
//初始化棋盘
void InitBoard(char board[ROWS][COLS], int  rows, int cols,  char set);
//显示棋盘
void DisplayBoard(char board[ROWS][COLS], int rows, int cols);
//布置雷
void SetMine(char board[ROWS][COLS], int row, int col);
//排查雷
void FindMine(char mine[ROW][COL], char show[ROW][COL], int rows, int cols);

2.   game.c

#define _CRT_SECURE_NO_WARNINGS 
#include"game.h"
void InitBoard(char board[ROWS][COLS], 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 board[ROWS][COLS], int rows, int cols)
{
 int i = 0;
 int j = 0;
 printf("----------------------------\n");
 printf( "%d ", j);
 for (i = 1; i < rows - 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 ", board[i][j]);
  }
  printf("\n");
 }
 printf("----------------------------\n");
}
void SetMine(char board[ROWS][COLS], int row, int col)
{
 int count = EASY_COUNT;
 while (count)
 {
  int x = rand() % row + 1;
  int y = rand() % col + 1;
  if (board[x][y] == '0')
  {
   board[x][y] = '1';
   count--;
  }
 }
}
int GetMineCount(char mine[ROWS][COLS], int x, int y)
{
 return mine[x-1][y]+mine[x+1][y]+
  mine[x-1][y-1]+mine[x][y-1]+mine[x+1][y-1]+
  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)
{
 int x = 0;
 int y = 0;
 int win = 0;
 while (win<row*col-EASY_COUNT)
 {
  printf("请输入要排查的坐标>\n");
  scanf("%d%d", &x, &y);
  if(x>=1&&x<=row&&y>=1&&y<=col)
  {
   if (mine[x][y] == '0')
   {
    int count = GetMineCount(mine,  x,  y);
    show[x][y] = count+'0';
    DisplayBoard(show, ROWS, COLS);
    win++;
   }
   else
   {
    printf("很遗憾,踩到雷了\n");
    DisplayBoard(mine,ROWS,COLS);
    break;
   }  
  }
  else
  {
   printf("输入不合法,请重新输入>\n");
  }
 }
 if (win == row * col - EASY_COUNT)
 {
  printf("恭喜您,排雷成功\n");
  DisplayBoard(mine, ROWS, COLS);
 }
}

3.  test.c

#define _CRT_SECURE_NO_WARNINGS 
#include"game.h"
void menu()
{
 printf("******************************\n");
 printf("********** 1. play  **********\n");
 printf("********** 0. 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(show, ROWS, COLS);
 //布置雷
 SetMine(mine, ROW, COL); 
 DisplayBoard(mine, ROWS, COLS);
  //排查雷
  FindMine(mine,show,ROW,COL); 
}
 
int main()
{
 int input = 0;
 srand((unsigned int)time(NULL));
 do 
 {
  menu();
  printf("请选择>\n");
  scanf("%d", &input);
  switch (input)
  {case 1: 
   game();
   break;
  case 0:
   break;
  default:
   printf("输入错误,重新输入>\n");
    break;
  } 
 } while (input);

}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • C语言如何在指针中隐藏数据详解

    C语言如何在指针中隐藏数据详解

    这篇文章主要给大家介绍了关于C语言如何在指针中隐藏数据的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面来一起看看吧
    2018-12-12
  • Clion配置opencv开发环境的详细过程

    Clion配置opencv开发环境的详细过程

    这篇文章主要介绍了Clion配置opencv开发环境的详细过程,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考的下
    2022-04-04
  • QT开发应用程序的欢迎界面实例

    QT开发应用程序的欢迎界面实例

    下面小编就为大家带来一篇QT开发应用程序的欢迎界面实例。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-08-08
  • 解读C++编译报错有迹可寻

    解读C++编译报错有迹可寻

    这篇文章主要介绍了解读C++编译报错有迹可寻,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-05-05
  • C++获取文件哈希值(hash)和获取torrent(bt种子)磁力链接哈希值

    C++获取文件哈希值(hash)和获取torrent(bt种子)磁力链接哈希值

    这二个代码一个是获取文件哈希值的,另外一个是获取torrent文件磁力链接的哈希值
    2013-11-11
  • c语言使用fdk_aac实现aac音频解码为pcm

    c语言使用fdk_aac实现aac音频解码为pcm

    这篇文章主要为大家详细介绍了c语言如何使用fdk_aac库实现aac音频解码为pcm的功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2023-11-11
  • .h和.cpp文件的区别(zt)详细介绍

    .h和.cpp文件的区别(zt)详细介绍

    特别是对源文件和头文件的概念,需要深入对它了解,本文将详细介绍,需要了解的朋友可以参考下
    2012-11-11
  • C/C++函数参数声明解析int fun() 与 int fun(void) 的区别讲解

    C/C++函数参数声明解析int fun() 与 int fun(void) 的区别讲解

    C++中int fun()和int fun(void)的区别在于函数参数的声明方式,前者默认允许任意参数,而后者表示没有参数,通过清晰的实例源代码,详细解释了它们在函数声明和调用中的不同之处,这篇文章介绍了C/C++函数参数声明int fun()与int fun(void)的差异,需要的朋友可以参考下
    2024-01-01
  • C++超详细讲解析构函数

    C++超详细讲解析构函数

    既然在创建对象时有构造函数(给成员初始化),那么在销毁对象时应该还有一个清除成员变量数据的操作咯,析构函数与构造函数功能相反,析构函数不是完成对象的销毁,局部对象销毁工作是由编译器完成的。而对象在销毁时会自动调用析构函数,完成类的一些资源清理工作
    2022-06-06
  • vscode调试gstreamer源码的详细流程

    vscode调试gstreamer源码的详细流程

    在本文中主要介绍了如何使用vscode调试C++和python程序,并进一步分析了如何调试gstreamer源码,讲述了如何调试gstreamer源码的具体流程,感兴趣的朋友跟随小编一起看看吧
    2023-01-01

最新评论