C语言编写小游戏:MinesWeeper(扫雷)闯关版

article/2025/10/27 6:54:11

    《扫雷》:大众类的益智小游戏,游戏目标是在最短的时间内根据点击格子出现的数字找出所有非雷格子,同时避免踩雷,踩到一个雷即全盘皆输。

    话不多说,我们直接进入正题。

    首先,我们得给用户显示一个菜单栏,供用户选择,所以我们先来编写菜单函数:

void menu()
{printf("********************\n");printf("********扫雷********\n");printf("** 1.paly  0.exit **\n");printf("********************\n");printf("Please select:");
}

    菜单有了之后,就要写主函数了:

int main()
{int select = 0;//初始化变量select,用来接收玩家输入内容do{menu();//首先显示除我们刚才所写的菜单scanf("%d",&select);//接收玩家输入的内容switch(select){case 1://玩家输入1,直接进入游戏game();break;case 0://如果玩家输入0,直接退出游戏exit(0);default://玩家输入了其他字符,提示玩家输入错误printf("Error!please try again!\n");break;}}while(1);system("pause");return 0;
}

    写完主函数之后,我们就要写游戏的主逻辑game函数了,直接上代码,把思路会写进注释当中:

    在写游戏主逻辑函数之前,我们先宏定义几个参数,以便后续适用方便。这里我们设计的游戏为10*10的格子,然后第一关雷的数量设置成20:

#define ROW 10//定义ROW的大小为10
#define COL 10//定义COL的大小为10
#define MINE_NUM 20//定义雷的MINE_NUM的大小为20

void game()
{int i = 1;//先初始化一个变量,控制关卡int x,y;//定义两个变量,用来接收玩家输入的坐标int a = 0;//初始化变量a,用来统计玩家所排除格子数量do{//我们首先需要定义两个二维数组,一个用来系统布雷,另一个显示给玩家char mine[ROW+2][COL+2];//定义系统布雷的数组char show[ROW+2][COL+2];//定义给用户显示的数组memset(mine,'0',(ROW+2)*(COL+2));//将系统布雷数组的全部内容设置为字符‘0’memset(show,'*',(ROW+2)*(COL+2));//将显示数组的全部内容设置为字符‘*’printf("第%d关\n",i);//显示当前关卡lay_mines(mine,ROW+2,COL+2,i);//布雷do{print_board(show,ROW+2,COL+2);//向用户显示坐标界面printf("Please input your coordinate:<x,y>");//提示玩家输入坐标scanf("%d%d",&x,&y);//接收玩家输入的坐标if(x>=1&&x<=10&&y>=1&&y<=10)//判断玩家输入坐标是否合法{if(mine[x][y] == '1')//判断玩家所选坐标位置是否是雷。这里字符‘1’代表雷{printf("It's too bad!Game over!\n");//提示玩家游戏结束print_board(mine,ROW+2,COL+2);//显示出雷的位置goto END;//跳到END位置}else//表示玩家所选位置不是雷,我们就要计算该位置周围雷的数量{	int count = get_mine_num(mine,ROW+2,COL+2,x,y);//用get_mine_num()函数传入该位置周围雷的个数show[x][y] = count + '0';//将该位置雷的个数(这里加上字符‘0’,目的是将数字转化为对应字符)给到显示数组的对应位置a++;//排除数量自增if(ROW*COL-i*MINE_NUM == a)//如果排除数目与系统布雷数组中非雷个数相等,表示玩家获胜{printf("Congratulations!You win!\n");i++;//关卡数自增,以便后续进入下一关break;}}}}while(1);		}while(i<=4);//游戏设置的最高关数4.
END:printf("Do you want to play again?\n");
}

    游戏主逻辑写完之后,我们就来写主逻辑函数当中所使用到的函数,按照从上到下的顺序,先来写系统布雷的函数:

void lay_mines(char mine[][COL+2],int row,int col,int a)
{int x;//定义变量x,用来记录系统布雷位置的横坐标int y;//定义变量y,用来记录系统布雷位置的纵坐标int count = 0;//定义变量count,用来控制布雷数量srand((unsigned long)time(NULL));//生成随机数的函数do{x = (rand() % (ROW))+1;//生成的随机数取余10再加一,用来控制x的取值范围必须在1~10y = (rand() % (COL))+1;//同上if(mine[x][y] == '0')//如果随机数对应的坐标位置是字符‘0’,说明此处没有雷{mine[x][y] = '1';//将该位置写入字符‘1’count++;//已布雷个数自增}}while(count < (a*MINE_NUM));//如果已布雷个数小于关卡数*MINE,继续循环布雷,直到布满a*MINE_NUM个雷为止
} 

    显示坐标的函数:显示坐标的函数根据个人喜好,这里先展示一下这个函数显示的坐标:

