问题标题: 矿工模拟器3.0!!!(测试版Pro)

1
2
张十一
张十一
修练者
修练者

修复的bug:

修复已知bug

 三维地形数组放到全局,彻底解决栈溢出闪退
 全部玩家数据封装Player结构体,消除大量全局变量
 修复注册密码不一致还会注册的 bug
 删除挖矿循环自动回血,怪物伤害生效
 删除失效的 f/fanhui 逻辑,改用ESC 放弃挖矿,教程同步更新按键
 main只调用一次srand,不会同一秒挖矿随机完全一样
 wk增加 -1 判断,已经挖过方块不会再触发岩浆怪物
 水窒息逻辑修复,835‑840 才窒息,不再只有恰好等于 840 才**
 镐子 8 级挖掘时间由 5ms 改成 50ms,不会瞬间挖完
 增加登录校验:没登录不能进商城、挖矿
 登录密码使用局部 string,不再全局 pwd 残留
 合金钻头连续挖掘时检测**亡,中途**亡终止钻头
 血量严格限制 0‑100
 保存函数接收 Player 引用,读写正确账号数据

#include<bits/stdc++.h>
#include<Windows.h>
#include<conio.h>
#include<limits>
using namespace std;
const int MAXX = 100, MAXY = 60, MAXZ = 100;
short int kw[MAXX][MAXY][MAXZ];

const int MAX_HP = 100;
int st[123] = {900,800,700,580,430,310,170,90,50};
double bss[10] = {1,1.5,2,3,5,6,9,15,22};
int jg[18] = {0,30,150,700,2500,10000,40000,100000,300000};
int mod_pos(int val, int mod){
    int r = val % mod;
    if(r<0)r+=mod;
    return r;
}
//玩家结构体
struct Player{
    string username;
    int jin;
    int pickaxe_level;
    int bt;
    int zxq;
    int mxd;
    int hj;
    int sd;
    double bs;
    int xl;
    Player(){
        username = "";
        jin = 0;
        pickaxe_level = 1;
        bt = 0;
        zxq = 0;
        mxd = 0;
        hj = 0;
        sd = st[0];
        bs = bss[0];
        xl = MAX_HP;
    }
};

Player pl;

char fb(){
    return _getch();
}

int czi(char a){
    return a-'0';
}

void wk(int t, Player &p){
    if(t == -1){
        cout<<"这里已经被挖空!";
        Sleep(800);
        return;
    }
    if(t<=10){
        cout<<"恭喜你,挖到了岩浆,烫逝了!";
        p.xl=0;
    }else if(t<=30){
        cout<<"恭喜你,挖到了钻石!";
        p.jin += (int)(500*p.bs);
    }else if(t<=50){
        cout<<"你遇到了怪物,因此而亡";
        p.xl=0;
    }else if(t<=100){
        cout<<"你遇到了怪物,因此重伤";
        p.xl-=60;
    }else if(t<=180){
        cout<<"你遇到了怪物,被击败了";
        p.xl-=20;
    }else if(t<=250){
        cout<<"你挖到了金矿石!";
        p.jin += (int)(200*p.bs);
    }else if(t<=380){
        cout<<"你挖到了铁矿石!";
        p.jin += (int)(100*p.bs);
    }else if(t<=500){
        cout<<"你挖到了:泥土";
        p.jin += (int)(p.bs);
    }else if(t<=700){
        cout<<"你挖到了:岩石";
        p.jin += (int)(p.bs);
    }else if(t<=770){
        cout<<"你挖到了青金石!";
        p.jin += (int)(80*p.bs);
    }else if(t<=790){
        cout<<"你挖空了,摔了一跤!";
        p.xl-=5;
    }else if(t<=800){
        cout<<"你失足了,摔亡了!";
        p.xl=0;
    }else if(t<=840){
        cout<<"你挖到了水,需要花一些时间弄干\n";
        Sleep(2600);
        if(t>835){
            cout<<p.username<<"注定会窒息!";
            p.xl=0;
        }else{
            cout<<"衣服干了,继续前进";
        }
    }else if(t<=900){
        cout<<"你挖到了:铜";
        p.jin += (int)(50*p.bs);
    }else if(t<910){
        cout<<"你有些累,回家了";
        p.xl = -999;
    }else if(t<=999){
        cout<<"你挖到了:煤炭";
        p.jin += (int)(30*p.bs);
    }else{
        cout<<"这里已经被挖过";
    }
    if(p.xl < 0 && p.xl != -999) p.xl = 0;
    if(p.xl > MAX_HP) p.xl = MAX_HP;
}

