0
/*
方块: 硬度: 需要挖掘等级:
W(wood) 4 >=0
H(stone) 5 >=1
C(coal) 8 >=2
I(iron) 15 >=2
G(gold) 30 >=2
D(diamond)40 >=2
操作:
wasd 移动 撞到方块自动挖掘
e 查看背包(再按任意键退出)
q 丢弃物品
格式:q换行s x
(s:丢弃物品名称,x:丢弃数量)(x=-1表示全部丢弃 x>物品数量默认全部丢弃)
+ 合成物品
格式:+换行s
(s:合成物品名称)
目前可合成物品:
稿子类
名称: 需要: 挖掘等级 耐久 挖掘量
wood_pickaxe wood*5 1 32 1
stone_pickaxe stone*3,wood*2 2 64 2
iron_pickaxe iron*3,wood*2 3 256 3
diamond_pickaxe diamond*3,wood*2 4 1024 4
r 切换工具栏(拿的稿子) 注意:要先把空手切换成稿子才能用合成的稿子挖掘)
注意:每个稿子在合成时会自带独一无二的编号,可以用e查看
格式:r换行s
(s:要换的稿子名称)
/ 作弊指令
传送
(不要传送到x和y接近1或5000的地方,会产生严重的bug)
格式:/换行tp换行x y
(x,y表示传送坐标)
获取
(give指令能够获取几乎任意名字的非法物品,不要随便用)
获取物品 格式:/换行give换行s换行x
(s表示物品名称,x表示想要的数量)
获取稿子 格式:/换行give换行s换行a b c
(s表示稿子名称,a,b,c分别表示挖掘等级/耐久/挖掘量)
*/
#include<iostream>
#include<cstdlib>
#include<ctime>
#include<stack>
#include<map>
#include<queue>
#include<windows.h>
#include<conio.h>
#include<cstring>
#include<string>
using namespace std;
struct allnode{
int n0,n1,n2,n3,n4;
};
/*
0属**(0 物品,1 工具)
物品:1数量
工具:1数量,2等级,3耐久,4挖掘量,5效率附魔,6时运附魔
*/
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;
map<string,allnode> back;//背包
string use;//工具栏
string usename;
int pos;//工具数量(拼接字符串) 工具编号(打表)
string cl[201]={"0","1","2","3","4","5","6","7","8","9","10","11","12","13","14","15","16","17","18","19","20","21","22","23","24","25","26","27","28","29","30","31","32","33","34","35","36","37","38","39","40","41","42","43","44","45","46","47","48","49","50","51","52","53","54","55","56","57","58","59","60","61","62","63","64","65","66","67","68","69","70","71","72","73","74","75","76","77","78","79","80","81","82","83","84","85","86","87","88","89","90","91","92","93","94","95","96","97","98","99","100","101","102","103","104","105","106","107","108","109","110","111","112","113","114","115","116","117","118","119","120","121","122","123","124","125","126","127","128","129","130","131","132","133","134","135","136","137","138","139","140","141","142","143","144","145","146","147","148","149","150","151","152","153","154","155","156","157","158","159","160","161","162","163","164","165","166","167","168","169","170","171","172","173","174","175","176","177","178","179","180","181","182","183","184","185","186","187","188","189","190","191","192","193","194","195","196","197","198","199","200"};
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;
}
}
//初始化
cout<<"start1……\n";
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()%200==0 || rand()%1500==0){
vistart[i][j]=true;
start(rand()%100+1,i,j);
}
}
}
cout<<"start2……\n";
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;
}
}
//生成地形
cout<<"start3……\n";
for(int i=1;i<=5000;i++){
for(int j=1;j<=5000;j++){
if(rand()%120==0 && i>10 && i<4990 && j>10 && j<4990){
if(rand()%2){for(int k=i;k<=i+rand()%5+5;k++){a[k][j]='W';cnt[k][j]=4;}}
else{for(int k=j;k<=j+rand()%5+5;k++){a[i][k]='W';cnt[i][k]=4;}}
}else 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]=='W'){//输出分支7:木头(W)
setColor(FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_INTENSITY);
cout<<a[i][j];
setColor(FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE);
}else if(a[i][j]=='='){//输出分支8:宝箱(=)
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);
system("cls");
//地图查看器
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;
use="gunmu";
back["gunmu"].n0=0x3f3f3f3f;
back["gunmu"].n1=1;
back["gunmu"].n2=0;
back["gunmu"].n3=0x3f3f3f3f;
back["gunmu"].n4=1;
while(true){
system("cls");
cout<<"当前位置 : "<<x<<","<<y<<endl;
lx=x-8;
rx=x+8;
ly=y-16;
ry=y+16;
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]=='W'){//输出分支7:木头(W)
setColor(FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_INTENSITY);
cout<<a[i][j];
setColor(FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE);
}else if(a[i][j]=='='){//输出分支8:宝箱(=)
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]=='W' || a[fx][fy]=='H' || a[fx][fy]=='C' || a[fx][fy]=='I' || a[fx][fy]=='G' || a[fx][fy]=='D'){//输入分支2:挖掘
cnt[fx][fy]-=back[use].n4;
if(cnt[fx][fy]<=0){
back[use].n3--;
if(a[fx][fy]=='W'){
back["wood"].n0=0;
back["wood"].n1++;
}
if(a[fx][fy]=='H' && back[use].n2>0){
back["stone"].n0=0;
back["stone"].n1++;
}
if(a[fx][fy]=='C' && back[use].n2>1){
back["coal"].n0=0;
back["coal"].n1++;
}
if(a[fx][fy]=='I' && back[use].n2>1){
back["iron"].n0=0;
back["iron"].n1++;
}
if(a[fx][fy]=='G' && back[use].n2>2){
back["gold"].n0=0;
back["gold"].n1++;
}
if(a[fx][fy]=='D' && back[use].n2>2){
back["diamond"].n0=0;
back["diamond"].n1++;
}
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;
}
}else if(wmp=='e'){//输入分支5:查看
for(map<string,allnode>::iterator it=back.begin();it!=back.end();it++){
if(it->second.n1==0){
continue;
}
if(it->second.n0==0){
cout<<it->first<<" "<<it->second.n1<<endl;
}else if(it->second.n0==1){
cout<<it->first;
cout<<" naijiu:"<<it->second.n3<<endl;
}
}
cin>>wmp;
}else if(wmp=='q'){//输入分支6:丢弃
string s;
int t;
cin>>s>>t;
if(t==-1){
back[s].n0=0;
back[s].n1=0;
back[s].n2=0;
back[s].n3=0;
back[s].n4=0;
}else{
back[s].n1=max(back[s].n1-t,0);
}
}else if(wmp=='+'){//输入分支7:合成
string s;
getline(cin,s);
getline(cin,s);
if(s=="wood_pickaxe"){
cout<<1;
if(back["wood"].n1>=5){
pos++;
back["wood"].n1-=5;
back["wood_pickaxe"+cl[pos]].n0=1;
back["wood_pickaxe"+cl[pos]].n1++;
back["wood_pickaxe"+cl[pos]].n2=1;
back["wood_pickaxe"+cl[pos]].n3=32;
back["wood_pickaxe"+cl[pos]].n4=1;
}else{
cout<<"you don't have enouth thing";
}
}else if(s=="stone_pickaxe"){
if(back["stone"].n1>=3 && back["wood"].n1>=2){
pos++;
back["stone"].n1-=3;
back["wood"].n1-=2;
back["stone_pickaxe"+cl[pos]].n0=1;
back["stone_pickaxe"+cl[pos]].n1++;
back["stone_pickaxe"+cl[pos]].n2=2;
back["stone_pickaxe"+cl[pos]].n3=64;
back["stone_pickaxe"+cl[pos]].n4=2;
}else{
cout<<"you don't have enouth thing";
}
}else if(s=="iron_pickaxe"){
if(back["iron"].n1>=3 && back["wood"].n1>=2){
pos++;
back["iron"].n1-=3;
back["wood"].n1-=2;
back["iron_pickaxe"+cl[pos]].n0=1;
back["iron_pickaxe"+cl[pos]].n1++;
back["iron_pickaxe"+cl[pos]].n2=3;
back["iron_pickaxe"+cl[pos]].n3=256;
back["iron_pickaxe"+cl[pos]].n4=3;
}else{
cout<<"you don't have enouth thing";
}
}else if(s=="diamond_pickaxe"){
if(back["diamond"].n1>=3 && back["wood"].n1>=2){
pos++;
back["diamond"].n1-=3;
back["wood"].n1-=2;
back["diamond_pickaxe"+cl[pos]].n0=1;
back["diamond_pickaxe"+cl[pos]].n1++;
back["diamond_pickaxe"+cl[pos]].n2=4;
back["diamond_pickaxe"+cl[pos]].n3=1024;
back["diamond_pickaxe"+cl[pos]].n4=4;
}else{
cout<<"you don't have enouth thing";
}
}
}else if(wmp=='r'){
string s;
cin>>s;
if(s.find("pickaxe")==-1 || back[s].n1==0){
cout<<"this isn't a pickaxe\n";
Sleep(1000);
continue;
}
use=s;
}else if(wmp=='/'){
string s;
cin>>s;
if(s=="tp"){
int fx,fy;
cin>>fx>>fy;
a[fx][fy]=' ';
x=fx;
y=fy;
}else if(s=="give"){
cin>>s;
int t1,t2,t3,t4;
if(s.find("pickaxe")!=-1){
pos++;
s=s+cl[pos];
cin>>t2>>t3>>t4;
back[s].n0=1;
back[s].n1=1;
back[s].n2=t2;
back[s].n3=t3;
back[s].n4=t4;
}else{
cin>>t1;
back[s].n0=0;
back[s].n1+=t1;
}
}
}
}
return 0;
}
/*物品切换 宝箱 物品属**初始化 */
(代码基本手搓,颜色借助了AI)
