扫雷游戏(C语言基础版)

简介: 扫雷游戏(C语言基础版)

前言

用C语言写一个简单的扫雷游戏。

首先要有以下几个步骤:


1:初始化棋盘。

2:打印棋盘。

3:埋雷。

4:扫雷。


我们可以尝试用多文件的方式来写,这样简洁明了,也方便代码的检查。

以下开始实现:


主体函数搭建

首先创建一个源文件test.c用来放主函数,



主函数内用do{}while()循环可以实现多次扫雷游戏,switch选择开始游戏还是退出游戏,如果选择错误,会出现“选择错误,重新选择”的字样。


游戏开始时我们也可以打印一个简单的菜单,如下图:




采用一个简单的函数调用,可以实现菜单打印。


case 1:采用了game()用来分装游戏代码,这里需要创建多文件,在源文件里面创建一个 game.c 文件,在头文件里面创建一个 game.h 文件,如图:



game.h 放置创建函数的声明,

game.c 放置游戏代码,

test.c 放置主函数,

注意:game,c和test.c 都要包含game.h 的头文件,才能使用 game.h 里面的函数.


游戏代码实现

1:初始化棋盘


首先定义一个二维数组,用来打印棋盘,

但是

扫雷菜单的表示需要多种元素,如果用 ’0‘ 来表示没有雷,用 ’1‘ 来表示有雷,

初始化打印菜单时还需要其他符号来表示隐藏的雷;这就需要多种元素来表示,

所以定义数组时不妨用两个数组来表示

char  mine[ROWS]COLS] 表示埋雷的棋盘;

char  show[ROWS][COLS] 表示展示给用户的棋盘;

如图



为了表示方便,数组的行和列事先在头文件 gane,h 定义过,这里用变量表示


如图:



定义棋盘后开始初始化棋盘,

在 test.c 创建一个函数 chushihuaqipan,在game.h 声明,然后在 game.c 里实现,

接下来的函数也是这个流程;

如下图示例:


在 game.h 里定义函数:



因为 chushihuaqipan 函数没有返回值,所以用 void 表示

函数里的形参可以和主函数里的实参名字不同,为了避免混淆,用小写变量名表示,

在 game.c 里实现函数:



char set 这个变量可以很好的打印字符,我们要打印两个棋盘,又要重复利用这个函数, set 就可以巧妙地解决这个问题:



这样就可以用一个函数打印两个棋盘;


在 test.c 里调用函数:



2 :打印棋盘

依旧是在 game.h 声明一个函数 dayinqipan ,在 game.c 里面实现,

如下图:



这是打印棋盘的代码实现,我们打印的是 9 X 9 的棋盘,用两个for 循环嵌套很轻松就可以实现,

注意换行!


3:埋雷

为了确保每次雷的位置不同,我们需要用到随机数的函数,下面请看示例:




随机数的种子可以放在主函数里面,确保每次随机数的种子都不一样,做到真正的随机。

埋雷时,如果这个地方已经有雷了,就不用在埋雷了,要用到一个  if()  判断语句。


4:扫雷


扫雷是游戏的主要代码,首先我们要输入坐标,用if 语句判断坐标是否下 9 X 9 的棋盘内,

然后用 if 嵌套判断该位置是否是雷,如果不是雷,那么计算雷周围一圈雷的个数,

计算雷的个数可以再用一个函数:


由于棋盘上使用字符 ’ 0 ‘ 来表示的,而打印雷的个数是整形雷,所以计算雷的个数之后要减去字符

’ 0 ‘ 得到整形 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
 
 
 
//初始化棋盘
void chushihuaqipan(char arr[ROWS][COLS], int rows, int cols, char set);
//打印棋盘
void dayinqipan(char arr[ROWS][COLS], int row, int col);
//布置雷
void buzhilei(char arr[ROWS][COLS], int row, int col);
//排查雷
void paichalei(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col);

game.c


#define _CRT_SECURE_NO_WARNINGS 1
#include"game.h"
 
//初始化棋盘
void chushihuaqipan(char arr[ROWS][COLS], int rows, int cols, char set)
{
  int i = 0;
  for ( i = 0; i < rows; i++)
  {
    for (int j = 0; j < cols; j++)
    {
      arr[i][j] = set;
    }
  }
 
}
//打印棋盘
void dayinqipan(char arr[ROWS][COLS], int row, int col)
{
  
  int i = 0;
  for (i = 0; i <= row; i++)
  {
    printf("%d ", i);
  }
  printf("\n");
  for (i = 1; i <= row; i++)
  {
    printf("%d ", i);
    for (int j = 1; j <= col; j++)
    {
      
      printf("%c ", arr[i][j]);
    }
    printf("\n");
 
  }
}
//布置雷
void buzhilei(char arr[ROWS][COLS], int row, int col)
{
  int count = 10;
  while (count)
  {
    int x = rand() % row + 1;
    int y = rand() % col + 1;
    if (arr[x][y] == '0')
    {
      arr[x][y] = '1';
      count--;
    }
  }
 
}
//雷的个数
int leidegeshu(char mine[ROWS][COLS],int x,int y)
  {
  return mine[x + 1][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]-8*'0';
 
  }
