前言

相信扫雷游戏小伙伴们肯定都玩过吧,学习了C语言中的数组、函数等基础内容之后就可以自己写一个简易的扫雷小游戏了,今天就我写扫雷小游戏的过程及思路写一篇博客,希望大家看完我的博客能有所收获。

软件及环境

VS2013
(说明:以下所提到的mine为置雷的棋盘,show为显示排雷信息的棋盘)

扫雷游戏基本过程

扫雷游戏:输入坐标如果该位置不是雷,则显示数字代表该坐标周围有几个雷;如果该位置是雷则游戏结束。
优化:如果输入坐标该位置不是雷,且该位置周围没有雷,则可以展开一片,直到周围有雷的地方。

  1. 首先我们需要两个棋盘来供我们使用,一个棋盘用于置雷,另外一个用于打印提示用户排雷,棋盘使用二维字符数组来进行创建。(字符数组可以节省内存)
  2. 初始化两个棋盘,用于置雷的棋盘mine初始化为全‘0’,用于打印提示用户排雷的棋盘show初始化为全‘*’。(可以根据自己需要改变)
  3. 置雷:雷的放置是随机的,这里我们使用到了随机函数进行随机置雷。
  4. 排雷:用户输入想要排查的坐标,如果该位置是雷则游戏结束;如果该位置不是雷则显示周围存在的雷的个数。优化后的排雷函数可以展开一片。
    大致的游戏过程就是这样。

优化排雷思路

优化排雷应该注意的条件:

  1. 该坐标不是雷且周围没有雷—满足展开一片
  2. 该坐标不是雷但是周围有雷—打印周围有雷的个数(递归的截至条件)
    在代码实现的过程中需要注意几个问题:
    ①递归的截止条件②注意数组的边界,不要越界③这里递归访问很容易重复访问某一个坐标,所以需要进行判断
    我的实现思路:
    玩家输入坐标,如果在mine棋盘中为’0‘(说明该位置没有雷),在show棋盘中为’*’(说明该位置未被访问过),1<=x<=col,1<=y<=row(没有越界),进行判断:如果周围没有雷就将该坐标置为空格,通过递归的思路依次判断该坐标周围的8个坐标即可。如果周围有雷就计算周围雷的数量转化为字符形式存入show棋盘的相应坐标,返回上一层递归。
    代码如下:
