C语言实现简易扫雷游戏

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

扫雷

楔子:

扫雷游戏是我们小时候无聊时消磨时间的小玩意,虽然更新到Win10系统后经典的扫雷游戏不再了,不过它现在仍以一种抓虫子的游戏形式存在于Windows这个系统平台,不禁感慨游戏还是那个游戏,不过人已经不是那些人了啊.

其实扫雷游戏的实现也主要运用了数组和函数封装与调用的知识,具体请看程序.

以下为程序主体:

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>

//定义方格大小
#define MAX_ROW 10
#define MAX_COL 10
//定义方格雷阵中的地雷数
#define DEFAULT_MINE_COUNT 10

//制作图形化游戏界面函数(菜单)
int Menu() {
 printf("=============================\n");
 printf("||    <扫雷游戏>    ||\n");
 printf("|| 1.开始游戏 0.退出游戏 ||\n");
 printf("=============================\n");
 int choice = 0;
 while (1) {
 scanf("%d", &choice);
 if (choice != 0 && choice != 1) {
  printf("您的输入有误,请重新输入!\n");
  continue;
 }
 return choice;
 }
}

//清空方格函数 这里地雷表示为 * ,安全无地雷表示为 0
void Init(char show_map[MAX_ROW + 2][MAX_COL + 2],
 char mine_map[MAX_ROW + 2][MAX_COL + 2]) {
 for (int row = 0; row < MAX_ROW + 2; ++row) {
 for (int col = 0; col < MAX_COL + 2; ++col) {
  show_map[row][col] = '*';
 }
 }
 for (int row = 0; row < MAX_ROW + 2; ++row) {
 for (int col = 0; col < MAX_COL + 2; ++col) {
  mine_map[row][col] = '0';
 }
 }
 //能够随机的构造出 N 个数,放在雷阵中
 int mine_count = DEFAULT_MINE_COUNT;
 while (mine_count > 0) {
 //随机布置地雷
 int row = rand() % MAX_ROW + 1;
 int col = rand() % MAX_COL + 1;
 if (mine_map[row][col] == '1') {
  continue;
 }
 mine_map[row][col] = '1';
 --mine_count;
 }
}

void DisplayMap(char map[MAX_ROW + 2][MAX_COL + 2]) {
 printf("  ");
 //打印坐标横行
 for (int row = 1; row <= MAX_ROW; ++row) {
 printf("%d ", row);
 }
 printf("\n");
 //打印上边框
 for (int row = 1; row <= MAX_ROW; ++row) {
 printf("---");
 }
 printf("\n");
 for (int row = 1; row <= MAX_ROW; ++row) {
 printf("%02d|", row);
 for (int col = 1; col <= MAX_COL; ++col) {
  printf("%c ", map[row][col]);
 }
 printf("\n");

 }
 printf("\n");
 printf("\n");
 printf("\n");

}

void UpdateShowMap(char show_map[MAX_ROW + 2][MAX_COL + 2],
 char mine_map[MAX_ROW + 2][MAX_COL + 2], int row, int col) {
 //这个函数要根据mine_map来计算row,col位置上周围是有几个地雷
 //把结果写到对应的show_map位置上
 //===========此处这8个位置对应的下标不会越界======
 //===========因为引入了一圈边框===================
 //row和col取值是[1,MAX_ROW]
 //数组下标取值为[0,MAX_ROW + 1]

 int mine_count = 0;
 for (int i = row - 1; i <= row + 1; ++i) {
 for (int j = col - 1; j <= col + 1; ++j) {
  mine_count =
  mine_map[i - 1][j - 1] - '0' +
  mine_map[i - 1][j] - '0' +
  mine_map[i - 1][j + 1] - '0' +
  mine_map[i][j - 1] - '0' +
  mine_map[i][j + 1] - '0' +
  mine_map[i + 1][j - 1] - '0' +
  mine_map[i + 1][j] - '0' +
  mine_map[i + 1][j + 1] - '0';

  if (mine_map[i][j] == '1') {
  show_map[i][j] = '*';
  }
  else {
  show_map[i][j] = '0' + mine_count;
  }
 }
 }
}

