C语言初阶小练习3(扫雷小游戏的代码实现及解读)

devtools/2024/10/17 22:41:51/

一、扫雷小游戏基本信息

1.1 游戏目标

  • 游戏的主要目标是在最短的时间内,根据点击格子出现的数字找出所有非雷格子,同时避免踩到地雷。踩到一个雷即全盘皆输。

1.2 游戏玩法

  • 游戏界面:游戏通常在一个由方格组成的网格中进行,网格大小根据游戏难度(初级、中级、高级或自定义)而有所不同。

  • 基本操作

    • 左键单击(或点击):用于打开安全的格子,推进游戏进度。如果格子上有数字,则表示其周围3×3区域中的地雷数。
    • 右键单击(或长按):用于标记地雷,以辅助判断,或为接下来的双击做准备。
    • 双击:当双击位置周围已标记雷数等于该位置数字时,相当于对数字周围未打开的方块均进行一次左键单击操作。
  • 游戏结束:如果玩家点击的格子中有地雷,则游戏结束。

二.代码解析

1.test.c(测试小游戏模块)

首先写出主函数

int main()
{test();return 0;
}

我们在test()函数中进行函数的书写,下面是test函数的代码

void test()
{srand((unsigned)time(NULL));int input = 0;do{menu();printf("请选择-->");scanf("%d", &input);switch(input){case 1:game();break;case 0:printf("退出游戏\n");break;default:printf("选择错误,重新选择\n");break;}} while (input);
}

在test函数中,我们创建一个菜单

1.是进行游戏

0.退出游戏

让玩家输入对应数字,再对输入的数字进行判断,选择1就进入game函数部分,选择0就退出游戏,输入其他数字就要重新选择

2.game.h(声明函数部分)

//相应的头文件

#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 mine[ROW][COL],int row,int col);

//排查雷函数声明
void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row,int col);

3.game.c(函数实现部分)

这是初始化棋盘函数的实现

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)
{int i = 0;int j = 0;printf("------------扫雷-----------\n");//控制列号for(j=0;j<=col;j++){printf("%d ", j);}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");

......

其余函数在“三.附上完整代码” 中都有进行解释

三.附上完整代码

1.test.c(测试小游戏模块)

#define  _CRT_SECURE_NO_WARNINGS 1
//扫雷游戏
#include "game.h"
void menu()
{printf("|***********************|\n");printf("|******* 1.play  *******|\n");printf("|******* 0.exit  *******|\n");printf("|***********************|\n");}void game()
{//1.需要存放布置好的雷的信息,存放排查出的雷的信息,我们需要2个二维数组//2.排查坐标的时候,为了防止坐标越界,我们给数组的行增加两行,列增加两列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);}void test()
{srand((unsigned)time(NULL));int input = 0;do{menu();printf("请选择-->");scanf("%d", &input);switch(input){case 1:game();break;case 0:printf("退出游戏\n");break;default:printf("选择错误,重新选择\n");break;}} while (input);
}int main()
{test();return 0;
}

2.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#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 mine[ROW][COL],int row,int col);//排查雷
void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row,int col);

3.game.c(函数实现部分)

#define  _CRT_SECURE_NO_WARNINGS 1#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)
{int i = 0;int j = 0;printf("------------扫雷-----------\n");//控制列号for(j=0;j<=col;j++){printf("%d ", j);}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 mine[ROWS][COLS], int row, int col)
{int count = EASY_COUNT;while (count){//1.生成随机下标int x = rand() % row + 1;int y = rand() % col + 1;//2.布置雷if (mine[x][y] == '0'){mine[x][y] = '1';count--;}}
}int get_mine_count(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 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 (show[x][y] != '*'){printf("该坐标已经被排查过\n");continue;}if (mine[x][y] == '1'){printf("很遗憾,你被炸死了\n");DisplayBoard(mine, ROW, COL);break;}else{int n = get_mine_count(mine, x, y);show[x][y] = n + '0';DisplayBoard(show, ROW, COL);win++;}}else{printf("坐标非法,重新输入\n");}}if (win == (row * col - EASY_COUNT)){printf("恭喜你,排雷成功\n");DisplayBoard(mine, ROW, COL);}
}

四.拓展训练

//如何拓展实现
//1.能够展开一片的操作
//2.标记和取消雷
//3.显示剩余雷的个数
//图形化

//EasyX--C语言的界面库


http://www.ppmy.cn/devtools/126575.html

相关文章

了解Android中为什么需要多线程?

在Android开发中&#xff0c;多线程是一个至关重要的概念。理解并合理应用多线程&#xff0c;可以显著提升应用的性能和用户体验。 一、Android多线程的基本概念 1. 主线程与UI线程 在Android中&#xff0c;主线程也称为UI线程&#xff0c;它负责处理用户输入、事件分发、绘…

HTML快速入门--第二节--css选择器

一、基本概念 CSS:层叠样式表 样式&#xff1a;外观属性 层叠&#xff1a;一个标签对象&#xff0c;最终呈现出来的样子&#xff0c;多个样式共同作用 表&#xff1a;.css后缀文件 tr是列 td是行 div :能整齐装东西 空格td :后代 >td:子代 选择…

C++面试速通宝典——28

527. 讲一下平衡二叉搜索树&#xff0c;删除非叶子节点后如何调整&#xff1f; 平衡二叉搜索树&#xff08;比如AVL树或红黑树&#xff09;是一种在每次插入和删除后能够自平衡的二叉搜索树&#xff0c;以保证树的高度尽可能地低&#xff0c;从而保证操作的性能。 删除非叶子…

微深节能 堆取料机回转俯仰角度检测系统 格雷母线

微深节能的堆取料机回转俯仰角度检测系统结合了格雷母线技术&#xff0c;为堆取料机的自动化作业提供了高精度、无磨损的位置检测与控制方案。该系统由武汉市微深节能科技有限公司自主研发&#xff0c;旨在提升堆取料作业的自动化水平和精确性。 格雷母线定位系统是一种高精度、…

MATLAB使用高斯消元法计算方程组的解

function X uptrbk(A,B) % A,B是系数矩阵和列向量 % 求方阵A 含多少行(列) X是N*1列向量解 [~, N] size(A); X zeros(N,1); % C一行,N1列 C zeros(1,N1); % 增广矩阵Aug Aug [A,B]; %循环从第一列到倒数第二列 for p1:N-1[~,j] max(abs(Aug(p:N,p)));%返回每一列中的绝对…

elementui+vue 多行数据的合并单元格

多行的合并&#xff0c;可以参考&#xff0c;改改就能用 html <template><el-table :data"students" :span-method"objectSpanMethod"><el-table-column prop"grade" label"年级"></el-table-column><el-…

Android13 添加运行时权限

在一些场景下&#xff0c;需要给app 添加运行时权限&#xff0c;这样就不需要在使用的时候再去点击授权。 直接上代码&#xff1a; --- a/services/core/java/com/android/server/pm/permission/DefaultPermissionGrantPolicy.javab/services/core/java/com/android/server/pm…

推荐一个可以免费上传PDF产品图册的网站

​在数字化时代&#xff0c;企业将产品图册以PDF格式上传至网络&#xff0c;不仅便于客户浏览和下载&#xff0c;还能提升企业的专业形象。今天&#xff0c;就为您推荐一个可以免费上传PDF产品图册的网站——FLBOOK&#xff0c;轻松实现产品图册的在线展示。 1.注册登录&#x…