- C++
扫雷游戏
- @ 2025-12-13 11:21:04
#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 条评论
目前还没有评论...