void SetSpace(char board1[ROWS][COLS],char board2[ROWS][COLS], int x, int y)  //board1为放置雷的棋盘,board2为显示排雷信息的棋盘
{while (board1[x][y] == '0' && board2[x][y] =='*' && x >=1 && x <= ROW && y >= 1 && y <= COL){if (GetMine(board1, x, y) == 0)//周围没有雷{board2[x][y] = ' ';SetSpace(board1, board2, x, y + 1);SetSpace(board1, board2, x - 1, y + 1);SetSpace(board1, board2, x - 1, y);SetSpace(board1, board2, x - 1, y - 1);SetSpace(board1, board2, x, y - 1);SetSpace(board1, board2, x + 1, y - 1);SetSpace(board1, board2, x + 1, y);SetSpace(board1, board2, x + 1, y + 1);}else  //周围有雷{board2[x][y] = GetMine(board1, x, y) + '0';break;}}
}

代码实现(含优化)

文件及目录结构

game.h头文件

#include<stdio.h>
#include<time.h>
#include<stdlib.h>
#define ROW 9
#define COL 9
#define ROWS ROW+2
#define COLS COL+2
#define MINE_NUM 10    //放置雷的数量
#define TIME  ROW*COL-MINE_NUM
void DisplayBoard(char board[ROWS][COLS], int row, int col);void InitBoard(char board[ROWS][COLS], int row, int col, char s);
void SetMine(char board[ROWS][COLS], int row, int col);
void FindMine(char board1[ROWS][COLS], char board2[ROWS][COLS], int row, int col);
void FindMinePlus(char board1[ROWS][COLS], char board2[ROWS][COLS], int row, int col);  //优化排雷
void SetSpace(char board1[ROWS][COLS], char board2[ROWS][COLS], int x, int y);

game.c文件

#define _CRT_SECURE_NO_WARNINGS 1
#include "game.h"int GetMine(char board1[ROWS][COLS], int x, int y)  //统计坐标x,y周围的雷的个数
{return (board1[x-1][y ] + board1[x - 1][y - 1] + board1[x ][y-1] + board1[x + 1][y - 1] + board1[x+1][y ]+ board1[x + 1][y + 1] + board1[x ][y+1] + board1[x - 1][y + 1] - 8 * '0');
}
void InitBoard(char board[ROWS][COLS], int row, int col, char s)
{int i = 0, j = 0;for ( i = 0; i < row; i++){for ( j = 0; j < col; j++){board[i][j] = s;}}
}void DisplayBoard(char board[ROWS][COLS], int row, int col)
{int i = 0, j = 0;for (i = 0; i <= row; i++){printf("%d ", i);}printf("\n");for (i = 1; i <= row; i++){printf("%d ", i);for (j = 1; j <=col; j++){printf("%c ", board[i][j]);}printf("\n");}printf("*******************\n");
}
void SetMine(char board[ROWS][COLS], int row, int col)     //放置雷
{int mine_count =  MINE_NUM;while (mine_count > 0){int x = rand() % col + 1;int y = rand() % row + 1;if (board[x][y] != '1'){board[x][y] = '1';mine_count--;}}
}
void FindMine(char board1[ROWS][COLS],char board2[ROWS][COLS], int row, int col)
{int x = 0, y = 0,time = 0;while (time < TIME){printf("请输入要排查的坐标:\n");scanf("%d%d", &x, &y);if (board1[x][y] == '1'){printf("很遗憾,你被炸死了\n");DisplayBoard(board1, row, col);break;}else{if (board2[x][y] == '*'){time++;}board2[x][y] = GetMine(board1,x,y)+'0';DisplayBoard(board2, row, col);}}if (time == TIME){printf("恭喜排雷成功!\n");}
}
void SetSpace(char board1[ROWS][COLS],char board2[ROWS][COLS], int x, int y)
{while (board1[x][y] == '0' && board2[x][y] =='*' && x >=1 && x <= ROW && y >= 1 && y <= COL){if (GetMine(board1, x, y) == 0)//周围没有雷{board2[x][y] = ' ';SetSpace(board1, board2, x, y + 1);SetSpace(board1, board2, x - 1, y + 1);SetSpace(board1, board2, x - 1, y);SetSpace(board1, board2, x - 1, y - 1);SetSpace(board1, board2, x, y - 1);SetSpace(board1, board2, x + 1, y - 1);SetSpace(board1, board2, x + 1, y);SetSpace(board1, board2, x + 1, y + 1);}else  //周围有雷{board2[x][y] = GetMine(board1, x, y) + '0';break;}}
}
int Mine_Num(char board[ROWS][COLS], int row, int col)
{int i = 0, j = 0,count = 0;for (i = 1; i <= row; i++){for (j = 1; j <= col; j++){if (board[i][j] == '*')count++;}}return count;
}
void FindMinePlus(char board1[ROWS][COLS], char board2[ROWS][COLS], int row, int col)
{int x = 0, y = 0;while (1){printf("请输入要排查的坐标:\n");scanf("%d%d", &x, &y);if (board1[x][y] == '1'){printf("很遗憾,你被炸死了!\n");DisplayBoard(board1, ROW, COL);break;}else{SetSpace(board1, board2, x, y);DisplayBoard(board2, ROW, COL);if (Mine_Num(board2, ROW, COL) == MINE_NUM){printf("恭喜你,排雷成功!\n");break;}}}}

main.c文件

#define _CRT_SECURE_NO_WARNINGS 1
#include "game.h"
void menu()
{printf("                (^=^)                \n");printf("**************欢迎进入扫雷游戏*************\n");printf("请选择:                                \n");printf("     1.扫雷                             \n");printf("     0.退出                             \n");
}
void game()
{char mine[ROWS][COLS];char show[ROWS][COLS];InitBoard(mine,ROWS,COLS,'0');InitBoard(show, ROWS, COLS, '*');DisplayBoard(mine, ROW, COL);DisplayBoard(show, ROW, COL);SetMine(mine,ROW,COL);DisplayBoard(mine, ROW, COL);FindMinePlus(mine, show, ROW, COL);}
void playGame()
{int choice = 0;do{menu();scanf("%d", &choice);switch (choice){case 1:game();playGame();break;case 0:exit(0);break;default:printf("选择错误,请重新选择正确的选项!\n");break;}} while (choice !=1 && choice!= 0);}
int main()
{srand((unsigned int)time(NULL));playGame();return 0;
}

效果和截图

(为了演示所以直接打印了置雷棋盘)
简易扫雷:
此过程需要你把棋盘上所有不是雷的位置找出来最后才能获得游戏胜利,过程未免太过漫长,给玩家带来不好的体验。

优化后:
优化后的游戏体验明显提升啦!

以上代码以及思路如有不妥之处望积极提出,代码我放在我的码云上啦,需要看的小伙伴戳这里!!https://gitee.com/yuan-xinyi/c-language/tree/master/findmine

使用C语言写一个扫雷小游戏相关推荐

  1. ChatGPT实现用C语言写一个扫雷小游戏

    前几天我们利用 ChatGPT实现用C语言写一个学生成绩管理系统 其过程用时不到30秒,速度惊人 今天又让ChatGPT用C语言写了一个扫雷小游戏,它的回答是:抱歉,我是AI语言模型,无法编写程序. ...

  2. C++ · 手把手教你写一个扫雷小游戏

    Hello,大家好,我是余同学.这两个月真是太忙了,无暇给大家更新文章- 暑假不是写了个扫雷小游戏吗(Link)?考虑到很多同学对代码没有透彻的理解,那么,这篇文章,我们来详细分析一下代码. 我们分为 ...

  3. 【tkinter】用不到50行Python代码,写一个扫雷小游戏

    文章目录 定制按钮 生成雷区 主流程 Tkinter系列: GUI初步

  4. c++ 小游戏_C/C++编程笔记:C语言写推箱子小游戏,大一学习C语言练手项目

    C语言,作为大多数人的第一门编程语言,重要性不言而喻,很多编程习惯,逻辑方式在此时就已经形成了.这个是我在大一学习 C语言 后写的推箱子小游戏,自己的逻辑能力得到了提升,在这里同大家分享这个推箱子小游 ...

  5. 如何开发一个扫雷小游戏?

    如何用C#开发一个扫雷小游戏? 十分自豪的说,计算机编程就是变魔术,每一个coder都是一个魔术师. 初学C#的时候,我相信很多人都和我一样,学会了基本语法,掌握了基本的数据结构,也见过了不少微软提供 ...

  6. rust游戏亮度怎么调亮点_之前用Rust写的扫雷小游戏

    这次来分享一下之前用Rust写的一个扫雷小游戏,目前能在Windows下运行.Github仓库: https://github.com/crlf0710/charlesmine-rs​github.c ...

  7. 一个扫雷小游戏带你初识VUE3和typescript

    一个扫雷小游戏带你初识VUE3和typescript 阅读本文你会了解到: vue3的部分新特性 typescript的基本使用 部分es6语法 基础部分 为什么要使用ref和reactive来声明变 ...

  8. 用C语言做一个迷宫小游戏

    用C语言做一个迷宫小游戏,以下是代码段 这个迷宫游戏使用了递归回溯算法来寻找通往出口的路径.迷宫中的墙用'#'表示,路径用空格表示,入口和出口分别用'S'和'E'表示,已走过的路径用'*'表示.在生成 ...

  9. C语言初阶——扫雷小游戏

    扫雷这款小游戏想必大家都接触到过,但是用C语言写的扫雷你见过吗?其实,学完之前我写的那几篇文章,我们完全可以自己写出来.仅仅200多行代码,我们就可以写出我们自己的扫雷小游戏!赶紧来看看吧!!! 文章 ...

最新文章

  1. Solr5.4.0+Tomcat+mmseg4j
  2. oracle 加查询锁,oracle 锁查询 select加锁方法
  3. Spring5的集成测试
  4. python3 全局变量 局部变量_python3 函数传参练习 全局变量与局部变量 的理解
  5. jqueryonclick事件_jquery动态移除/增加onclick属性详解
  6. Android Studio安装、应用与卸载
  7. sprintf函数用法注意事项
  8. React antd的table表格之嵌套表格
  9. HTML测试报告模板
  10. 《SEM长尾搜索营销策略解密》一一2.11 向传统行业致敬
  11. python切换环境_python如何变换环境
  12. Linux分卷压缩后,Windows解压缩
  13. win7+VS2015+OpenCV3.20的搭建
  14. MATLAB--基本操作与矩阵输入
  15. ubuntu U盘只读的修复办法
  16. ubuntu上下左右wasd错乱
  17. C语言计算长方体体积的代码(代码中稍加美化了一下)
  18. 应届生在简历中如何描述自己的交互设计项目经验
  19. freenom域名免翻墙注册
  20. 汉语拼音新规将实施 拼音中文名须姓在前名在后

热门文章

  1. python与正则表达式(part3)--贪婪模式和非贪婪模式
  2. 有向图最长路径算法_算法数据结构 | 三个步骤完成强连通分量分解的Kosaraju算法...
  3. 利用Python实现用户群组分析!
  4. 什么是 Time to live TTL
  5. SAP Spartacus后台CMS Component和Angular Component的映射关系
  6. SAP Spartacus root.scss里的变量层级引用
  7. SAP Spartacus读取User Address的请求发送和接收源头
  8. Angular In-memory Web API使用介绍
  9. SAP新一代全栈开发工具:SAP Business Application Studio
  10. Fiori Elements里的Reference Facet