栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

c语言:带计时的扫雷游戏(一)

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

c语言:带计时的扫雷游戏(一)

先上图




可能用的到的头文件

#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;
}

先更到这里。。。
源代码,点赞/评论/收藏后单发

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/649120.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号