#include<windows.h>
#include<conio.h>
#include<bits/stdc++.h>
using namespace std;
int lei;
int sylei; 
HANDLE hConsole=GetStdHandle(STD_OUTPUT_HANDLE);

void print_0(){
	std::cout<<"    ";
}
void print_1(){
	SetConsoleTextAttribute(hConsole, 3);
}
void print_2(){
	SetConsoleTextAttribute(hConsole, 2);
}
void print_3(){
	SetConsoleTextAttribute(hConsole, 4);
}
void print_4(){
	SetConsoleTextAttribute(hConsole, 1);
}
void print_5(){
	SetConsoleTextAttribute(hConsole, 12);
}
void print_6(){
	SetConsoleTextAttribute(hConsole, 6);
}
void print_7(){
	SetConsoleTextAttribute(hConsole, 15);
}
void print_8(){
	SetConsoleTextAttribute(hConsole, 8);
}
void print_not_open(){
	SetConsoleTextAttribute(hConsole, 7);
	std::cout<<"■   ";
}
void end_print_lei(){
	std::cout<<"*   ";
}
void now_print_lei(){
	SetConsoleTextAttribute(hConsole, 12);
	std::cout<<"*   ";
}
void print_flag(){
	SetConsoleTextAttribute(hConsole, 13);
	std::cout<<"F   ";
}
void clear(int n[12][12]){
	for(int i=0;i<12;i++){
		for(int j=0;j<12;j++){
			n[i][j]=0;
		}
	}
}
void put_lei(int n[12][12]){
    int count=0;
    srand(time(0));
    for(int i=1;i<=10;i++){
        for(int j=1;j<=10;j++){
            n[i][j]=0;
        }
    }
    while(count<lei){
        int i=rand()%10+1;
        int j=rand()%10+1;
        if(n[i][j]==0){
            n[i][j]=1;
            count++;
        }
    }
}
void out(int n[12][12],int isopen[12][12]) {
    for(int i=1;i<=10;i++) {
        for(int j=1;j<=10;j++){
            if(!isopen[i][j]){
            	if(n[i][j]==10){
					SetConsoleTextAttribute(hConsole, 7);
					cout<<"?   "; 
				}
				else{
                	print_not_open();
				}
                continue;
            }
            switch(n[i][j]) {
                case -1:
                    end_print_lei();
                    break;
                case 0:
                    print_0();
                    break;
                case 1:
                    print_1();
                    cout<<std::left<<setw(2)<<"1"<<"  ";
                    break;
                case 2:
                    print_2();
                    cout<<std::left<<setw(2)<<"2"<<"  ";
                    break;
                case 3:
                    print_3();
                    cout<<std::left<<setw(2)<<"3"<<"  ";
                    break;
                case 4:
                    print_4();
                    cout<<std::left<<setw(2)<<"4"<<"  ";
                    break;
                case 5:
                    print_5();
                    cout<<std::left<<setw(2)<<"5"<<"  ";
                    break;
                case 6:
                    print_6();
                    cout<<std::left<<setw(2)<<"6"<<"  ";
                    break;
                case 7:
                    print_7();
                    cout<<std::left<<setw(2)<<"7"<<"  ";
                    break;
                case 8:
                    print_8();
                    cout<<std::left<<setw(2)<<"8"<<"  ";
                    break;
                case 9:
                    print_flag();
                    break;
            }
            SetConsoleTextAttribute(hConsole,7);
        }
        cout<<"\n\n";
    }
    cout<<"输入x y 1翻开x y格\n输入x y 2在x y格插旗\n输入x y 3代表x y格不确定\n\n";
    cout<<"剩余雷数:"<<sylei<<"\n";
}
void r(int n[12][12]){
	for(int i=0;i<=10;i++){
		for(int j=0;j<10;j++){
			cout<<n[i][j]<<' ';
		}
		cout<<"\n";
	}
}
void count_lei(int n[12][12],int n2[12][12]){
    for(int i=1;i<=10;i++){
        for(int j=1;j<=10;j++) {
            n[i][j]=0;
        }
    }
    for(int i=1;i<=10;i++){
        for(int j=1;j<=10;j++){
            if(n2[i][j]==1) {
                n[i][j]=-1;
                continue;
            }
            int count=0;
            for(int dx=-1;dx<=1;dx++){
                for(int dy=-1;dy<=1;dy++){
                    if(dx==0&&dy==0)continue;
                    int ni=i+dx;
                    int nj=j+dy;
                    if(ni>=1&&ni<=10&&nj>=1&&nj<=10) {
                        count+=n2[ni][nj];
                    }
                }
            }
            n[i][j]=count;
        }
    }
}
bool f=1;
bool full(int x[12][12]){
	for(int i=1;i<=10;i++){
		for(int j=1;j<=10;j++){
			if(x[i][j]==0){
				return 0;
			}
		}
	}
	return 1;
}
void saolei(int n[12][12],int isopen[12][12],int n2[12][12]){
	while(1){
		system("cls");
		out(n,isopen);
		int x,y,z;
		if(full(isopen)&&sylei==0){
			return;
		}
		cin>>x>>y>>z;
		if(z==2){
			if(n[x][y]!=9){
				sylei--;
			}
			n[x][y]=9;
			isopen[x][y]=1;
		}
		else if(z==3){
			if(n[x][y]==9){
				isopen[x][y]=0;
				sylei++;
			}
			n[x][y]=10;
		}
		
		else if(z==1){
			if(n[x][y]==-1){
				system("cls");
				for(int i=1;i<=10;i++){
					for(int j=0;j<=10;j++){
						isopen[i][j]=1;
					} 
				}
				f=0;
				out(n,isopen);
				cout<<"\n你输了!";
				return;
			}
			else if(n[x][y]==9){
				sylei++;
			}
			isopen[x][y]=1;
            if(n2[x][y]==1){
                n[x][y]=-1;
                continue;
            }
            int count=0;
            for(int dx=-1;dx<=1;dx++){
                for(int dy=-1;dy<=1;dy++){
                    if(dx==0&&dy==0)continue;
                    int ni=x+dx;
                    int nj=y+dy;
                    if(ni>=1&&ni<=10&&nj>=1&&nj<=10){
                        count+=n2[ni][nj];
                    }
                }
            }
            n[x][y]=count;
		}
		for(int i=0;i<100;i++){
			for(int j=1;j<=10;j++){
				for(int k=1;k<=10;k++){
					if(n[j][k]==0&&isopen[j][k]==1){
						isopen[j-1][k-1]=1;
						isopen[j-1][k]=1;
						isopen[j-1][k+1]=1;
						isopen[j][k-1]=1;
						isopen[j][k+1]=1;
						isopen[j+1][k-1]=1;
						isopen[j+1][k]=1;
						isopen[j+1][k+1]=1;
					}
				}
			}
		}
	}
	
}
int main(){
	CONSOLE_CURSOR_INFO cursor_info={1,0};
	SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE),&cursor_info);
	srand(time(0));
	int n[12][12],n2[12][12],isopen[12][12];
	cout<<"\n\n\n\n\n\n\n\n\n\n\n\n\t\t\t\t\t\t  欢迎来到扫雷!!!";
	getch();
	system("cls");
	cout<<"请输入难度:1.新手(10个雷)    2.初学(12个雷)    3.高手(15个雷)    4.专家(20个雷)    5.自定义:";
	int dif;
	cin>>dif;
	dif=min(5,dif);
	dif=max(1,dif);
	int Lei[4]={10,12,15,20};
	if(dif==5){
		cout<<"请输入雷数:(10~20):";
		cin>>lei;
		lei=min(20,lei);
		lei=max(10,lei);
	}
	else{
		lei=Lei[dif-1];
	}
	system("cls");
	sylei=lei;
	clear(n);
	clear(n2);
	clear(isopen);
	put_lei(n2);
	count_lei(n,n2);
	clock_t start=clock();
	saolei(n,isopen,n2);
	clock_t end=clock();
	if(f){
		system("cls");
		out(n,isopen);
		cout<<"\n你完成了扫雷!\n用时:"<<double(end-start)/CLOCKS_PER_SEC<<"秒";
	}
	SetConsoleTextAttribute(hConsole, 0);
	return 0;
}

0 条评论

目前还没有评论...