//排查雷
void paichalei(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 - 10)
  {
    
    printf("请输入你要排查的坐标:");
    scanf("%d %d", &x, &y);
 
    if (x >= 1 && x <= row && y >= 1 && y <= col)
    {
      if (mine[x][y] == '1')
      {
        printf("很遗憾!你被雷炸死了\n");
        dayinqipan(mine, ROW, COL);
        break;
      }
      else
      {
        int count = leidegeshu(mine, x, y);
        show[x][y] = count + '0';
        dayinqipan(show, ROW, COL);
        win++;
      }
 
    }
    else
    {
      printf("坐标非法,请重新输入:");
    }
  }
  if (win == row * col - 10)
  {
    printf("恭喜你,排雷成功\n");
    dayinqipan(mine, ROW, COL);
  }
 
}


test.c


#define _CRT_SECURE_NO_WARNINGS 1
#include"game.h"
 
//打印菜单
void menu(void)
{
  printf("***********************\n");
  printf("*****    1.play   *****\n");  
  printf("*****    0.exit   *****\n");
  printf("***********************\n");
}
 
 
void game()
{
  //定义棋盘
  char mine[ROWS][COLS];
  char show[ROWS][COLS];
  //初始化棋盘
  chushihuaqipan(mine, ROWS, COLS, '0');
  chushihuaqipan(show, ROWS, COLS, '*');
  //打印棋盘  
  dayinqipan(show, ROW, COL);
  //dayinqipan(mine, ROW, COL);
  //布置雷
  buzhilei(mine, ROW, COL);
  //dayinqipan(mine, ROW, COL);
  //排查雷
  paichalei(mine, show, ROW, COL);
}
 
 
int main()
{
  int input = 0;
  srand((unsigned int) time(NULL));
  do
  {
    menu();
    
    scanf("%d", &input);
    
    switch (input)
    {
    case 1:
      game();
      break;
    case 0:
      printf("退出游戏\n");
      break;
    default :
      printf("选择错误,重新选择\n");
      break;
    }
  } while (input);
  
  return 0;
}


相关文章
|
1月前
|
C语言
C语言之斗地主游戏
该代码实现了一个简单的斗地主游戏,包括头文件引入、宏定义、颜色枚举、卡牌类、卡牌类型类、卡牌组合类、玩家类、游戏主类以及辅助函数等,涵盖了从牌的生成、分配、玩家操作到游戏流程控制的完整逻辑。
71 8
|
2月前
|
C语言
扫雷游戏(用C语言实现)
扫雷游戏(用C语言实现)
124 0
|
24天前
|
存储 算法 C语言
用C语言开发游戏的实践过程,包括选择游戏类型、设计游戏框架、实现图形界面、游戏逻辑、调整游戏难度、添加音效音乐、性能优化、测试调试等内容
本文探讨了用C语言开发游戏的实践过程,包括选择游戏类型、设计游戏框架、实现图形界面、游戏逻辑、调整游戏难度、添加音效音乐、性能优化、测试调试等内容,旨在为开发者提供全面的指导和灵感。
40 2
|
1月前
|
C语言 Windows
C语言课设项目之2048游戏源码
C语言课设项目之2048游戏源码,可作为课程设计项目参考,代码有详细的注释,另外编译可运行文件也已经打包,windows电脑双击即可运行效果
32 1
|
2月前
|
编译器 C语言
猜数字游戏实现#C语言
猜数字游戏实现#C语言
91 1
|
2月前
|
C语言
初学者指南:使用C语言实现简易版扫雷游戏
初学者指南:使用C语言实现简易版扫雷游戏
44 0
|
20天前
|
存储 C语言 开发者
【C语言】字符串操作函数详解
这些字符串操作函数在C语言中提供了强大的功能,帮助开发者有效地处理字符串数据。通过对每个函数的详细讲解、示例代码和表格说明,可以更好地理解如何使用这些函数进行各种字符串操作。如果在实际编程中遇到特定的字符串处理需求,可以参考这些函数和示例,灵活运用。
40 10
|
20天前
|
存储 程序员 C语言
【C语言】文件操作函数详解
C语言提供了一组标准库函数来处理文件操作,这些函数定义在 `<stdio.h>` 头文件中。文件操作包括文件的打开、读写、关闭以及文件属性的查询等。以下是常用文件操作函数的详细讲解,包括函数原型、参数说明、返回值说明、示例代码和表格汇总。
42 9
|
20天前
|
存储 Unix Serverless
【C语言】常用函数汇总表
本文总结了C语言中常用的函数,涵盖输入/输出、字符串操作、内存管理、数学运算、时间处理、文件操作及布尔类型等多个方面。每类函数均以表格形式列出其功能和使用示例,便于快速查阅和学习。通过综合示例代码,展示了这些函数的实际应用,帮助读者更好地理解和掌握C语言的基本功能和标准库函数的使用方法。感谢阅读,希望对你有所帮助!
32 8
|
20天前
|
C语言 开发者
【C语言】数学函数详解
在C语言中,数学函数是由标准库 `math.h` 提供的。使用这些函数时,需要包含 `#include <math.h>` 头文件。以下是一些常用的数学函数的详细讲解,包括函数原型、参数说明、返回值说明以及示例代码和表格汇总。
41 6