效果预览




下面附代码

#include<stdio.h>
#include<time.h>
#include<stdlib.h>
#include <windows.h>
#include <mmsystem.h>
#pragma comment(lib,"Winmm.lib")
#define Ne 12//定义各种难度下的格子数量及雷的数量
#define Me 15
#define Nm 17
#define Mm 25
#define Nh 22
#define Mh 100typedef struct nt//定义时间结构体
{int Year;int Month;int Day;int Hour;int Minute;}NowTime;typedef struct rk//定义成绩结构体
{char Level;float Score;NowTime Time;}Rank;void InitializationShow(char (*show)[22],int side);//初始化展示面板
void InitializationMines(char (*mines)[22],int side);//初始化雷区
void PrintingBoard(char (*board)[22],int side);//打印面板
void LindMines(char (*mines)[22],int side,int mount);//随机布雷
void Security(char (*mines)[22],int side,int X,int Y);//确保第一次查看区块安全
void Open(char (*show)[22],char (*mines)[22],int side,int X,int Y);//循环展开周围8个区块
void GameMove(char (*show)[22],char (*mines)[22],int side,int mount);//玩家行动模块
void Game(char (*show)[22],char (*mines)[22],int side,int mount);//游戏主程序
void OpenMenu();//开始菜单
void LastMenu();//结尾菜单
void ChangeLevel();//难度转换
void PrintfHistory();//显示历史记录
void ScanfHistory(float t,int mount);//读取成绩录入历史记录文件
int Statistics(char (*mines)[22],int X,int Y);//统计周围8个区块雷的数量
int Calculate(char (*show)[22],int side);//计算剩余为探索区块数量
char ChooseLevel();//选择难度
NowTime GetTime();//获取当前时间void main()
{OpenMenu();
}NowTime GetTime()
{time_t timep;struct tm *p;NowTime TM;time (&timep);p=gmtime(&timep);TM.Year=1900+p->tm_year;TM.Month=1+p->tm_mon;TM.Day=p->tm_mday;TM.Hour=8+p->tm_hour;TM.Minute=p->tm_min;return TM;
}void OpenMenu()
{PlaySound(TEXT("BackGroundMusic.wav"),NULL,SND_FILENAME | SND_ASYNC | SND_LOOP);//播放背景音乐int FLAG;printf("                                           欢迎游玩可选难度扫雷小游戏!\n");printf("\n");printf("                                    游戏介绍:\n");printf("                                    该扫雷小游戏提供简单、中等、困难三种难度。\n");printf("                                    简单难度场地大小10*10,内含15个雷;\n");printf("                                    中等难度场地大小15*15,内含25个雷;\n");printf("                                    困难难度场地大小20*20,内含100个雷。\n");printf("\n");printf("                                    下面请选择开始游戏、退出游戏或查看排行榜:\n");printf("                                         --------------------------\n");printf("                                         |1.准备好了,开始游戏!!|\n");printf("                                         |2.太困难了,放弃游戏!!|\n");printf("                                         |3.   我想看历史记录     |\n");printf("                                         --------------------------\n");do{scanf("%d",&FLAG);getchar();switch (FLAG){case 1:ChangeLevel();break;case 2:exit(0);case 3:PrintfHistory();default:printf("                                    不要逃避,选择吧!!\n");break;}}while(FLAG);}void LastMenu()
{PlaySound(TEXT("BackGroundMusic.wav"),NULL,SND_FILENAME | SND_ASYNC | SND_LOOP);int FLAG;printf("                                         --------------------------\n");printf("                                         |1.      返回主菜单      |\n");printf("                                         |2.      查看历史记录    |\n");printf("                                         |3.      退出游戏吧      |\n");printf("                                         --------------------------\n");do{scanf("%d",&FLAG);getchar();switch (FLAG){case 1:OpenMenu();case 2:PrintfHistory();case 3:exit(0);default:printf("                                    不要乱输,快点选吧!!\n");break;}}while(FLAG);
}void ChangeLevel()
{PlaySound(TEXT("GamingMusic.wav"),NULL,SND_FILENAME | SND_ASYNC | SND_LOOP);char ShowBoard[22][22],MinesBoard[22][22];char LEVEL;LEVEL=ChooseLevel();if(LEVEL=='E'||LEVEL=='e'){Game(ShowBoard,MinesBoard,Ne,Me);}else if(LEVEL=='M'||LEVEL=='m'){Game(ShowBoard,MinesBoard,Nm,Mm);}else if(LEVEL=='H'||LEVEL=='h'){Game(ShowBoard,MinesBoard,Nh,Mh);}
}char ChooseLevel()
{char LEVEL;printf("                                    请选择你想游玩的难度(简单:E(e)/中等:M(m)/困难:H(h)):");for(;;){scanf("%c",&LEVEL);getchar();if(LEVEL=='H'||LEVEL=='M'||LEVEL=='E'||LEVEL=='h'||LEVEL=='m'||LEVEL=='e')break;else{printf("                                    请按照正确的格式输入难度:");}}return LEVEL;
}void Game(char (*show)[22],char (*mines)[22],int side,int mount)
{InitializationShow(show,side);InitializationMines(mines,side);printf("                                    场地面积为%d*%d,场上一共有%d个雷,小心了!!\n",side-2,side-2,mount);PrintingBoard(show,side);LindMines(mines,side,mount);GameMove(show,mines,side,mount);
}void InitializationShow(char (*show)[22],int side)
{int i,j;for(i=1;i<side-1;i++){for(j=1;j<side-1;j++)show[i][j]='*';}for(i=0,j=0;i<side;i++)//用“X”填充周围,便于测试和调试show[i][j]='X';for(i=0,j=0;j<side;j++)show[i][j]='X';for(i=side-1,j=0;j<side;j++)show[i][j]='X';for(i=0,j=side-1;i<side;i++)show[i][j]='X';
}void InitializationMines(char (*mines)[22],int side)
{int i,j;for(i=1;i<side-1;i++){for(j=1;j<side-1;j++)mines[i][j]='0';}for(i=0,j=0;i<side;i++)//用“X”填充周围,便于测试和调试mines[i][j]='X';for(i=0,j=0;j<side;j++)mines[i][j]='X';for(i=side-1,j=0;j<side;j++)mines[i][j]='X';for(i=0,j=side-1;i<side;i++)mines[i][j]='X';
}void PrintingBoard(char (*board)[22],int side)
{int i=0,j=0,k=0;printf("                                 %2d |",0);for(i=1;i<side-1;i++){printf("%2d |",i);//打印行数}printf("\n");printf("                                 ");for(i=0;i<side;i++)printf("----");printf("\n");for(i=1;i<side-1;i++){printf("                                 %2d |",i);//打印列数for(j=1;j<side-1;j++){printf(" %c |",board[i][j]);}printf("%2d |",i);printf("\n");printf("                                 ");for(k=0;k<side;k++)printf("----");printf("\n");}
}void LindMines(char (*mines)[22],int side,int mount)
{int x=0,y=0,COUNT;COUNT=mount;srand((int)time(NULL));//随机种子保证每次布雷不同while(COUNT){int x=rand()%(side-2)+1;int y=rand()%(side-2)+1;if(mines[x][y]=='0'){mines[x][y]='1';COUNT--;}}
}void Security(char (*mines)[22],int side,int X,int Y)
{if(mines[X][Y]=='1'){int x=0,y=0,COUNT=1;srand((int)time(NULL));while(COUNT){int x=rand()%(side-2)+1;int y=rand()%(side-2)+1;if(mines[x][y]=='0'){mines[x][y]='1';COUNT--;}}mines[X][Y]=='0';}
}void Open(char (*show)[22],char (*mines)[22],int side,int X,int Y)
{int Mine=0;Mine=Statistics(mines,X,Y);if(Mine==0){show[X][Y]=' ';if (X-1>0&&Y>0&&show[X-1][Y]=='*')Open(show,mines,side,X-1,Y);//反复展开直到不能展开为止if (X-1>0&&Y+1<side-1&&show[X-1][Y+1]=='*')Open(show,mines,side,X-1,Y+1);if (X>0&&Y+1<side-1&&show[X][Y+1]=='*')Open(show,mines,side,X,Y+1);if (X+1<10&&Y+1<side-1&&show[X+1][Y+1]=='*')Open(show,mines,side,X+1,Y+1);if (X+1<side-1&&Y>0&&show[X+1][Y]=='*')Open(show,mines,side,X+1,Y);if (X+1<side-1&&Y-1>0&&show[X+1][Y-1]=='*')Open(show,mines,side,X+1,Y-1);if (X>0&&Y-1>0&&show[X][Y-1]=='*')Open(show,mines,side,X,Y-1);if (X-1>0&&Y-1>0&&show[X-1][Y-1]=='*')Open(show,mines,side,X-1,Y-1);}else{show[X][Y]=Statistics(mines,X,Y)+'0';}
}int Statistics(char (*mines)[22],int X,int Y)
{int COUNT=0;if(mines[X-1][Y]=='1')COUNT++;if(mines[X-1][Y-1]=='1')COUNT++;if(mines[X-1][Y+1]=='1')COUNT++;if(mines[X][Y+1]=='1')COUNT++;if(mines[X][Y-1]=='1')COUNT++;if(mines[X+1][Y]=='1')COUNT++;if(mines[X+1][Y-1]=='1')COUNT++;if(mines[X+1][Y+1]=='1')COUNT++;return COUNT;
}int Calculate(char (*show)[22],int side)
{int i,j,COUNT=0;for(i=1;i<side-1;i++){for(j=1;j<side-1;j++){if(show[i][j]=='*')COUNT++;}}return COUNT;
}void GameMove(char (*show)[22],char (*mines)[22],int side,int mount)
{int X,Y;float time;clock_t start,end;//计时for(;;)//第一次查看同时确保第一次绝对安全{printf("                                    请输入你想查看的坐标(X,Y):");scanf("%d,%d",&X,&Y);start=clock();getchar();if(X>=1&&X<=(side-2)&&Y>=1&&Y<=(side-2))break;elseprintf("                                    请按照格式输入正确的坐标!!");}printf("\a");Security(mines,side,X,Y);Open(show,mines,side,X,Y);PrintingBoard(show,side);printf("                                    当前已点亮%d个区块,剩余%d个区块,加油!!\n",(side-2)*(side-2)-Calculate(show,side),Calculate(show,side)-mount);for(;;){printf("                                    请输入请输入你想查看的坐标(X,Y):");scanf("%d,%d",&X,&Y);getchar();if(show[X][Y]!='*'){printf("                                    这个区块已经被点亮了哟!!\n");continue;}if(X>=1&&X<=side-2&&Y>=1&&Y<=side-2){if(mines[X][Y]=='1'){end=clock();PrintingBoard(mines,side);printf("                                    BOOM!!!\n你踩到雷了!!用时%f秒!!\n",((double)end-start)/CLK_TCK);PlaySound(TEXT("BoomMusic.wav"),NULL,SND_FILENAME | SND_ASYNC | SND_LOOP);system("pause");printf("\n");LastMenu();}else if(mines[X][Y]=='0'){printf("\a");Open(show,mines,side,X,Y);PrintingBoard(show,side);if(Calculate(show,side)==mount){end=clock();PrintingBoard(mines,side);time=((double)end-start)/CLK_TCK;printf("                                    扫雷成功!!用时%f秒!!\n",time);ScanfHistory(time,mount);printf("\n");LastMenu();}elseprintf("                                    当前已点亮%d个区块,剩余%d个区块,加油!!\n",(side-2)*(side-2)-Calculate(show,side),Calculate(show,side)-mount);}}else{printf("                                    请按照格式输入正确的坐标!!");}}
}void ScanfHistory(float t,int mount)
{Rank R1;R1.Time=GetTime();R1.Score=t;FILE *fp;if(mount==Me)R1.Level='E';else if(mount==Mm)R1.Level='M';else if(mount==Mh)R1.Level=='H';fp=fopen("History.txt","a");fprintf(fp,"%c  %f  %d\\%d\\%d %d:%d\n", R1.Level, R1.Score, R1.Time.Year,R1.Time.Month,R1.Time.Day,R1.Time.Hour,R1.Time.Minute);fclose(fp);
}void PrintfHistory()
{Rank R2[1000],temp;int N,i,j,p1=0,p2=0,p3=0;FILE *fp;char x,A[1000];fp=fopen("History.txt","r");while (!feof(fp)){x=fgetc(fp);if (x=='\n')N++;}rewind(fp);Rank *Out=NULL;Out=(Rank*)malloc(sizeof(Rank)*(N+1));for (i=0;i<N;i++){fgets(A,1000,fp);sscanf(A,"%c  %f  %d\\%d\\%d %d:%d\n", &Out[i].Level, &Out[i].Score, &Out[i].Time.Year,&Out[i].Time.Month,&Out[i].Time.Day,&Out[i].Time.Hour,&Out[i].Time.Minute);}fclose(fp);for(i=0;i<N;i++){for(j=i+1;j<N;j++){if(Out[i].Score>Out[j].Score){temp=Out[i];Out[i]=Out[j];Out[j]=temp;}}}printf("                                         简单难度历史记录为:\n\n");printf("                                   排名  成绩          时间\n\n");for(i=0;i<10;i++){if(Out[i].Level=='E'){p1++;printf("                                    ");printf("%d  %f  %d\\%d\\%d %d:%d\n", p1, Out[i].Score, Out[i].Time.Year,Out[i].Time.Month,Out[i].Time.Day,Out[i].Time.Hour,Out[i].Time.Minute);}}printf("\n");printf("                                         中等难度历史记录为:\n\n");printf("                                   排名  成绩          时间\n\n");for(i=0;i<10;i++){if(Out[i].Level=='M'){p2++;printf("                                    ");printf("%d  %f  %d\\%d\\%d %d:%d\n", p2, Out[i].Score, Out[i].Time.Year,Out[i].Time.Month,Out[i].Time.Day,Out[i].Time.Hour,Out[i].Time.Minute);}}printf("\n");printf("                                         困难难度历史记录为:\n\n");printf("                                   排名  成绩          时间\n\n");for(i=0;i<10;i++){if(Out[i].Level=='H'){p3++;printf("                                    ");printf("%d  %f  %d\\%d\\%d %d:%d\n", p3, Out[i].Score, Out[i].Time.Year,Out[i].Time.Month,Out[i].Time.Day,Out[i].Time.Hour,Out[i].Time.Minute);}}LastMenu();
}

C语言扫雷小游戏(可选难度,可记录历史成绩)相关推荐

  1. C/C++语言扫雷小游戏(eaxyX图形库的应用)

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言 一.扫雷的玩法,以及实现功能介绍 二.代码实现 1.引入库 2.宏定义部分 3.初始化游戏界面 4.加载图片 5.绘制 ...

  2. 用c语言实现扫雷小游戏。

    相信小伙伴在学习c语言的时候想做一些小趣事,下面就是用c语言来实现一个扫雷小游戏,不过是简单的实现扫雷(只是通过数组的方式来实现),适合新手学习. 我用的是vs敲的这个代码,大家可以用vs运行(可能有 ...

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

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

  4. C语言实现扫雷小游戏(排雷时可展开)

    游戏介绍 扫雷想必大家都听说过吧?我们今天写的小游戏就是扫雷,只不过我们只使用C语言写.我们能够做到的就是实现扫雷的基本逻辑,没有图形化界面. 源代码 这次游戏程序的写法和上一次的三子棋的模式很像,也 ...

  5. 【C语言】扫雷小游戏详解

    [C语言]扫雷小游戏详解 前言: 还记得大明湖畔的夏雨荷,电脑课上的扫雷吗? ---------------------------是 他 吗--------------------------- 没 ...

  6. 使用C语言写一个扫雷小游戏

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

  7. 用C语言实现一个简单的扫雷小游戏(附全代码及教程)

    本文实例为大家分享了C语言实现扫雷游戏的具体代码,供大家参考,具体内容如下: 首先,创建一个text.c文件: 编写主函数: int main() {test();return 0; } 定义test ...

  8. C语言实现扫雷小游戏 纯小白 非黑窗口

    C语言实现一个普通的扫雷小游戏 纯小白所编(含代码非黑窗口!) 扫雷 主要功能 1.创建一个图形界面 2.了解扫雷游戏的原理 3.随机生成雷的位置 4.为整个数组加密,并在雷周围的位置加一 5.导入图 ...

  9. C语言简单的键盘玩扫雷小游戏(完结)

    1:这次我们会将前面的代码进行整合,和整理,最终使我们的程序可以有效的运行起来. [1]初始化函数. void GameInit() {     //随机数种子     srand((unsigned ...

最新文章

  1. 213. House Robber II
  2. OpenCV的HOG+SVM训练程序注意事项
  3. c语言 判断链表之中是否有环,判断单链表中是否存在环(网上说的笔试题)
  4. 如何快速实现 Wordpress 博客域名更换?
  5. 使用工具类实现通用分页处理
  6. python基础数据类型的相关知识点
  7. java 泛型 加_Java泛型并将数字加在一起
  8. 【算法】八大排序算法的时间复杂度 表格
  9. 用GZIP来压缩socket传输的序列化的类
  10. PAT甲级1022 map、set的使用
  11. JavaScript 开发者经常忽略或误用的七个基础知识点
  12. 通达信 移动平均算法_【通达信指标】通达信主力偷偷建仓副图指标源码公式...
  13. win10添加组策略命令
  14. 微信小程序框架主体快速开发教程
  15. 如何做好数据分析的数据采集工作?
  16. 人工智能是从什么时候开始发展的?AI的起源
  17. 超出部分隐藏以省略号表示
  18. IOS 编程初体验 第一篇:自学和培训的选择
  19. 蓝湖 Axure 墨刀
  20. 计算机对体育专业就业前景,体育教育就业方向及就业前景分析

热门文章

  1. 论文阅读:LIF-Seg: LiDAR and Camera Image Fusion for 3DLiDAR Semantic Segmentation
  2. unoin all 和union 区别
  3. IE 插件 Trixie 介绍
  4. linux快速杀死某个用户的全部进程
  5. nachos-java Task1.4 Communicator
  6. 机房ping监控 smokeping+prometheus+grafana(续) 自动获取各省省会可用IP
  7. 【直流传动与控制系统】第12周CDIO工作报告
  8. 地图投影技术剖析与思考
  9. python copy函数例子,Python中的拷贝详解
  10. 9.24吉比特测试工程师