问题标题: 哪位神犇能告诉我一下如何读取系统时间和计时?

0
0
已解决
曹灿阳
曹灿阳
初级天翼
初级天翼

@沙宸安 @沙宸安 @沙宸安 
我又有两个关于我的扫雷的问题(我想给我的扫雷添加新的功能):

1. 如何读取系统时间?

2. 如何从某个时刻计时,再从某个时刻停止计时,返回计时的时间?

还有,我的扫雷又双叒叕出了一个bug,我把它清除了:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <string>
#include <cstdlib>
#include <cmath>
#include <ctime>
#include <bits/stdc++.h>
#include <windows.h>
#include <fstream>
#include <iomanip>
#define INF 0x3f3f3f3f
#pragma GCC optimize(3)
using namespace std;
void color(int corcorcor){
	SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),corcorcor+32);
}
const int dir[8][2]={{-1,-1},{-1,0},{-1,1},{0,-1},{0,1},{1,-1},{1,0},{1,1}};
int mmap[40][40],win,lose;
bool vis[40][40],fflag[40][40];
bool pd(int m,int n){
	for(int i=1;i<=m;i++){
		for(int j=1;j<=n;j++){
			if(vis[i][j]==0&&mmap[i][j]!=INF)
				return false;
		}
	}
	return true;
}
bool valid(int x,int y,int m,int n){
	if(x>=1&&x<=m&&y>=1&&y<=n)
		return true;
	return false;
}
void fankai(int x,int y,int m,int n){
	for(int i=0;i<8;i++){
		int nx=x+dir[i][0],ny=y+dir[i][1];
		if(valid(nx,ny,m,n)&&vis[nx][ny]==0){
			if(mmap[nx][ny]!=INF)
				vis[nx][ny]=true;
			if(mmap[nx][ny]==0)
				fankai(nx,ny,m,n);
		}
	}
}
bool saolei_p1(int m,int n){
	memset(vis,0,sizeof(vis));
	memset(fflag,0,sizeof(fflag));
	while(!pd(m,n)){
		system("cls");
		for(int i=1;i<=m;i++){
			for(int j=1;j<=n;j++){
				if(fflag[i][j]){
					color(11);
					cout<<"F ";
				}
				else if(vis[i][j]&&mmap[i][j]!=INF){
					if(mmap[i][j]==0){
						color(13);
					}
					else{
						color(15);
					}
					cout<<mmap[i][j]<<" ";
				}
				else{
					color(12);
					cout<<"? ";
				}
			}
			color(9);
			cout<<left<<setw(2)<<i<<endl;
		}
		color(9);
		for(int j=1;j<=n;j++)
			cout<<left<<setw(2)<<j;
		cout<<"  ←列"<<endl;
		cout<<right<<setw(n*2+2)<<" ↑"<<endl;
		cout<<right<<setw(n*2+2)<<" 行"<<endl;
		Sleep(1000);
		color(14);
		cout<<"输入说明:\n";
		cout<<"先输入两个数,空格隔开,表示你要操作的坐标。\n";
		cout<<"接着,输入一个数,表示操作类型:\n\t1表示翻开,\n\t2表示插旗,\n\t3表示快捷翻开周围的格子(前提是正确插旗)\n\t4表示撤销插旗\n\n\n";
		int xa,xb,caozuo;
		cin>>xa>>xb>>caozuo;
		if(!valid(xa,xb,m,n)||(caozuo<1||caozuo>4)){
			cout<<"输入错误,请重新输入!";
			Sleep(1000);
			system("cls");
			continue;
		}
		if(caozuo==1){
			if(mmap[xa][xb]==INF){
				system("cls");
				cout<<"你踩到地雷了!!!扫雷失败!!!\n这是答案:\n";
				for(int i=1;i<=m;i++){
					for(int j=1;j<=n;j++){
						if(mmap[i][j]==INF){
							color(11);
							cout<<"* ";
						}
						else{
							if(mmap[i][j]==0)
								color(13);
							else
								color(15);
							cout<<mmap[i][j]<<" ";
						}
					}
					cout<<endl;
				}
				color(14);
				system("pause");
				return false;
			}
			vis[xa][xb]=true;
			if(mmap[xa][xb]==0)
				fankai(xa,xb,m,n);
		}
		if(caozuo==2){
			if(vis[xa][xb]){
				cout<<"操作失败!";
				Sleep(1000);
				system("cls");
				continue;
			}
			fflag[xa][xb]=true;
		}
		if(caozuo==3){
			if(!vis[xa][xb]){
				cout<<"操作失败!";
				Sleep(1000);
				system("cls");
				continue;
			}
			int cnt=0,tmp_flag=false;
			for(int i=0;i<8;i++){
				int nx=xa+dir[i][0],ny=xb+dir[i][1];
				if(valid(nx,ny,m,n)&&fflag[nx][ny]){
					cnt++;
					if(mmap[nx][ny]!=INF){
						tmp_flag=true;
					}
				}
			}
			if(cnt!=mmap[xa][xb]){
				cout<<"操作格子周围的雷数不对,请注意。";
				Sleep(1000);
				system("cls");
				continue;
			}
			else if(tmp_flag){
				system("cls");
				cout<<"插旗错误!!!扫雷失败!!!\n这是答案:\n";
				for(int i=1;i<=m;i++){
					for(int j=1;j<=n;j++){
						if(mmap[i][j]==INF){
							color(11);
							cout<<"* ";
						}
						else{
							if(mmap[i][j]==0)
								color(13);
							else
								color(15);
							cout<<mmap[i][j]<<" ";
						}
					}
					cout<<endl;
				}
				color(14);
				system("pause");
				return false;
			}
			else{
				for(int i=0;i<8;i++){
					int nx=xa+dir[i][0],ny=xb+dir[i][1];
					if(valid(nx,ny,m,n)&&mmap[nx][ny]!=INF){
						vis[nx][ny]=true;
						if(mmap[nx][ny]==0){
							fankai(nx,ny,m,n);
						}
					}
				}
			}
		}
		if(caozuo==4){
			if(fflag[xa][xb])
				fflag[xa][xb]=false;
			else{
				cout<<"操作失败!";
				Sleep(1000);
				continue;
			}
		}
		system("cls");
	}
	system("cls");
	cout<<"你完成了扫雷,真厉害!\n这是答案:\n";
	for(int i=1;i<=m;i++){
		for(int j=1;j<=n;j++){
			if(mmap[i][j]==INF){
				color(11);
				cout<<"* ";
			}
			else{
				if(mmap[i][j]==0)
					color(13);
				else
					color(15);
				cout<<mmap[i][j]<<" ";
			}
		}
		cout<<endl;
	}
	color(14);
	system("pause");
	system("cls");
	return true;
}
bool saolei(int m,int n){
	srand(time(NULL));
	memset(mmap,0,sizeof(mmap));
	memset(vis,0,sizeof(vis));
	memset(fflag,0,sizeof(fflag));
	system("cls");
	int cnt_b=m*(n+1)/10+1;
	for(int i=1;i<=cnt_b;i++){
		int x=rand()%m+1,y=rand()%n+1;
		mmap[x][y]=INF;
	}
	cnt_b=0;
	for(int i=1;i<=m;i++){
		for(int j=1;j<=n;j++){
			if(mmap[i][j]==INF){
				cnt_b++;
			}
		}
	}
	for(int i=1;i<=m;i++){
		for(int j=1;j<=n;j++){
			if(mmap[i][j]!=INF){
				for(int k=0;k<8;k++){
					int nx=i+dir[k][0],ny=j+dir[k][1];
					if(valid(nx,ny,m,n)&&mmap[nx][ny]==INF){
						mmap[i][j]++;
					}
				}
			}
		}
	}
	system("cls");
	bool tmp=saolei_p1(m,n);
	system("cls");
	while(tmp==0){
		lose++;
		color(14);
		bool a;
		system("cls");
		cout<<"是否重新开始相同的地图?(1表示是,0表示否)";
		cin>>a;
		if(a){
			cout<<"好的,重新开始。";
			system("cls");
			tmp=saolei_p1(m,n);
		}
		else
			break;
	}
	return tmp;
}
void goto_saolei(){
	system("cls");
	int m,n;
	while(1){
		cout<<"请输入你要玩多少行,多少列的扫雷?\n";
		cin>>m>>n;
		if(!(m>=3&&m<=30&&n>=3&&n<=30)){
			cout<<"输入数据不合理,请重新输入!"<<endl;
			Sleep(1000);
			system("cls");
			continue;
		}
		else{
			break;
		}
	}
	if(saolei(m,n))
		win++;
	system("cls");
}
int main(){
	system("cls");
	color(0);
	system("cls");
	color(14);
	MessageBox(NULL,"欢迎来到扫雷1.2版(更上层楼)!\n特别鸣谢:沙宸安","欢迎",MB_OK);
	MessageBox(NULL,"输入是核对一下,输入的内容不要有字母或者\n其他奇奇怪怪的东西,否则会让程序崩溃!!!","注意!",MB_OK);
	system("cls");
	bool cd;
	cout<<"请问您是否使用上一次的存档???(输入1或0)";
	cin>>cd;
	if(cd){
		cout<<"好的,恢复存档。"<<endl;
		ifstream fin("扫雷.txt");
		fin>>win>>lose;
		fin.close();
		Sleep(1000);
	}
	while(1){
		system("cls");
		cout<<"你要玩什么游戏?\n1. 扫雷\n输入-1退出游戏。\n其余在开发中,敬请期待!";
		int g;
		cin>>g;
		if(g==-1)
			break;
		switch(g){
			case 1:goto_saolei();break;
			default:cout<<"输入错误,请重新输入!";Sleep(1000);continue; 
		}
	}
	system("cls");
	bool bc;
	cout<<"你赢了"<<win<<"局,输了"<<lose<<"局。成功率:";
	printf("%.1f",win*100/(double)(win+lose));
	cout<<"%\n";
	Sleep(1500);
	cout<<"是否保存???(输入1或0)";
	cin>>bc;
	if(bc){
		cout<<"好的,保存后请立即退出。"<<endl;
		ofstream fout("益智游戏大全.txt");
		fout<<win<<" "<<lose;
		fout.close();
		Sleep(1000);
	}
	else{
		system("cls");
		cout<<"再见!!!";
		ofstream fout("扫雷.txt");
		fout<<0<<" "<<0;
		fout.close();
		Sleep(1000);
	}
	return 0;
}

 