//游戏主逻辑,入口
void Game() {
 //具体的一局扫雷游戏
 //两个二维数组来表示地图
 //第一个数组表示给玩家展示的地图
 char show_map[MAX_ROW + 2][MAX_COL + 2];
 //此处加上一圈边框(防止数组下标越界)
 //对于show_map:里面元素有2种情况:
 //1.这个位置没有被掀开,用 * 表示
 //2.这个位置已经被掀开了,用一个具体的数字来表示(例如字符'2'来表示)
 char mine_map[MAX_ROW + 2][MAX_COL + 2];
 //第二个数组表示雷阵
 //对于mine_map,里面的元素以下情况:
 //1.这个位置是地雷,使用字符'1'表示
 //2.这个位置不是地雷,使用字符'0'表示
 int blank_count = 0;//空格数 不包含地雷,被掀开的格子数
 //1.对这两个数组进行初始化
 //2.打印初始地图
 Init(show_map, mine_map);
 DisplayMap(show_map);
 while (1) {
 //3.让玩家输入坐标,判定是否合法
 int row, col;
 printf("请输入坐标:\n");
 scanf("%d %d", &row, &col);
 if (row <= 0 || row > MAX_ROW
  || col <= 0 || col > MAX_COL) {
  printf("您的输入不合法,重新输入!\n");
  continue;
 }
 //4.判断玩家是否踩雷,如果是,游戏结束
 if (mine_map[row][col] == '1') {
  printf("游戏结束!\n");
  printf("扫雷失败!\n");
  DisplayMap(mine_map);
  break;
 }
 //5,如果没踩雷,判定是否掀开了全部格子(玩家胜利)
 //6.就统计该位置周围有几个雷,并把这个数字更新到地图上
 UpdateShowMap(show_map, mine_map, row, col);
 DisplayMap(show_map);
 int blank_cnt = 0;
 for (row = 1; row <= MAX_ROW; ++row)
 {
  for (col = 1; col <= MAX_COL; ++col)
  {
  if (show_map[row][col] != '*')
  {
   ++blank_cnt;
   if (blank_cnt == MAX_ROW * MAX_COL - DEFAULT_MINE_COUNT)
   {
   DisplayMap(mine_map);
   printf("扫雷成功,游戏结束\n");
   break;
   }
  }
  }
 }
 printf("\n");
 }
}

void Start() {
 //这是游戏入口函数,游戏菜单
 while (1) {
 int choice = Menu();
 if (choice == 0) {
  break;
 }
 Game();
 }
}

//主函数
int main() {
 Start();//由开始函数引导游戏开始
 system("pause");
 return 0;
}

需要注意的是:

1.大佬可以通过更改程序首部的宏定义来改变方格大小,扩充界面大小以提高难度.

2.整个游戏逻辑必须明晰:

打印方格
随机布置雷阵
玩家输入掀开方格坐标
判断是否踩雷(若是,游戏结束.否则显示出周围八个数的地雷数)
若未踩雷判断是否除了地雷外掀开了所有方格(若是,扫雷成功.否则继续游戏)
更新表示地图
循环步骤,返回至用户输入环节,继续游戏,直至游戏截止.

总结:

程序内部需要有许多的注意点,比如引入一圈边框,他的作用就是为了确保更新地图时数组下标不会越界,是一种保护机制,但是这种机制的构建可能会在程序其他地方的完善工作带来不小的工程量,但是有这么一道设定,总比程序直接报错或者运行一段时间由玩家反馈这个bug来的划算/值得一些,所以尽可能在开发环节做到极致,以免折腾后面修改代码缺陷的自己.

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

(0)