void print_board(char board[][COL+2],int row,int col)
{int i = 1;int j = 0;printf("   ");//先输出3个空格for(;i<=COL;i++)printf("%3d",i);//输出列坐标,每3个位置输出对应数字printf("\n");//换行printf("   ");//输出3个空格for(i=0;i<ROW;i++)printf("---");//输出列坐标下面的横线printf("\n");//换行for(i = 1;i<=ROW;i++){printf("%2d|",i);//输出列坐标for(j = 1;j<=COL;j++){printf("%2c|",board[i][j]);//输出对应坐标内容}printf("\n");换行}
}

    下来就是统计对应位置周围雷的个数的函数:这个函数很容易,无非就是将系统布雷数组的对应位置周围8个位置的内容相加,然后将结果返回。

int get_mine_num(char mine[][COL+2],int row,int col,int x,int y)
{int num = 0;num = (mine[x-1][y-1] - '0') + (mine[x-1][y] - '0') + (mine[x-1][y+1] - '0') + (mine[x][y-1] - '0') + (mine[x][y+1] - '0') + (mine[x+1][y-1] - '0') + (mine[x+1][y] - '0') + (mine[x+1][y+1] - '0');return num;
}

    至此,所有工作全部搞定!

下面奉上小编的全部代码:

    头文件部分:

#ifndef _GAME_H_
#define _GAME_H_#include<stdio.h>
#include<stdlib.h>
#include<windows.h>
#include<time.h>
#pragma warning(disable:4996)#define ROW 10
#define COL 10
#define MINE_NUM 20
void game();#endif

    源文件main.c:

#include "game.h"void menu()
{printf("********************\n");printf("********扫雷********\n");printf("** 1.paly  0.exit **\n");printf("********************\n");printf("Please select:");
}
int main()
{int select = 0;do{menu();scanf("%d",&select);switch(select){case 1:game();break;case 0:exit(0);default:printf("Error!please try again!\n");break;}}while(1);system("pause");return 0;
}

    源文件game.c:

#include "game.h"void print_board(char board[][COL+2],int row,int col)
{int i = 1;int j = 0;printf("   ");for(;i<=COL;i++)printf("%3d",i);printf("\n");printf("   ");for(i=0;i<ROW;i++)printf("---");printf("\n");for(i = 1;i<=ROW;i++){printf("%2d|",i);for(j = 1;j<=COL;j++){printf("%2c|",board[i][j]);}printf("\n");}
}
void lay_mines(char mine[][COL+2],int row,int col,int a)
{int x;int y;int count = 0;srand((unsigned long)time(NULL));do{x = (rand() % (ROW))+1;y = (rand() % (COL))+1;if(mine[x][y] == '0'){mine[x][y] = '1';count++;}}while(count < (a*MINE_NUM));
} 
int get_mine_num(char mine[][COL+2],int row,int col,int x,int y)
{int num = 0;num = (mine[x-1][y-1] - '0') + (mine[x-1][y] - '0') + (mine[x-1][y+1] - '0') + (mine[x][y-1] - '0') + (mine[x][y+1] - '0') + (mine[x+1][y-1] - '0') + (mine[x+1][y] - '0') + (mine[x+1][y+1] - '0');return num;
}void game()
{int i = 1;int x,y;int win = 0;do{char mine[ROW+2][COL+2];char show[ROW+2][COL+2];memset(mine,'0',(ROW+2)*(COL+2));memset(show,'*',(ROW+2)*(COL+2));printf("第%d关\n",i);lay_mines(mine,ROW+2,COL+2,i);do{system("cls"); print_board(show,ROW+2,COL+2);printf("Please input your coordinate:<x,y>");scanf("%d%d",&x,&y);if(x>=1&&x<=10&&y>=1&&y<=10){if(mine[x][y] == '1'){printf("It's too bad!Game over!\n");print_board(mine,ROW+2,COL+2);goto END;}else{	int count = get_mine_num(mine,ROW+2,COL+2,x,y);show[x][y] = count + '0';win++;if(ROW*COL-i*MINE_NUM == win){printf("Congratulations!You win!\n");i++;break;}}}}while(1);		}while(i<=4);
END:printf("Do you want to play again?\n");
}

    后面再来一张程序运行的结果:


    至此,全部结束!感谢您的越来,如果有什么问题或者宝贵意见,请下面评论留言,第一时间回复给你呦!!!

