#include<bits/stdc++.h>
using namespace std;
#include<conio.h>
int m=100000;
int jd=1e5,zd=1e5,kn=1e5,cn=1e5;
char select;
string s;
string choiceChar(string s,int len){
	srand(time(NULL));
	string ans="";
	int l=s.size();
	for(int i=1;i<=len;i++){
		int r=rand()%l;
		ans+=s[r];
	}return ans;
}
const string lower="asdfghjklqwertyuiopzxcvbnm",
short_digit="12345",digit="0123456789";
const string c="QWERTYUIOPASDFGHJKLZXCVBNMasdfghjklqwertyuiopzxcvbnm0123456789";
string a[4]={short_digit,digit,lower,c};
struct pas{
	string s;
	int m;
	int cnt; 
};
vector<pas>p;
void open(string s){
	string pass=choiceChar(s,8),input="";
	int cnt=0;
	while(true){
		system("cls");
		if(cnt>=1){
			cout<<"历史记录:";
			for(int i=0;i<p.size();i++) cout<<"第"<<p[i].cnt
			<<"次 输入"<<p[i].s<<" 有"<<p[i].m<<"个字符和密码不一样\n"; 
		}
		cout<<"请猜测密码:";
		cin>>input;
		if(input.size()!=8){
			cout<<"请注意密码长度为8\n";
			system("pause");
			continue;
		}bool flag=false;
		int difcnt=0;
		for(int i=0;i<8;i++){
			if(s.find(input[i])==-1){
				cout<<input[i]<<"不是此模式下的字符。\n";
				flag=true;
				cout<<"本难度的字符有:"<<s<<endl;
				system("pause");
				break;
			}
			if(input[i]!=pass[i])difcnt++;
		}
		if(flag)continue;
		cnt++;
		if(difcnt==0){
			cout<<"恭喜你,猜对啦!!!\n共猜了"<<cnt<<"次。\n";
			switch(select) {
				case '1':
					jd=min(jd,cnt);
					break;
				case '2':
					zd=min(zd,cnt);
					break;
				case '3':
					kn=min(kn,cnt);
					break;
				case '4':
					cn=min(cn,cnt);
					//
			}
			break;
		}else {
			cout<<"您猜测的密码"<<input<<"有"<<difcnt<<"个字符不一样。\n";
			system("pause");
			p.push_back({input,difcnt,cnt});
		}
	}
}
void f(int n){
	if(n==m)cout<<"未开始";
	else cout<<n<<"次猜对"; 
	cout<<endl;
}
void sets(){
	cout<<"设定难度:\n1.简单 2.中等 3.困难 4.超难\n";
	cout<<"\n简单:" <<a[0]<<"\n中等:"<<a[1]
	<<"\n困难:"<<a[2]<<"\n超难:"<<a[3]<<endl;
	cout<<"请选择:";
	
	cin>>select;
	while(select!='1'&&select!='2'&&select!='3'&&select!='4'){
		cout<<"请重新输入:";
		cin>>select;
	}s=a[select-49];
	cout<<"请注意密码长度为8\n";
}
void look(){
	cout<<"简单模式:";f(jd);
	cout<<"中等模式:";f(zd);
	cout<<"困难模式:";f(kn);
	cout<<"超难模式:";f(cn);
}
void start(string s){
	cout<<"1.开始游戏\n2.调整难度\n3.查看记录\n4.游戏规则\n5.退出游戏\n";
	string x="0",pp="12345";
	while(pp.find(x)==-1) x=_getch();
	int n=x[0]-48;
	system("cls");
	switch(n){
		case 1:
			open(s);
			break;
		case 2:
			sets();
			break;
		case 3:
			look();
			break;
		case 4:
			cout<<"本游戏名字叫密码猜猜猜,输入密码后会告诉你有几个字符错了,你按照这样猜对密码就算获胜\n";
			break;
		case 5:
			return ;
	}
	system("pause");
	system("cls");
	start(s);
}
int main(){
	cout<<"本游戏名字叫密码猜猜猜,输入密码后会告诉你有几个字符错了,你按照这样猜对密码就算获胜\n";
	cout<<"设定初始难度:\n1.简单 2.中等 3.困难 4.超难\n";
	cout<<"\n简单:" <<a[0]<<"\n中等:"<<a[1]<<"\n困难:"<<a[2]<<"\n超难:"<<a[3]<<endl;
	cout<<"请选择:";
	
	cin>>select;
	while(select!='1'&&select!='2'&&select!='3'&&select!='4'){
		cout<<"请重新输入:";
		cin>>select;
	}s=a[select-49];
	cout<<"请注意密码长度为8\n";
	system("pause");
	system("cls");
	start(s);
	look();
	return 0;
}