文章目录

  • 一.扫雷描述
  • 二.扫雷的设计思路
    • 2.1扫雷游戏的基本结构和菜单交互
    • 2.2扫雷游戏的实现函数game()
    • 2.3扫雷棋盘的创建
    • 2.4扫雷棋盘的初始化函数InitBoard()
    • 2.5扫雷棋盘的打印函数DisplayBoard()
    • 2.6扫雷棋盘的布置雷函数SetMine()
    • 2.7扫雷棋盘的排查雷函数FindMine()
  • 三、扫雷的代码
    • 3.1game.h:库函数,define定义的宏,扫雷函数的声明
    • 3.2test.c:扫雷游戏的基本结构
    • 3.3game.c:扫雷游戏函数的实现

一.扫雷描述

C语言写一个简易的初级扫雷,棋盘是9乘9的规格,设计有10个雷,创建两个棋盘,一个mine数组棋盘存放雷的信息,雷用字符1表示,非雷用字符0表示,另一个show数组棋盘存放排查出雷的信息,用字符*表示。


二.扫雷的设计思路

2.1扫雷游戏的基本结构和菜单交互

设计一个简易的菜单,让玩家进行选择,玩家有可能选其他数字,所以使用多分支语句,为了让游戏可以重复玩,提高可玩性,这里使用do-while结构,至少可以玩一次,只有玩家输入0游戏才停止。

void menu()
{printf("************************\n");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:printf("开始游戏\n");game();break;case 0:printf("退出游戏\n");break;default:printf("选择错误,请重新输入!\n");break;}} while (input);return 0;
}

2.2扫雷游戏的实现函数game()

void game()
{//存放雷的信息char mine[ROWS][COLS] = { 0 };//存放排查出雷的信息char show[ROWS][COLS] = { 0 };//初始化棋盘InitBoard(mine, ROWS, COLS, '0');//全部是'0'InitBoard(show, ROWS, COLS, '*');//全部是'*'//打印棋盘DisplayBoard(show, ROW, COL);//布置雷SetMine(mine, ROW, COL);//DisplayBoard(mine, ROW, COL);//可以看见雷放的位置//排查雷FindMine(mine, show, ROW, COL);
}

2.3扫雷棋盘的创建

9乘9棋盘计算外围的雷的个数时会造成数组越界,所以要扩大一圈,ROW表示行,COL表示列,ROWS是11,COLS是11。

 //存放雷的信息char mine[ROWS][COLS] = { 0 };//存放排查出雷的信息char show[ROWS][COLS] = { 0 };


2.4扫雷棋盘的初始化函数InitBoard()

存放雷的信息的棋盘全部初始化为字符0,存放排查出雷的信息的棋盘全部初始化为*。

void InitBoard(char board[ROWS][COLS], int rows, int cols, char set)
{int i = 0;//行for (i = 0; i < rows; i++){int j = 0;//列for (j = 0; j < cols; j++){board[i][j] = set;}}
}

2.5扫雷棋盘的打印函数DisplayBoard()

因为只需要操作中间9乘9的格子,所以打印二维数组棋盘的元素时,数组行和列都从下标1开始,到9结束。

void DisplayBoard(char board[ROWS][COLS], int row, int col)
{printf("-------------------\n");int i = 0;//打印列的坐标数字for (i = 0; i <= row; i++){printf("%d ", i);}printf("\n");//打印行for (i = 1; i <= row; i++){//打印行的坐标数字printf("%d ", i);int j = 0;//打印列for (j = 1; j <= col; j++){printf("%c ", board[i][j]);}printf("\n");}printf("-------------------\n");
}


2.6扫雷棋盘的布置雷函数SetMine()

EASY_COUNT表示雷的数量,雷的位置是随机的.

void SetMine(char board[ROWS][COLS], int row, int col)
{int count = EASY_COUNT;while (count){//随机生成坐标(1-9)int x = rand() % row + 1;int y = rand() % col + 1;if (board[x][y] != '1'){board[x][y] = '1';count--;}}
}


2.7扫雷棋盘的排查雷函数FindMine()

玩家输入要排查的坐标,坐标要合理,如果输入的坐标在mine数组里是雷,则游戏结束,不然就在show数组对应的坐标显示周围有几个雷,数字字符(0~9)对应的ASCII值减去ASCII值等于数字,如:‘3’ - ‘0’ = 3。

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)//9*9-10 = 71{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';//如'3' = 3 + '0',字符'3'表示周围有3个雷DisplayBoard(show, ROW, COL);win++;}}else{printf("坐标非法,请重新输入!\n");}}if (win == row * col - EASY_COUNT){printf("恭喜你,排雷成功!\n");DisplayBoard(mine, ROW, COL);}
}//统计所选坐标周围有几个雷
GetMineCount(char mine[ROWS][COLS], int x, int y)
{//周围8个坐标的字符值加起来减去8乘字符'0'的值得到有几个雷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');
}