http://chatgpt.dhexx.cn/article/qnx1ub1t.shtml

相关文章

(C语言)用C语言编写小游戏——三子棋

目录 三子棋效果展示 三子棋的功能实现 1、初始化棋盘格 2、打印棋盘 3、玩家下棋 4、电脑下棋 5、判断输赢&#xff08;玩家赢/电脑赢/平局&#xff09; 完整代码展示 三子棋小游戏的代码实现分为三个文件&#xff0c;test.c&#xff08;测试游戏功能&#xff09;、ga…

c语言编写的小游戏(c语言编写小游戏入门)

C语言编写是要注意什么&#xff1f; 因此&#xff0c;在编写选择语句之前&#xff0c;应该首先明确判断条件是什么&#xff0c;并确定当判断结果为“真”或“假”时应分别执行什么样的操作(算法) c语言编写小游戏请提供俄罗斯方块&#xff0c;坦克大战之类的小游戏的程序的c 应…

(C语言)用C语言编写小游戏——扫雷

目录 扫雷效果展示 扫雷的功能实现 1、初始化棋盘格 2、 打印棋盘 3、布置雷 4、排查雷 完整代码展示 扫雷小游戏的代码实现分为三个文件&#xff0c;test.c&#xff08;测试游戏功能&#xff09;、game.h&#xff08;头文件的包含和函数的声明&#xff09;、game.c&…

详解5个C语言简单易懂小游戏

文章目录 前言一、准备工作二、游戏菜单三、游戏内容1.猜数字2.三子棋3.扫雷4.五子棋5.飞行棋 总结 前言 我们通过5个简单易懂的小游戏来加强我们对C语言的认识&#xff0c;这五个小游戏不仅有单人&#xff0c;还有人机对战和人人对战。让我们在学习之余来上一局紧张刺激的小游…

C语言趣味小游戏——扫雷(详解版)

前言 ​ 全篇无任何废话&#xff0c;本文的解释大多数都在代码段中&#xff0c;所以一定要看代码&#xff0c;边看边学边理解。 这只是初学者入门的一个小游戏&#xff0c;不难懂&#xff0c;没有什么复杂的内容 可以先学习一下比扫雷还简单的猜数字和三子棋 C语言趣味小游戏—…

C语言小程序游戏

c语言小程序游戏 ​ 本代码是我大一刚学完c语言自己编写的&#xff0c;三个游戏分别是飞机竞速、走迷宫和魔塔&#xff0c;满满的都是回忆。 1、不可能的任务-飞机竞速 ​ 这种游戏在以前小时候玩的游戏机里面玩过&#xff0c;那时抱着个游戏机一玩就是一下午&#xff0c;如…

C语言简易小游戏

文章目录 前言一、猜数字游戏二、旋转光标三、多个字符从两端移动&#xff0c;向中间汇聚四、恶搞&#xff1a;关机小程序五、闪烁的五彩爱心六、扫雷七、三子棋 前言 本篇博客将带领大家自己动手写一下一些C语言小游戏&#xff1b;以增加对于C语言的兴趣&#x1f600;&#x…

c语言成绩管理系统(链表)

C语言实现了学生成绩管理系统&#xff0c;可以进行学生成绩的增加&#xff0c;删除&#xff0c;修改&#xff0c;查询&#xff0c;计算平均成绩和展示。 开发语言&#xff1a;C语言 开发工具&#xff1a;Dev c 开发者&#xff1a;呵呵up 创建学生成绩信息 2. 插入学生信息 3.…

C语言实现学生成绩管理系统设计

本系统有增加学生记录、修改学生记录、删除学生记录、按姓名查询学生记录、按C语言成绩对学生进行排序、退出系统6大功能。 能够对学生的姓名&#xff0c;学号&#xff0c;c语言成绩做相应的操作。 在检测到输入成绩大于55时&#xff0c;会自动加上5。 该管理系统设计功能模块…

