问题标题: mazecraft2.0

0
0
凌夏
凌夏
中级守护
中级守护

正式更名为mazecraft

当前功能:wasd移动,撞墙自动挖墙

宝箱(‘=’)需要钥匙(‘-’)打开

矿物:

煤矿(C)需要挖8下

铁矿(I)需要挖15下

金矿(G)需要挖30下

钻石矿(D)需要挖40下

预告:3.0加入物品掉落与背包

#include<iostream>
#include<cstdlib>
#include<ctime>
#include<stack>
#include<map>
#include<queue>
#include<windows.h>
#include<conio.h>
using namespace std;

struct node_start{
    int tx,ty,way;
};
struct node_dir{
    int dx,dy;
};
char a[5200][5200];
int cnt[5200][5200];//挖掘状态 
int dir[4][2]={{1,0},{0,1},{-1,0},{0,-1}},x,y;
int lx,ly,rx,ry,count;
char wmp;
bool vis[5200][5200],vistart[5200][5200],viscase[5200][5200],opencase[5200][5200];
node_dir findkey[5200][5200];
stack<node_start> s;
queue<node_dir> q; 
void start(int len,int cx,int cy){
    int x,y,w,k,nx,ny;
    srand((unsigned int)time(NULL));
    // 初始化
    s.push({cx,cy,-1});
    vis[cx][cy]=true;
    a[cx][cy]=' ';
    int step=0;
    int max_step=len; // 控制线条总长度
    while(!s.empty() && step<max_step){
        node_start u=s.top();
        x=u.tx;
        y=u.ty;
        w=u.way;

        //寻找一个未访问的方向 
        bool found=false;
        int tmp=0;

        // 随机尝试序列 
        int dirs[4]={0,1,2,3};
        for(int i=0;i<4;i++){
            int r=rand()%4;
            swap(dirs[i],dirs[r]);
        }

        for(int i=0;i<4;i++){
            k=dirs[i];
            // 避免直接回头
            if(w!=-1 && k==(w+2)%4) continue; 

            nx=x+dir[k][0];
            ny=y+dir[k][1];

            if(nx>1 && nx<5000 && ny>1 && ny<5000 && !vis[nx][ny]){
                vis[nx][ny]=true;
                a[nx][ny]=' ';
                s.push({nx,ny,k}); //下一步将继续从新节点延申 
                found=true;
                step++;
                break;
            }
        }
        if(!found){
            s.pop();
        }
    }
}
//生成地图函数
void start_ore(char p,int step,int sx,int sy,int cntp){
    while(!q.empty()) q.pop();
    a[sx][sy]=p;
    q.push({sx,sy});
    int nx,ny;
    while(!q.empty()){
        if(step<=0) return ;
        node_dir h=q.front();
        q.pop();

        int dirs[4]={0,1,2,3};
        for(int i=0;i<4;i++){
            int r=rand()%4;
            swap(dirs[i],dirs[r]);
        }
        for(int i=0;i<4;i++){
            if(step<=0) return ; 
            int k=dirs[i];
            nx=h.dx+dir[k][0];
            ny=h.dy+dir[k][1];
            if(nx>1 && nx<5000 && ny>1 && ny<5000 && (a[nx][ny]==' ' || a[nx][ny]=='H')){
                a[nx][ny]=p;
                cnt[nx][ny]=cntp;
                step--;
                if(step<=0) return ; 
                q.push({nx,ny});
            }
        }
    }
    //if(rand()%100) cout<<count<<endl;
}
//生成矿物函数 
HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);
void setColor(int color) {
    SetConsoleTextAttribute(hOut, color);
}
int main(){
    string skey;
    for(int i=1;i<=5200;i++){
        for(int j=1;j<=5200;j++) {
            a[i][j]='H';
            vis[i][j]=false;
        }
    }
    //初始化 

    start(5000,2500,2500);
    start(5000,2450,2550);
    start(5000,2550,2450);
    for(int i=1;i<=5000;i++){
        for(int j=1;j<=5000;j++){
            if(a[i][j]==' ' && rand()%150==0 || rand()%1000==0){
                vistart[i][j]=true;
                start(rand()%200+1,i,j);
            }
        }
    }
    for(int i=1;i<=5000;i++){
        for(int j=1;j<=5000;j++){
            if(vistart[i][j]){
                start(rand()%600+1,i,j);
            }
            cnt[i][j]=5;
        }
    }
    //生成地形 
    for(int i=1;i<=5000;i++){
        for(int j=1;j<=5000;j++){
            if(rand()%500==0){
                a[i][j]='C';
                start_ore('C',rand()%8+4,i,j,8);
            }else if(rand()%600==0){
                a[i][j]='I';
                start_ore('I',rand()%8+2,i,j,15);
            }else if(rand()%4000==0){
                a[i][j]='G';
                start_ore('G',rand()%8+1,i,j,30);
            }else if(rand()%10000==0){
                a[i][j]='D';
                start_ore('D',rand()%4+1,i,j,40);
            }
        }
    }
    //生成矿物 
    int kx,ky;
    for(int i=1;i<=5000;i++){
        for(int j=1;j<=5000;j++){
            if(rand()%15000<=2 && a[i][j]=='H'){
                a[i][j]='=';
                while(true){
                    kx=i+rand()%5*(0-rand()%2);
                    ky=j+rand()%5*(0-rand()%2);
                    if(kx>0&&ky>0&&kx<=5000&&ky<=5000 && a[kx][ky]!='=' && a[kx][ky]!='-'){
                        break;
                    }
                }
                a[kx][ky]='-';
                viscase[i][j]=false;
                findkey[i][j]={kx,ky};
                findkey[kx][ky]={i,j};
                cnt[i][j]=0x3f3f3f3f;
                //cout<<i<<" "<<j<<endl; 
            }
        }
    }
    //生成宝箱 

    for(int i=2470;i<=2530;i++){
        for(int j=2450;j<=2550;j++){
            if(a[i][j]=='C'){//输出分支3:煤矿(C)
                setColor(FOREGROUND_INTENSITY); 
                cout<<a[i][j];
                setColor(FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE);
            }else if(a[i][j]=='I'){//输出分支4:铁矿(I)
                setColor(FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_INTENSITY); 
                cout<<a[i][j];
                setColor(FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE);
            }else if(a[i][j]=='G'){//输出分支5:金矿(G)
                setColor(FOREGROUND_RED | FOREGROUND_GREEN); 
                cout<<a[i][j];
                setColor(FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE);
            }else if(a[i][j]=='D'){//输出分支6:钻石矿(D)
                setColor(FOREGROUND_BLUE | FOREGROUND_INTENSITY); 
                cout<<a[i][j];
                setColor(FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE);
            }else if(a[i][j]=='='){//输出分支7:宝箱(=)
                setColor(FOREGROUND_BLUE | FOREGROUND_GREEN); 
                cout<<a[i][j];
                setColor(FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE);
            }else{
                cout<<a[i][j];
            }
        }
        cout<<endl;
    }
    Sleep(5000);

    //地图查看器
    map<char,node_dir> m; 
    m['w']={-1,0};
    m['s']={1,0};
    m['a']={0,-1};
    m['d']={0,1};
    x=2500,y=2500;//移动初始化 
    int fx,fy;
    while(true){
        system("cls");
        cout<<"当前位置 : "<<x<<","<<y<<endl;
        lx=x-8;
        rx=x+8;
        ly=y-12;
        ry=y+12;
        for(int i=lx;i<=rx;i++){
            for(int j=ly;j<=ry;j++){
                if(i==x && j==y){//输出分支1:玩家(Y)
                    setColor(FOREGROUND_RED | FOREGROUND_INTENSITY);
                    cout<<'Y';
                    setColor(FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE);
                    continue;
                }else if(a[i][j]=='H'){//输出分支2:墙壁(H)
                    if(cnt[i][j]==5){
                        cout<<a[i][j];
                    }else if(cnt[i][j]>=3){
                        setColor(FOREGROUND_INTENSITY); 
                        cout<<a[i][j];
                        setColor(FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE);
                    }else{
                        setColor(FOREGROUND_RED | FOREGROUND_BLUE);
                        cout<<a[i][j];
                        setColor(FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE);
                    }
                }else if(a[i][j]=='C'){//输出分支3:煤矿(C)
                    setColor(FOREGROUND_INTENSITY); 
                    cout<<a[i][j];
                    setColor(FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE);
                }else if(a[i][j]=='I'){//输出分支4:铁矿(I)
                    setColor(FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_INTENSITY); 
                    cout<<a[i][j];
                    setColor(FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE);
                }else if(a[i][j]=='G'){//输出分支5:金矿(G)
                    setColor(FOREGROUND_RED | FOREGROUND_GREEN); 
                    cout<<a[i][j];
                    setColor(FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE);
                }else if(a[i][j]=='D'){//输出分支6:钻石矿(D)
                    setColor(FOREGROUND_BLUE | FOREGROUND_INTENSITY); 
                    cout<<a[i][j];
                    setColor(FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE);
                }else if(a[i][j]=='='){//输出分支7:宝箱(=)
                    setColor(FOREGROUND_BLUE | FOREGROUND_GREEN); 
                    cout<<a[i][j];
                    setColor(FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE);
                }else{
                    cout<<a[i][j];
                }
                //正常输出内容 
            }
            cout<<endl;
        }//输出地图
        cin>>wmp;
        if(wmp=='w' || wmp=='a' || wmp=='s' || wmp=='d'){
            fx=x+m[wmp].dx;
            fy=y+m[wmp].dy;
            if(a[fx][fy]==' '){//输入分支1:移动
                x=fx;
                y=fy;
            }else if(a[fx][fy]=='H' || a[fx][fy]=='C' || a[fx][fy]=='I' || a[fx][fy]=='G' || a[fx][fy]=='D'){//输入分支2:挖掘 
                cnt[fx][fy]--;
                if(cnt[fx][fy]==0){
                    a[fx][fy]=' ';
                }
                //cout<<"you dig"<<"("<<fx<<","<<fy<<")"<<endl;
                //Sleep(3000);
            }else if(a[fx][fy]=='='){//输入分支3:宝箱 
                if(opencase[fx][fy]==true){
                    cout<<"this case has already been opened\n";
                    Sleep(1000); 
                }else{
                    if(viscase[fx][fy]==true){
                        opencase[fx][fy]=true;
                        cout<<"you open the case!\n";
                        Sleep(1000);
                    }else{
                        cout<<"the key is in"<<"("<<findkey[fx][fy].dx<<","<<findkey[fx][fy].dy<<")"<<endl;
                        Sleep(3000);
                    }
                }
            }else if(a[fx][fy]=='-'){//输入分支4:钥匙 
                cout<<"you get the key to the case which is in"<<"("<<findkey[fx][fy].dx<<","<<findkey[fx][fy].dy<<")"<<endl;
                Sleep(3000);
                viscase[findkey[fx][fy].dx][findkey[fx][fy].dy]=true;
            }
        }
    }
    return 0;
}

欢迎反馈bug


0
我要回答