bool isUserExist(string uname, string pwd, int &gold, int &plv, int &bandage, int &inject, int &fullhp, int &drill) {
    ifstream fin("user_info.txt", ios::in);
    if (!fin.is_open()){
        fin.close();
        return false;
    }
    string u,p;
    int g,lv,b,i,f,d;
    while(fin>>u>>p>>g>>lv>>b>>i>>f>>d){
        if(u == uname){
            if(p == pwd){
                gold = g; plv = lv; bandage = b; inject = i; fullhp = f; drill = d;
                fin.close();
                return true;
            }else{
                fin.close();
                return false;
            }
        }
    }
    fin.close();
    return false;
}

bool regUser(string uname, string pwd) {
    int t1,t2,t3,t4,t5,t6;
    if(isUserExist(uname,pwd,t1,t2,t3,t4,t5,t6)) return false;
    ofstream fout("user_info.txt", ios::app);
    if(!fout.is_open()){
        cout<<"创建文件失败"<<endl;
        Sleep(1000);
        return false;
    }
    fout<<uname<<" "<<pwd<<" 0 1 0 0 0 0\n";
    fout.close();
    return true;
}

void saveUser(Player &p) {
    vector<vector<string>> data;
    ifstream fin("user_info.txt");
    if(!fin.is_open()){
        cout<<"打开失败"<<endl;
        return;
    }
    string u,pwd,g,lv,b,i,f,d;
    while(fin>>u>>pwd>>g>>lv>>b>>i>>f>>d){
        if(u == p.username){
            g = to_string(p.jin);
            lv = to_string(p.pickaxe_level);
            b = to_string(p.bt);
            i = to_string(p.zxq);
            f = to_string(p.mxd);
            d = to_string(p.hj);
        }
        data.push_back({u,pwd,g,lv,b,i,f,d});
    }
    fin.close();
    ofstream fout("user_info.txt");
    for(auto &line:data){
        for(int i=0;i<line.size();i++){
            if(i>0) fout<<" ";
            fout<<line[i];
        }
        fout<<endl;
    }
    fout.close();
    cout<<"保存成功!"<<endl;
    Sleep(1000);
}

