Logo snxx_lvboyuan的博客

博客

老博客

2024-04-09 16:59:05 By snxx_lvboyuan
#include<bits/stdc++.h>//扫雷
#include<windows.h>
#include<conio.h>
#define F(x,y,i) for(int i=x;i<=y;i++)
using namespace std;
const int N=105;
int R,C,L,op;
char mp[N][N],mpt[N][N];
int mpn[N][N],mpc[N][N];
int c[10]={240,249,242,252,241,244,243,240,248},d[10][4]={{0},{0,1},{1,0},{0,-1},{-1,0},{1,1},{1,-1},{-1,1},{-1,-1}};
int fnum,lnum,nx=1,ny=1;
bool ft[N][N],Lose,first;
HANDLE hout=GetStdHandle(STD_OUTPUT_HANDLE);
COORD coord;
void xy(int x,int y){//光标定位 
    coord.X=y,coord.Y=x;
    SetConsoleCursorPosition(hout,coord);
}
void hide(){//隐藏光标 
    CONSOLE_CURSOR_INFO cursor_info={20,0};
    SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE),&cursor_info);
}
void color(int c){SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),c);}//设置颜色 
void T(int x){//时间 
    int a=clock(),b=clock();
    while(b-a<x)b=clock();
}
void game();//开始游戏
void make(){//生成随机地图 
    F(1,R,i)F(1,C,j)mp[i][j]='#';
    F(1,L,i){
        int x=rand()%R+1,y=rand()%C+1;
        while(mp[x][y]=='O')x=rand()%R+1,y=rand()%C+1;
        mp[x][y]='O';
    }
    F(1,R,i)F(1,C,j){
        if(mp[i][j]=='O')mpn[i][j]=-1,mpc[i][j]=240;
        else{
            mpn[i][j]=0;F(1,8,k)if(mp[i+d[k][0]][j+d[k][1]]=='O')mpn[i][j]++;
            mpc[i][j]=c[mpn[i][j]];
        }
    }
    F(1,R,i)F(1,C,j)if(!mpc[i][j])mpc[i][j]=240;
}
void start(){//初始化 
    system("color F0"),srand(time(0)),color(242),hide();
    printf(
    "-----------------------\n"
    "|        扫 雷        |\n"
    "|    wasd:选择位置    |\n"
    "|      空格:打开      |\n"
    "| 1键:试探周围8个方块 |\n"
    "|  f键:放置/取消小旗  |\n"
    "-----------------------\n"
    );
    printf("1:初级 2:中级 3:高级 4:自定义\n");
    op=getch();
    if(op=='1')R=9,C=9,L=10;
    else if(op=='2')R=16,C=16,L=40;
    else if(op=='3')R=16,C=40,L=99;
    else{
        system("cls");
        printf("请输入行数,列数和雷数 :\n");
        scanf("%d%d%d",&R,&C,&L);
        if(R>50)R=50;if(R<9)R=9;
        if(C>50)C=50;if(C<9)C=9;
        if(L>R*C/3)L=R*C/3;
    }
    lnum=fnum=L;
    system("cls");
    color(249);
    xy(10,0),printf("|"),xy(10,22),printf("|");
    F(1,rand()%5+1,i)F(1,21,j){
        T(50);
        if(j>1)xy(10,j-1),printf(" ");
        else xy(10,21),printf(" ");
        xy(10,j),printf(".");
    }
}
void print(){//打印地图 
    system("cls"),color(240);
    F(1,R,i){
        xy(i,1);
        F(1,C,j)printf("#"),mpt[i][j]='#';
    }
    xy(nx,ny),printf("@");
}
bool win(){//判断是否胜利 
    int cnt=0;
    F(1,R,i)F(1,C,j)if(mp[i][j]=='#'&&mpn[i][j]==-1)cnt++;
    if(cnt==lnum)return 1;
    F(1,R,i)F(1,C,j)if((mpt[i][j]!='F'&&mpn[i][j]==-1)||(mpt[i][j]=='F'&&mpn[i][j]!=-1))return 0;
    return 1;
}
bool check(int x,int y){return x>=1&&x<=R&&y>=1&&y<=C;}//判断坐标 
void dfs(int x,int y){//深搜打开方块 
    if(mpn[x][y]>0){
        xy(x,y),color(mpc[x][y]),printf("%d",mpn[x][y]);
        mpt[x][y]=mpn[x][y]+'0';
        return;
    }
    xy(x,y);color(255);
    mpt[x][y]=' ';printf(" ");
    F(1,8,i){
        nx=x+d[i][0],ny=y+d[i][1];
        if(check(nx,ny)&&mpt[nx][ny]=='#'&&mpn[nx][ny]!=-1)dfs(nx,ny);
    }
}
void flag(int x,int y){//放置/取消小旗
    if(mpt[x][y]=='F'){
        mpt[x][y]='#';mpc[x][y]=240;
        xy(x,y),color(240),printf("#");
        fnum++;
    }
    else if(mpt[x][y]!=' '){
        ft[x][y]=mpn[x][y]==-1;
        mpt[x][y]='F';mpc[x][y]=253;
        xy(x,y),color(253),printf("F");
        fnum--;
    }
}
void st(int x,int y){//试探周围8个方块
    if(mpt[x][y]<'1'||mpt[x][y]>'8')return;
    F(1,8,i){
        int xx=x+d[i][0],yy=y+d[i][1];
        if(check(xx,yy))
            if(mpt[xx][yy]=='F'&&mpn[xx][yy]!=-1){
                Lose=1;
                return;
            }
    }
    F(1,8,i){
        int xx=x+d[i][0],yy=y+d[i][1];
        if(check(xx,yy))
            if(mpn[xx][yy]==-1&&mpt[xx][yy]!='F')return;
    }
    F(1,8,i){
        int xx=x+d[i][0],yy=y+d[i][1];
        if(check(xx,yy)&&mpt[xx][yy]=='#')dfs(xx,yy);
    }
}
void begin(){//各种操作 
    xy(R+1,1),color(240),printf("剩余小旗数:%d ",fnum);
    char ch=getch();
    color(240);
    if(ch=='w'&&check(nx-1,ny)){
        xy(nx,ny);
        if(mpt[nx][ny]!='#'||mpt[nx][ny]==' ')
            color(mpc[nx][ny]);
        printf("%c",mpt[nx][ny]);
        xy(nx-=1,ny);color(15);printf("@");
    }
    else if(ch=='s'&&check(nx+1,ny)){
        xy(nx,ny);
        if(mpt[nx][ny]!='#'||mpt[nx][ny]==' ')
            color(mpc[nx][ny]);
        printf("%c",mpt[nx][ny]);
        xy(nx+=1,ny);color(15);printf("@");
    }
    else if(ch=='a'&&check(nx,ny-1)){
        xy(nx,ny);
        if(mpt[nx][ny]!='#'||mpt[nx][ny]==' ')
            color(mpc[nx][ny]);
        printf("%c",mpt[nx][ny]);
        xy(nx,ny-=1);color(15);printf("@");
    }
    else if(ch=='d'&&check(nx,ny+1)){
        xy(nx,ny);
        if(mpt[nx][ny]!='#'||mpt[nx][ny]==' ')
            color(mpc[nx][ny]);
        printf("%c",mpt[nx][ny]);
        xy(nx,ny+=1);color(15);printf("@");
    }
    else{
        if(ch==' '&&(!(mpt[nx][ny]<='9'&&mpt[nx][ny]>='0'))&&mpt[nx][ny]!='F'){
            mpc[nx][ny]=c[mpn[nx][ny]];
            if(mpn[nx][ny]==-1){
                if(!first){
                    Lose=1;
                    return;
                }
            }
            if(first&&mpn[nx][ny]!=0){//第一次没点到空白就重新制作地图 
                while(mpn[nx][ny]!=0)make();
                print(),dfs(nx,ny);
            }
            dfs(nx,ny);
            first=0;
        }
        else if(ch=='1'){
               st(nx,ny);
            F(1,8,i){
                int xx=nx+d[i][0],yy=ny+d[i][1];
                if(check(xx,yy)){
                    xy(xx,yy);
                    if(mpt[xx][yy]!='#')color(mpc[xx][yy]);
                    else color(240);
                    printf("%c",mpt[xx][yy]);
                }
            }
        }
        else if(ch=='f'&&(mpt[nx][ny]>'9'||mpt[nx][ny]<'1'))flag(nx,ny);
    }
}
void end(){//游戏失败 
    color(240);
    F(1,R,i){
        xy(i,1);
        F(1,C,j){
            if(mpt[i][j]=='F'&&!ft[i][j])color(252),printf("X");
            else if(mpn[i][j]==-1)color(240),printf("O");
            else if(!mpn[i][j])color(240),printf(" ");
            else color(mpc[i][j]),printf("%d",mpn[i][j]);
        }
    }
    printf("\n\nGAME OVER\n");
}
int main(){
    start(),make(),game();
}
void game(){
    system("cls"),print(),first=1;
    while(1){
        begin();
        if(Lose)end(),system("pause"),exit(0);
        if(win())system("cls"),printf("YOU WIN\n"),system("pause"),exit(0);
    }
}

评论

ljxx_zhuchengyu
good
ljxx_zhuchengyu
广告时间: 编程作业哪家强?小吕同学放光芒!!! 如有作业咨询,请拨打电话热线:110 我们会耐心为你解答