三、扫雷的代码

3.1game.h:库函数,define定义的宏,扫雷函数的声明

#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 board[ROWS][COLS], int rows, int cols, char set);//打印棋盘
void DisplayBoard(char board[ROWS][COLS], int row, int col);//布置雷
void SetMine(char board[ROWS][COLS], int row, int col);//排查雷
void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col);

3.2test.c:扫雷游戏的基本结构

#include "game.h"void menu()
{printf("************************\n");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, ROW, COL);//布置雷SetMine(mine, ROW, COL);//DisplayBoard(mine, ROW, COL);//可以看见雷放的位置//排查雷FindMine(mine, show, ROW, COL);
}int main()
{srand((unsigned int)time(NULL));//作为rand()函数的随机数种子int input = 0;do{menu();printf("请选择:>");scanf("%d", &input);switch (input){case 1:printf("开始游戏\n");game();break;case 0:printf("退出游戏\n");break;default:printf("选择错误,请重新输入!\n");break;}} while (input);return 0;
}

3.3game.c:扫雷游戏函数的实现

#include "game.h"//初始化棋盘
void InitBoard(char board[ROWS][COLS], int rows, int cols, char set)
{int i = 0;//行for (i = 0; i < rows; i++){int j = 0;//列for (j = 0; j < cols; j++){board[i][j] = set;}}
}//打印棋盘
void DisplayBoard(char board[ROWS][COLS], int row, int col)
{printf("-------------------\n");int i = 0;//打印列的坐标数字for (i = 0; i <= row; i++){printf("%d ", i);}printf("\n");//打印行for (i = 1; i <= row; i++){//打印行的坐标数字printf("%d ", i);int j = 0;//打印列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 count = EASY_COUNT;while (count){//随机在棋盘上生成雷int x = rand() % row + 1;int y = rand() % col + 1;if (board[x][y] != '1'){board[x][y] = '1';count--;}}
}//统计所选坐标周围有几个雷
GetMineCount(char mine[ROWS][COLS], int x, int y)
{//把周围雷'1'的坐标加起来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 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("请输入要排查的坐标:");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';//如'3' = 3 + '0',字符'3'表示周围有3个雷DisplayBoard(show, ROW, COL);win++;}}else{printf("坐标非法,请重新输入!\n");}}if (win == row * col - EASY_COUNT){printf("恭喜你,排雷成功!\n");DisplayBoard(mine, ROW, COL);}
}

排雷成功:

排雷失败:


以上就是扫雷的实现内容。

作者水平有限,如果代码或者文章哪里出现了错误,请大家在评论区留言,方便及时改正。

长路漫漫,代码作伴,制作不易,给个三连!!!

觉得不错点个赞支持一下啦!

