草原战争(单人)
//因为打不出作者名字两侧的字符,所以找不到作者的链接
#include <bits/stdc++.h>
#include <windows.h>
#include <conio.h>
using namespace std;
//制作者:Wendigo,版权所有,盗版必究
struct point{
int x,y,g;
//x轴y轴东西
void make(int xl,int yl,int gl){
x=xl; y=yl; g=gl;
}
}ts;
int cd;
string lv;
//lv和cd控制输出颜色与电脑匹配
int siz=4,xue=10;
point w;
int g[1100][1100],s;
int L[1100][1100];
bool doit[1100][1100];
string pf;
int sinc[15]={0,3,2,1,0,
0,1,2,100,200,300,200,0,500,1000};
int Ls[15]={1,3,2,1,INT_MAX,
INT_MAX,1,2,1,2,3,1,1,1,1};
int last=1;
//控制地图、大小siz与自己位置和金币s
//pf是皮肤字符串,两个英文字母或一个中文字
//L数组值表示方块剩余血量
vector<point> vs;
//野兽
string notice[]={
"按w a s d 键移动 ",
"按f 键来选择攻击方向",
"按h 键选获取物品方向",
"小心野兽! ",
"科学家: 草原资源守恒",
"按e 键打造方块 "
};
//提示
int t,sec;
int fx[5][2]={{0,0},
{-1,0},{0,-1},{1,0},{0,1}};
//动作输入匹配
void col(int c1,int c2){
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), c1*16+c2);
} //颜色,c1为背景,c2为前景
void HideCursor(){
CONSOLE_CURSOR_INFO cursor_info={1,0};
SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE),&cursor_info);
} //隐藏光标
void Help(){
printf("输入你的电脑等级(高级or低级)\n");
cin>>lv;
if(lv=="高级") cd=15;
else if(lv=="低级") cd=0;
while(lv!="高级"&&lv!="低级"){
cin>>lv;
if(lv=="高级") cd=15;
else if(lv=="低级") cd=0;
} system("cls");
} void Start(){
printf("请设计你的皮肤\n");
printf("(两个英文字母或一个中文字)\n");
cin>>pf;
while(pf.size()!=2){
printf("长度不符");
col(cd,12);
printf("X\n");
col(cd,7);
cin>>pf;
} printf("符合!");
col(cd,10);
printf("J\n");
col(cd,7);
Sleep(500);
system("cls");
printf("加载中......\n");
w.x=w.y=501;
} int RAND(int xl,int yl){
int ran=(int)rand()%10000+1;
if(ran<=7000){
g[xl][yl]=0;
L[xl][yl]=Ls[0];
} //空地
else if(ran<=7400){
g[xl][yl]=1;
L[xl][yl]=Ls[1];
} else if(ran<=7700){
g[xl][yl]=2;
L[xl][yl]=Ls[2];
} else if(ran<=8000){
g[xl][yl]=3;
L[xl][yl]=Ls[3];
} //石头
else if(ran<=8500){
g[xl][yl]=4;
L[xl][yl]=Ls[4];
} else if(ran<=9000){
g[xl][yl]=5;
L[xl][yl]=Ls[5];
} //水
else if(ran<=9490){
g[xl][yl]=6;
L[xl][yl]=Ls[6];
} //灌木
else if(ran<=9980){
g[xl][yl]=7;
L[xl][yl]=Ls[7];
} //丛林
else if(ran<=9985){
g[xl][yl]=8;
L[xl][yl]=Ls[8];
} //野猪
else if(ran<=9988){
g[xl][yl]=9;
L[xl][yl]=Ls[9];
} //狼
else if(ran<=9990){
g[xl][yl]=10;
L[xl][yl]=Ls[10];
} //老虎
else if(ran<=9995){
g[xl][yl]=11;
L[xl][yl]=Ls[11];
} //茶
else if(ran<=9997){
g[xl][yl]=12;
L[xl][yl]=Ls[12];
}//扩野镜
else if(ran<=9999){
g[xl][yl]=13;
L[xl][yl]=Ls[13];
} //绿宝石
else if(ran<=10000){
g[xl][yl]=14;
L[xl][yl]=Ls[14];
} //红宝石
} //随机生成地图
int keymap(int key){
if(key=='W'||key=='w')
return 1;
if(key=='A'||key=='a')
return 2;
if(key=='S'||key=='s')
return 3;
if(key=='D'||key=='d')
return 4;
if(key=='F'||key=='f')
return 5;
if(key=='H'||key=='h')
return 6;
if(key=='E'||key=='e')
return 7;
return 0;
} //按键匹配
void dfs(int &xn,int &yn,int xl,int yl,int dist){
if(dist==0){
if(abs(xl-w.x)+abs(
yl-w.y)<abs(xn-w.x)
+abs(yn-w.y)){
xn=xl; yn=yl;
} return;
} for(int i=1;i<=4;i++){
int xne=xl+fx[i][0];
int yne=yl+fx[i][1];
if(xne<1&&xne>1001
&&yne<1&&yne>1001)
continue;
if(!g[xne][yne])
dfs(xn,yn,xne,yne,dist-1);
}
} //野兽追人
void ken(){
system("cls");
col(cd,10);
printf(" <(草原战争)>\n\n");
for(int i=w.x-siz;i<=w.x+siz;i++){
for(int j=w.y-siz;j<=w.y+siz;j++){
if(i==w.x&&j==w.y){
col(13,cd);
cout<<pf;
continue;
} if(i<0||i>1002||j<0||j>1002){
printf(" ");
continue;
} if(i==0||j==0||i==1002||j==1002){
col(cd,7);
printf("▓");
continue;
} if(g[i][j]==0){
col(cd,7);
printf(" ");
} else if(g[i][j]==1){
col(cd,8);
printf("▓");
} else if(g[i][j]==2){
col(cd,7);
printf("▓");
} else if(g[i][j]==3){
col(cd,4);
printf("▓");
} else if(g[i][j]==4){
col(11,cd);
printf(" ");
} else if(g[i][j]==5){
col(9,cd);
printf(" ");
} else if(g[i][j]==6){
col(cd,10);
printf("▓");
} else if(g[i][j]==7){
col(cd,2);
printf("▓");
} else if(g[i][j]==8){
col(cd,6);
printf("C:");
// ts.make(i,j,1);
// vs.push_back(ts);
// if(doit[i][j]){
// doit[i][j]=0;
// col(cd,7);
// printf(" ");
// } if(abs(w.x-i)+abs(w.y-j)<=1)
// xue--;
// int xt=i,yt=j;
// dfs(xt,yt,i,j,1);
// g[xt][yt]=g[i][j];
// g[i][j]=0;
// L[i][j]=0;
// doit[xt][yt]=1;
} else if(g[i][j]==9){
col(cd,6);
printf("<A");
} else if(g[i][j]==10){
col(6,cd);
printf("王");
} else if(g[i][j]==11){
col(cd,14);
printf("%&");
} else if(g[i][j]==12){
col(cd,7);
printf("◎");
} else if(g[i][j]==13){
col(cd,2);
printf("<>");
} else if(g[i][j]==14){
col(cd,12);
printf("<>");
}
} printf("\n");
} printf("\n");
int xr=(int)rand()%5;
for(int i=1;i<=10;i++){
if(xue>=i) col(10,cd);
else col(12,cd);
cout<<notice[xr].substr(i*2-2,2);
} col(14,cd);
printf("%d",s);
col(cd,7);
printf("\n");
}//画出视野
int main(){
srand((unsigned)time(NULL));
col(15,7);
HideCursor();
Help();
Start();
for(int i=1;i<=1001;i++)
for(int j=1;j<=1001;j++)
RAND(i,j);
ken();
col(cd,7);
bool lf;
// 记录步骤是否浪费
while(t=getch()){
lf=0;
int km=keymap(t);
if(!km) continue;
if(km<=4){
point nw;
nw.make(w.x+fx[km][0],
w.y+fx[km][1],0);
if(g[nw.x][nw.y]!=0
&&g[nw.x][nw.y]!=6){
continue;
} w=nw;
} else if(km==5){
sec=getch();
int secm=keymap(sec);
if(!secm||secm>4) continue;
point gj=w;
for(;g[gj.x][gj.y]==0||
g[gj.x][gj.y]==4||
g[gj.x][gj.y]==5;gj.x
+=fx[secm][0],gj.y+=fx[secm][1]){
if(gj.x<1||gj.x>1001
||gj.y<1||gj.y>1001){
lf=1; break;
}
} if(lf) continue;
L[gj.x][gj.y]--;
if(L[gj.x][gj.y]<=0){
int temp=g[gj.x][gj.y];
L[gj.x][gj.y]=0;
s+=sinc[temp];
if(temp!=8&&temp!=9&&
temp!=10&&temp!=12)
last=g[gj.x][gj.y];
g[gj.x][gj.y]=0;
}
} else if(km==6){
sec=getch();
int secm=keymap(sec);
if(!secm||secm>4) continue;
point hq;
hq.make(w.x+fx[secm][0],
w.y+fx[secm][1],0);
int tmp=g[hq.x][hq.y];
if(tmp>10){
L[hq.x][hq.y]=
g[hq.x][hq.y]=0;
if(tmp==11){
xue=10;
} else if(tmp==12){
siz++;
} else if(tmp==13){
s+=500;
} else if(tmp==14){
s+=1000;
}
} else continue;
} else if(km==7){
sec=getch();
int secm=keymap(sec);
if(!secm||secm>4) continue;
if(s<sinc[last]) continue;
point dz;
dz.make(w.x+fx[secm][0],
w.y+fx[secm][1],0);
int tmp=g[dz.x][dz.y];
if(tmp==0){
s-=sinc[last];
L[dz.x][dz.y]=Ls[last];
g[dz.x][dz.y]=last;
} else continue;
} ken();
if(xue<=0) break;
}
return 0;
}