曹灿阳在2021-02-17 17:22:16追加了内容

@沙宸安 请问如何把这些字符串转整形???


0
已采纳
沙宸安
沙宸安
高级启示者
高级启示者

我来了!

string getTime()
{
    time_t timep;
    time (&timep);
    char tmp[64];
    strftime(tmp, sizeof(tmp), "系统时间:%Y年%m月%d日 %H时%M分%S秒",localtime(&timep) );
    return tmp;
}

效果:

如果只要时间的话:

strftime(tmp, sizeof(tmp), "%Y%m%d%H%M%S",localtime(&timep) );
头文件:
#include<time.h>

然后将字符串转整型,先记录开始游戏的时间,然后每次获取时间作差,就可以得出用时。

唯一的缺点是:如果你想在游戏中实时获取时间,那是不可能的,因为你又要输入,又要更新输出。

0
曹灿阳
曹灿阳
初级天翼
初级天翼

ding

曹灿阳在2021-02-16 18:42:33追加了内容

ding

0
孔小川
孔小川
初级光能
初级光能

系统时间:

#include <windows.h>
#include <stdio.h> 
using namespace std;
int main()
{
    for(;;){
        system("cls");
        SYSTEMTIME sys; 
        GetLocalTime( &sys ); 
        printf( "%4d/%02d/%02d %02d:%02d:%02d.%03d 星期%1d\n",sys.wYear,sys.wMonth,sys.wDay,sys.wHour,sys.wMinute, sys.wSecond,sys.wMilliseconds,sys.wDayOfWeek); 
        Sleep(1);
    }
}

望采纳

0
暗魄
暗魄
高级守护
高级守护

事实上,如果你的代码功底足够好,完全可以用time函数(dog)

0
0
我要回答