C语言小游戏,编程入门必看,初级扫雷相关推荐

  1. 反弹球c语言小游戏编程,C语言实现反弹球小游戏

    本文为大家分享了C语言反弹球游戏的具体代码,供大家参考,具体内容如下 这是利用函数写的C语言小游戏,用来检验自己的学习成果 反弹球的实现主要有几个子函数组成 问题也在于如何实现小球的下落,以及碰撞得分 ...

  2. python单片机编程入门先学什么_编程入门必看:带你零基础了解编程和编程语言,入门应该学什么?...

    编程入门 什么是编程 我们通过有固定格式和固定词汇的"语言"来控制他人,让他人为我们做事情.语言有很多种,包括汉语.英语.法语.韩语等,虽然他们的词汇和格式都不一样,但是可以达到同 ...

  3. 编程入门必看:带你零基础了解编程和编程语言,入门应该学什么?

    什么是编程 我们通过有固定格式和固定词汇的"语言"来控制他人,让他人为我们做事情.语言有很多种,包括汉语.英语.法语.韩语等,虽然他们的词汇和格式都不一样,但是可以达到同样的目的, ...

  4. C语言小游戏快速入门--弹跳小球

    目录 一.前言 二.弹跳小球的实现 2.1.界面设置 2.2.弹跳逻辑 1. game.h 2. game.c 3. test.c 三.总结 一.前言 相信很多小伙伴在学习完C语言语法之后就想要做几个 ...

  5. C语言小游戏快速入门--三子棋

    目录 一.前言 二.游戏界面 三.游戏逻辑 1.game.h 2.game.c 3.test.c 四.总结 一.前言 这是一个非常简单的三子棋小游戏,学过C语言数组语法的就可以写出来.在这里博主实现的 ...

  6. 编程入门必看书籍推荐

    以下书籍都是现在业内主流编程入门好书,同步收录在顶书,通过下面网址进入,实时读书: 顶书-提升IT技术和认知​i-book.top 程序是怎样跑起来的 本书从计算机的内部结构开始讲起,以图配文的形式详 ...

  7. Java编程学习入门、Java语言学习、Java入门必看

    一.初识Java 1.生活中的程序: 从起床到教室上课的过程 穿衣打扮>起床>洗漱>出宿舍>>吃早餐>到教室 按照特定的顺序去完成某一件事的过程我们叫做生活中的程序 ...

  8. C语言小游戏快速入门--推箱子

    目录 一.前言 二.游戏运行环境 三.代码实现逻辑 1. game.h 2. game.c 3. test.c 四.总结 一.前言 这是最简单的推箱子了,非常适合初学者.只需要学会一点数组和函数的知识 ...

  9. C语言简单游戏编程入门之中国象棋

    运行截图 实现思路 老套路,二维数组存储棋盘,宏定义各种棋子,每次棋子的移动实质为二维数组的赋值. 重点是判断棋子是否可移动到目标位置,移动有两种可能,一是单纯移动,二是吃子移动.主要飞将的特殊规则. ...

  10. c#语言经典程序100例,C#入门必看的实例程序100个 - 源码下载|Windows编程|其他小程序|源代码 - 源码中国...

    C#入门必看的实例程序100个\实例01\01.bmp C#入门必看的实例程序100个\实例01\csc编译器路径.txt C#入门必看的实例程序100个\实例01\hello.cs C#入门必看的实 ...

最新文章

  1. STM32串口发送中断
  2. 141. Sqrt(x)【牛顿迭代法求平方根 by java】
  3. springboot中的过滤器、拦截器、监听器整合使用
  4. linux 函数 增加用户,linux常用c函数用户组有哪些?
  5. 多年前那些优秀的工程师,后来都去哪儿了?
  6. 复习Collection_迭代器使用细节_泛型_综合案例
  7. 独家 | 2019届互联网校招本科薪酬清单|湾区人工智能
  8. 漫谈云计算与OpenStack的前世今生
  9. 简单理解盘索引地址的表示原理
  10. java retro2me_retro2me中文模拟器不闪退美化版-retro2me中文模拟器不闪退版(j2me模拟器最新版本)v2.1.0不崩溃版_新绿资源网...
  11. 十折交叉验证 matlab,Matlab 十折交叉验证
  12. 2011年上半年国内优秀初创企业产品汇总
  13. lambda 表达式forEach中获取元素下标
  14. 计算机l符号代表什么意思,衣服sml代表什么意思 分别是什么的标记
  15. 最新系统[防黑屏版]BT及双网盘下载(ZZ)
  16. 扇形导航 html svg
  17. 最小费用最大流算法 网络流
  18. 【Spark NLP】第 8 章:使用 Keras 进行序列建模
  19. vue的渐进式框架的理解
  20. TensorFlow TFRecords简介

热门文章

  1. qsor快排序以及cmp函数
  2. DRF的解析器和渲染器
  3. PHP学习九--会话控制session和cookie
  4. STM32 高速定时器配置为PWM使用细节
  5. 茴香豆的n种写法之①——linQ Join写法
  6. Silverlight4 麦克风应用-录音机
  7. 【水晶报表内功心法】--序言
  8. win10计算机管理字体糊,大神分析win10系统高分屏字体模糊的办法介绍
  9. java集合复习笔记-java集合继承关系图
  10. static_cast vs reinterpret_cast vs const_cast vs dynamic_cast