相关推荐

  • C语言实现扫雷程序

    使用C语言实现简单的扫雷程序,主要是对二维数组的运用,我们需要一个头文件,两个源文件来实现. game.h //包含函数的声明,宏定义 test.c //包含主函数,函数调用 game.c //包含函数的定义 整体思路 1.要完成一个简单的扫雷程序,我们需要创建两个二维数组,一个保存我们随机生成的雷,另外一个向外界展示. //使用宏定义定义常量,方便之后对数组的使用 #define ROW 11 //雷 #define COL 11 #define ROWS 9 //棋盘 #define COL

  • C语言实现简单扫雷游戏

    本文实例为大家分享了C语言实现简单扫雷游戏的具体代码,供大家参考,具体内容如下 步骤 1.首先打印游戏选择菜单 2.地图及初始化 1).展示给玩家的地图(show_map) 2).地雷的图(mine_map可知地雷的位置) 3.打印地图 4.用户输入坐标,并检查坐标的合理性 5.判断当前位置是否有地雷,没有则出现数字(表示周围格子中有几个地雷) 6.打印新的地图 7.重复3~6步骤,直到踩雷游戏结束,或胜利. 8重新继续游戏或退出! 代码 主函数及游戏选择菜单 #include<stdio.h>

  • C语言快速实现扫雷小游戏

    本文实例为大家分享了C语言扫雷小游戏的具体实现代码,供大家参考,具体内容如下 一.分析游戏步骤: 具体步骤如图: 二.代码实现: 游戏步骤想好之后,就是用代码把步骤一步一步的实现.具体代码如下: 1.游戏主要实现: game.c #define _CRT_SECURE_NO_WARNINGS 1 #include"game.h" void game() { char mine[ROW + 2][COL + 2]; //记录地雷的数组 char show[ROW + 2][COL + 2

  • C语言扫雷游戏的实现代码

    这是一个用C语言实现的控制台扫雷小游戏,实现了随机布置炸弹.扫描炸弹.标记炸弹.百分百第一次不被炸死等功能. 编译器:vs2015 功能模块图 源代码 #include<stdio.h> #include<stdlib.h> #include<time.h> void show(int cbd[10][10],int u[10][10]) //界面输出函数 { int i, j; //for (i = 0; i < 10; i++) //输出全部炸弹信息(上帝视角

  • C语言简易扫雷游戏

    本文实例为大家分享了C语言扫雷游戏的具体代码,供大家参考,具体内容如下 #include<stdio.h> #include<stdlib.h> #include<time.h> #define MAX_ROW 9 #define MAX_COL 9 #define MINE_C0UNT 10 void menu() { printf("************************\n"); printf("***** 1.play *

  • C语言实现扫雷游戏

    本文将介绍如何用C语言多文件编程实现扫雷 该示例扫雷程序可实现以下几个功能: 自定义雷数 踩雷后会将所有雷显示出来 地图大小易修改 Mine_clearance.h #pragma once #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<stdlib.h> #include<time.h> #define ROW 11 #define COL 11 #define 踩雷 0 #define 玩家胜利

  • C语言实现扫雷小游戏(适合初学者)

    扫雷小游戏作为初学c语言的小白有很大的帮助,其中用到了函数的定义,函数的声明,循环语句,数组思想等等知识,对于代码理解和设计代码思路有很大的帮助,本文就详细介绍了代码的各个步骤和运行结果.希望给到和我一样的小白一点帮助. //game.h头文件 #include<stdio.h> #include<stdlib.h> #include<time.h> #define ROW 9//定义了界面的长宽,可以直更改ROW,COL的值,避免了程序中数字重复出现 #define

  • C语言代码实现扫雷小游戏

    本文实例为大家分享了C语言实现扫雷小游戏的具体代码,供大家参考,具体内容如下 主页面: 游戏页面: 虽然页面比较low,但我已经尽力了 具体代码实现: #include<stdio.h> #include<windows.h> #include<conio.h> #include<stdlib.h> #include<time.h> int n;//记录已经探索的区域数 int x,y;//光标的横纵坐标 int T;//判断游戏是否失败,T=1

  • C语言代码实现扫雷游戏

    本文实例为大家分享了C语言实现扫雷游戏的具体代码,供大家参考,具体内容如下 该游戏我们也是利用数组完成,设置俩个数组一个mine数组,一个show数组. mine数组存放雷,show数组显示棋盘并且显示该位置是否有雷或者显示该位置周围有几个雷. 数组大小有讲究,我们宏定义变量 ROW COL 为9 定义ROWS COLS为11,我们显示的是9X9的棋盘,也是将雷设置在9X9的位置内,但是我们设置数组是设置11X11,因为这样方便我们遍历9X9棋盘四边位置上某位置四周雷的数目,不然的话会发生越界错

  • C语言实现扫雷小游戏

    本文实例为大家分享了C语言实现扫雷游戏的具体代码,供大家参考,具体内容如下 主函数:main.c #include "game.h" void Menu() { printf("##########################\n"); printf("##1.play 0.exit##########\n"); printf("##########################\n"); printf("##

随机推荐