void gameMain(){
    cout<<"               欢迎来到矿工模拟器"
    <<"\n\n\n"
    <<"                ________________   \n"
    <<"                | 矿工模拟器  |   \n"
    <<"                ----------------   \n"
    <<"\n\n\n\n\n"
    <<"               按任意键进入\n\n\n       ";
    char enter = fb();
    system("cls");

    while(true){
        system("cls");
        if(pl.username.empty()){
            cout <<"当前用户:未登录  金币:" << pl.jin << "  镐子等级:" << pl.pickaxe_level << endl;
        }else{
            cout <<"当前用户:"<<pl.username<<"  金币:" << pl.jin << "  镐子等级:" << pl.pickaxe_level << endl;
        }
        cout<<"====================================="<<endl;
        cout<<"   1.商城\n   2.开始挖矿\n   3.教程\n   4.退出游戏\n   5.登录\n   6.注册";
        cout<<endl<<"      ";
        char op = fb();
        if(op == '1'){
            if(pl.username.empty()){
                cout<<"请先登录账号!";
                Sleep(1200);
                continue;
            }
            while(true){
                system("cls");
                cout<<"金币:"<<pl.jin<<"\n\n";
                cout<<"1.一级镐:30金币     2.二级镐:150金币     3.三级镐:700金币     4.四级镐:2500金币\n\n";
                cout<<"5.五级镐:10000金币  6.六级镐:40000金币   7.七级镐:100000金币 8.八级镐:300000金币\n\n";
                cout<<"9.绷带(a):600金币    10.注射剂(b):1200金币 11.满血药(c):2800金币 12.合金钻头(d):2000金币\n";
                cout<<"\n输入购买,按0退出\n       ";
                char buy = fb();
                if(buy == '0'){
                    break;
                }else if(czi(buy)>=1 && czi(buy)<=8){
                    int lv = czi(buy);
                    if(jg[lv] <= pl.jin){
                        pl.jin -= jg[lv];
                        pl.pickaxe_level = lv;
                        pl.sd = st[lv-1];
                        pl.bs = bss[lv-1];
                        cout<<"购买成功!当前等级:"<<lv;
                        Sleep(500);
                    }else{
                        cout<<"金币不足!";
                        Sleep(1000);
                    }
                }else if(buy == 'a'){
                    if(pl.jin >= 600){
                        pl.bt++;
                        pl.jin -= 600;
                        cout<<"购买绷带成功,数量:"<<pl.bt;
                        Sleep(500);
                    }else{cout<<"金币不足!";Sleep(1000);}
                }else if(buy == 'b'){
                    if(pl.jin >= 1200){
                        pl.zxq++;
                        pl.jin -=1200;
                        cout<<"购买注射剂成功,数量:"<<pl.zxq;
                        Sleep(500);
                    }else{cout<<"金币不足!";Sleep(1000);}
                }else if(buy == 'c'){
                    if(pl.jin >= 2800){
                        pl.mxd++;
                        pl.jin -=2800;
                        cout<<"购买满血药成功,数量:"<<pl.mxd;
                        Sleep(500);
                    }else{cout<<"金币不足!";Sleep(1000);}
                }else if(buy == 'd'){
                    if(pl.jin >=2000){
                        pl.hj++;
                        pl.jin -=2000;
                        cout<<"购买合金钻头成功,数量:"<<pl.hj;
                        Sleep(500);
                    }else{cout<<"金币不足!";Sleep(1000);}
                }
            }
        }else if(op == '2'){
            if(pl.username.empty()){
                cout<<"请先登录账号!";
                Sleep(1200);
                continue;
            }
            pl.xl = MAX_HP;
            system("cls");
            cout<<"\n  生成地形中···\n\n      加载中 ";
            for(int i=0;i<100;i++){
                if(i%10 == 0) cout<<"█";
                for(int k=0;k<100;k++){
                    for(int j=0;j<50;j++){
                        kw[i][j][k] = rand()%1000;
                    }
                }
            }
            int tempGold = 0;
            int x=rand()%50;
            int y=rand()%25;
            int z=rand()%45;
            bool gameEnd = false;
            while(true){
                system("cls");
                cout<<"\n坐标:"<<"前后="<<x<<" | 高度="<<y<<" | 左右="<<z<<"\n血量:"<<pl.xl<<"\n";
                cout<<"w前 s后 a左 d右 空格上 x下 | 背包0 | ESC放弃挖矿\n\n";
                char key = fb();
                if(key == 'a') z++;
                else if(key == 'd') z--;
                else if(key == 'w') x++;
                else if(key == 's') x--;
                else if(key == ' ') y++;
                else if(key == 'x') y--;
                else if(key == 27){
                    cout<<"\n确定放弃本次挖矿?Y/N";
                    char c = fb();
                    if(c == 'Y' || c == 'y'){
                        pl.jin += tempGold;
                        break;
                    }
                    continue;
                }else if(key == '0'){
                    system("cls");
                    cout<<"本次临时金币:"<<tempGold<<"\n背包:\n";
                    if(pl.bt>0) cout<<"绷带(a) ×"<<pl.bt<<"\n";
                    if(pl.zxq>0) cout<<"注射剂(b) ×"<<pl.zxq<<"\n";
                    if(pl.mxd>0) cout<<"满血药(c) ×"<<pl.mxd<<"\n";
                    if(pl.hj>0) cout<<"合金钻头(d) ×"<<pl.hj<<"\n";
                    cout<<"按n退出背包\n";
                    char bagKey = fb();
                    if(bagKey == 'n') continue;
                    else if(bagKey == 'a'){
                        if(pl.bt>0){pl.bt--;pl.xl+=15;if(pl.xl>MAX_HP)pl.xl=MAX_HP;Sleep(200);}
                        else {cout<<"没有绷带";Sleep(800);}
                    }else if(bagKey == 'b'){
                        if(pl.zxq>0){pl.zxq--;pl.xl+=40;if(pl.xl>MAX_HP)pl.xl=MAX_HP;Sleep(200);}
                        else {cout<<"没有注射剂";Sleep(800);}
                    }else if(bagKey == 'c'){
                        if(pl.mxd>0){pl.mxd--;pl.xl=MAX_HP;Sleep(200);}
                        else {cout<<"没有满血药";Sleep(800);}
                    }else if(bagKey == 'd'){
                        if(pl.hj>0){
                            pl.hj--;
                            cout<<"蓄力中……";Sleep(1000);
                            cout<<"轰!!!!!\n";Sleep(1000);
                            for(int t=0;t<10;t++){
                                y--;
                                int ix = mod_pos(x,MAXX);
                                int iy = mod_pos(y,MAXY);
                                int iz = mod_pos(z,MAXZ);
                                int blk = kw[ix][iy][iz];
                                wk(blk,pl);
                                if(blk != -1) tempGold += (int)pl.bs;
                                kw[ix][iy][iz] = -1;
                                if(pl.xl <= 0 || pl.xl == -999) break;
                            }
                        }else{cout<<"没有钻头!";Sleep(800);}
                    }
                    cout<<"按任意键返回挖矿";fb();
                    continue;
                }else{
                    continue;
                }
                int ix = mod_pos(x,MAXX);
                int iy = mod_pos(y,MAXY);
                int iz = mod_pos(z,MAXZ);
                int block = kw[ix][iy][iz];
                system("cls");
                cout<<"挖掘中";
                Sleep(pl.sd);
                system("cls");
                wk(block,pl);
                if(block != -1) tempGold += (int)pl.bs;
                kw[ix][iy][iz] = -1;
                Sleep(1200);
                if(pl.xl <= 0 || pl.xl == -999){
                    gameEnd = true;
                    break;
                }
            }
            cout<<"\n本次挖到金币:"<<tempGold;
            if(!gameEnd){
                pl.jin += tempGold;
            }
            Sleep(2500);
        }else if(op == '3'){
            system("cls");
            cout<<"【操作说明】\n";
            cout<<"空格向上,x向下,w向前,s向后,a向左,d向右\n";
            cout<<"0打开背包,ESC放弃挖矿\n";
            cout<<"遇到岩浆、怪物会扣血,血量归零就结束本次挖矿\n";
            cout<<"按任意键返回";
            fb();
        }else if(op == '4'){
            if(!pl.username.empty()) saveUser(pl);
            cout<<"游戏结束";
            Sleep(1000);
            exit(0);
        }else if(op == '5'){
            system("cls");
            string un,pw;
            cout<<"账号:";cin>>un;
            cout<<"密码:";
            char ch;
            while((ch=fb())!='\r'){
                if(ch == '\b'){
                    if(!pw.empty()){pw.pop_back();cout<<"\b \b";}
                }else{
                    pw.push_back(ch);
                    cout<<"*";
                }
            }
            cout<<endl;
            int g,lv,b,i,f,d;
            if(isUserExist(un,pw,g,lv,b,i,f,d)){
                pl.username = un;
                pl.jin = g;
                pl.pickaxe_level = lv;
                pl.bt = b;
                pl.zxq = i;
                pl.mxd = f;
                pl.hj = d;
                pl.sd = st[pl.pickaxe_level-1];
                pl.bs = bss[pl.pickaxe_level-1];
                cout<<"登录成功!";Sleep(1000);
            }else{
                cout<<"账号密码错误";Sleep(1000);
            }
        }else if(op == '6'){
            system("cls");
            string un,pw,pw2;
            cout<<"注册账号:";cin>>un;
            cout<<"密码:";
            char ch;
            while((ch=fb())!='\r'){
                if(ch == '\b'){
                    if(!pw.empty()){pw.pop_back();cout<<"\b \b";}
                }else{pw.push_back(ch);cout<<"*";}
            }
            cout<<"\n确认密码:";
            while((ch=fb())!='\r'){
                if(ch == '\b'){
                    if(!pw2.empty()){pw2.pop_back();cout<<"\b \b";}
                }else{pw2.push_back(ch);cout<<"*";}
            }
            cout<<endl;
            if(pw != pw2){
                cout<<"两次密码不一致!";Sleep(1000);
                continue;
            }
            if(regUser(un,pw)){
                cout<<"注册成功,可以登录!";
            }else{
                cout<<"该账号已存在!";
            }
            Sleep(1000);
        }
    }
}

int main(){
    srand((unsigned int)time(NULL));
    SetConsoleTitleA("矿工模拟器");
    gameMain();
    return 0;
}

全放到devc++运行

运行前开c++11(不懂的可以查一查)


0
0
0
0
0
贾晓彬
贾晓彬
新手守护
新手守护

[警告] comparison of integer expressions of different signedness: 'int' and 'std::vector<std::__cxx11::basic_string<char> >::size_type' {aka 'unsigned int'} [-Wsign-compare]

0
我要回答