1
修复的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