c语言成绩管理系统常见错误,求教 学生成绩管理系统出错

已结贴√ 问题点数:20 回复次数:5 求教 学生成绩管理系统出错 小弟刚做了个学生成绩管理系统 编译无错误 但是运行的时候连选择函数都不能 特来求教 望高手解释 代码如下: #include #include #define N 20 #define M 100 struct score {int scr1; int scr2; int scr…

c语言课程设计 学生成绩管理系统

学生成绩管理系统要求&#xff1a; 1、系统功能以菜单方式工作&#xff1b; 2、数据的输入&#xff1b; 3、数据的插入&#xff1b; 4、数据的输出&#xff1b; 5、数据的删除&#xff1b; 6、数据的查找&#xff0c;通常以两种方式进行查找&#xff0c;如姓名、学号&#xff1…

C语言学生成绩管理系统详解

文章目录 一、系统概述二、数据类型三、自定义函数说明四、运行界面五、源代码 源代码请直接跳到最后 引言&#xff1a;最近写了C语言的大作业&#xff0c;感觉做得还行&#xff0c;记录一下&#xff0c;给后人一些参考&#xff0c;给自己留更深印象方便后续改进&#xff01; …

学生成绩管理系统 C语言

基础篇问题&#xff1a; 1.输出如下菜单&#xff1a; *********************学生成绩管理系统******************* * 1 成绩录入 2 成绩查询 3 计算平均分 * * 4 计算最高分 5 排名 6 退出 * ******************************…

C语言编程学生成绩管理系统

目录 一、介绍 二、功能 1.录入学生 2.删除学生信息 3.修改学生信息 4.查询学生信息 5.所有学生信息 6.成绩排序 7.退出程序 三、代码 1.主函数 2.头文件 3.函数封装库 一、介绍 利用C语言&#xff0c;运用链表、指针、封装函数等基本知识实现一个学生管理系统。通…

C语言学生成绩管理系统

制作学生成绩管理系统&#xff0c;可以实现以下功能&#xff1a; 每条记录包括&#xff1a;学号、姓名、专业和5门课程的成绩&#xff1b;能够实现添加、删除、修改功能&#xff1b;能够计算某学生的总分和平均分&#xff1b;能按照总分排序输出&#xff1b; 利用C语言的基本…

c语言成绩管理系统

关注微信公众号每日新觉&#xff0c;私聊作者获取提取密码点击下面链接&#xff0c;私聊作者获取提取密码。https://mp.weixin.qq.com/s/QgRQ3YB2JqCvNOGQHQ57rA 作者每日新觉&#xff0c;是一名热爱技术和编程的年轻程序员。他在计算机科学和软件工程领域有着广泛的研究和实践…

c语言成绩管理系统1.0,c语言成绩管理系统完整附源码v1.0 免费版

c语言成绩管理系统拥有和hello word一样的江湖地位&#xff0c;初学C语言的朋友基本都会从管理系统开始入手学习&#xff0c;对于很多大学生来说更是如此&#xff0c;今天为大家带来的这款系统以及源码希望能对大家学习学C语言有所帮助&#xff0c;欢迎下载使用。 C语言介绍 C语…

C语言学生成绩管理系统(综合项目)

1. 这个代码主要实现以下功能&#xff1a; 2. 用到的主要参数有&#xff1a; 1.整型变量int n;用于储存学生人数和之后的循环判断。 2.字符串char name[][];用于储存姓名。 3.浮点型变量float score[];用于储存成绩。 4.长整型变量long ID[Max];用于储存学号。 3.…

【高级语言程序设计】c语言-学生成绩管理系统

c语言期末作业 声明&#xff1a;未经允许&#xff0c;请勿转载 学生成绩管理系统 本系统能够对学生成绩管理功能&#xff0c;包括&#xff1a; 1.对多个学生成绩进行管理&#xff0c;至少10个学生。 2.每个学生至少3门课程。 3.对每个学生大学期间的成绩进行记录。 4.修改学生…

班级成绩管理系统(C语言)

文章目录 一、设计任务与目标二、实现功能三、程序源码四、效果展示 一、设计任务与目标 对一个有N个学生的班级&#xff0c;每个学生有M门课程。该系统实现对班级成绩的录入、显示、修改、排序、保存等操作的管理。 二、实现功能 &#xff08;1&#xff09;本系统采用一个结…