可能用的到的头文件
#include#include #include #include #include #include #include #include #include "time.h" using namespace std; #define NUM_THREADS 1
全局变量:
int saolei_able[100][100]={0}; //底层地图
char saolei_enable[100][100];//上层地图
int leave_number=0;//剩下的未扫区域
int grade=0;//成绩
int game=0;//开始游戏时,判断是否停止计时退出线程(1为停止,退出线程)
int width=10;//地图行(默认为10)
int height=10;//地图列(默认为10)
int dilei_qty=20;//地雷数量(默认为20)
主菜单
主菜单有4个选项,开始游戏,游戏排行,游戏设置,退出游戏
开始游戏有计时,判断游戏胜利,判断游戏失败,排行榜写入等功能
游戏排行只有读取显示排行的功能
游戏设置可以自定义地雷数量,地图大小
主菜代码:menu()
system(“cls”); 清屏作用
void menu(){
system("cls");
printf("************菜单************nn");
printf(" 1.开始游戏n");
printf(" 2.游戏排名n");
printf(" 3.游戏设置n");
printf(" 4.退出游戏nn");
printf("****************************nn");
int n;
printf("菜单操作:");
scanf("%d",&n);
switch(n){
case 1:
start_game();
system("cls");
break;
case 2:
system("cls");
read_rank();
break;
case 3:
setting_game();
break;
case 4:
system("cls");
printf("game over!");
break;
default:
break;
}
}
开始游戏:start_game()
init_saolei() 上层地图初始化,*为不可见。
数组变量saolei_able是底层地图
数组变量saolei_enable是上层地图
dilei_number() 设置底层地图地雷数量
blank_number() 点击的坐标的周围没有地雷的时候自动翻起周围一圈
refresh_window() 动画刷新界面
times() 线程计时
void start_game(){
int index=0,row,column;
init_saolei();
while(index=width|| b>=height || saolei_enable[a][b]!='*'){
scanf("%d %d",&a,&b);
}
leave_number++;
if(saolei_able[a][b]!=-1)
saolei_enable[a][b]=saolei_able[a][b]+48;
else
saolei_enable[a][b]=35;
if(saolei_able[a][b]==0){
blank_number(a,b);
}
if(saolei_able[a][b]==-1){
refresh_window();
char name[10];
printf("You Lose!n");
printf("Game Over!n");
printf("1.返回菜单t2.退出游戏n");
game=1;
scanf("%d",&n);
if(n==1){
game=0;
grade=0;
menu();
}
break;
}
if(leave_number==width*height-dilei_qty){
char name[10];
printf("Yow Win!n");
game=1;
printf("输入您的昵称:");
scanf("%s",&name);
write_rank(name,grade-1);
printf("1.返回菜单t2.退出游戏n");
scanf("%d",&n);
if(n==1){
grade=0;
game=0;
system("cls");
menu();
}
break;
}
}
}
上层地图初始化:init_saolei()
void init_saolei(){
for(int i=0;i
初始化地雷数量:dilei_number()
void dilei_number(int a,int b){
if(a-1>=0 && b-1>=0 && saolei_able[a-1][b-1]!=-1)
saolei_able[a-1][b-1]+=1;
if(a-1>=0 && saolei_able[a - 1][b] != -1)
saolei_able[a - 1][b] += 1;
if(a-1>=0 && b+1=0 && saolei_able[a ][b - 1] != -1)
saolei_able[a][b - 1] += 1;
if(b+1=0 && saolei_able[a +1][b - 1] != -1)
saolei_able[a + 1][b - 1] += 1;
if(a+1
自动翻起周围一圈:blank_number()
void blank_number(int a,int b){
if(a - 1 >= 0 && b - 1 >= 0)
if(saolei_enable[a-1][b-1]=='*'){
saolei_enable[a-1][b-1]=saolei_able[a-1][b-1]+48;
leave_number++;
if(saolei_able[a-1][b-1]==0)
blank_number(a-1,b-1);
}
if (a-1>=0)
if(saolei_enable[a-1][b]=='*'){
saolei_enable[a-1][b]=saolei_able[a-1][b]+48;
leave_number++;
if(saolei_able[a-1][b]==0)
blank_number(a-1,b);
}
if(a-1>=0 && b+1=0)
if(saolei_enable[a][b - 1]=='*'){
saolei_enable[a][b - 1] = saolei_able[a][b - 1]+48;
leave_number++;
if(saolei_able[a][b - 1]==0)
blank_number(a, b - 1);
}
if (b+1=0)
if(saolei_enable[a + 1][b - 1]=='*'){
saolei_enable[a + 1][b - 1] = saolei_able[a + 1][b - 1]+48;
leave_number++;
if(saolei_able[a + 1][b - 1]==0)
blank_number(a+1,b-1);
}
if(a+1
刷新界面:refresh_window()
void refresh_window(){
system("cls");
printf("n");
printf(" ");
for(int i=0;i
线程计时:
函数gotoxy(),自定义光标位置,通过光标定位,实现局部刷新
void gotoxy(int a, int b)
{
HANDLE hOutput;
COORD loc;
loc.X =a;
loc.Y=b;
hOutput = GetStdHandle(STD_OUTPUT_HANDLE);
SetConsoleCursorPosition(hOutput, loc);
return;
}
线程函数times()
将计时器定位到0,0的坐标进行计时。
当主函数需要输入时恢复光标位置,实现输入
void* times(void *args){
HANDLE hout = GetStdHandle(STD_OUTPUT_HANDLE);
CONSOLE_SCREEN_BUFFER_INFO pt;
GetConsoleScreenBufferInfo(hout,&pt);
gotoxy(0,0);
gotoxy(pt.dwCursorPosition.X,pt.dwCursorPosition.Y);
while(1){
GetConsoleScreenBufferInfo(hout,&pt);
gotoxy(0,0);
printf("计时:%d",grade++);
gotoxy(pt.dwCursorPosition.X,pt.dwCursorPosition.Y);
if(game==1){
break;
}
Sleep(1000);
}
return 0;
}
先更到这里。。。
源代码,点赞/评论/收藏后单发



