女孩子的试炼html5魔塔

女孩子的试炼攻略:

#include<cstdio>
#include"windows.h"
int hp0=515,atk1=10,dex1=10;
int monstercount=19;
int bounscount=33;
int allmonster=7;
struct enemys{
	short hp,atk,dex,spj;//0都没有1魔攻2兼顾3先攻4二连击
}enemy[7];
short allstatus[524288]={};//对应状态最大hp
char atk0[524288]={};//状态拿到攻击
char dex0[524288]={};//状态拿到防御
char mdef[524288]={};//状态拿到魔防
short extrahp[524288]={};//状态拿到血瓶量
int pre[524288]={};//状态的前驱,用于输出路线
int enemy2[19]={};//打败对应敌人需要打败的前置敌人,为零表示没有,多个前置敌人一个即可 -2初始  -1直接打  0不能到达
char bouns[38]={};//每个编号的宝物是什么
short fight(short myhp,short myatk,short mydex,short mymdef,short enemyhp,short enemyatk,short enemydex,short spj)
{
	
	if(spj==1)mydex=0;
	if(spj==2)myatk=enemydex+1;
	if(spj==3)enemyhp+=(myatk-enemydex);//先攻理解成增加敌人一回合血量,降低复杂度不用重新判断。
	short damage=(enemyhp-1)/(myatk-enemydex)*(enemyatk-mydex);
	if(spj==4)damage*=2;
	damage-=mymdef;
	if(damage<0)damage=0;
	return myhp-damage;
}
struct pos{
int x,y;}
yellowdoor[4],bluedoor[3],monster[20]={};

char enemys[19]={3,3,2,4,0,2,3,3,1,5,0,1,5,5,1,1,2,4,6};
char map[13][13]={
	{04,9,11,00,05,11,37,11,04,00,11,9,05},
	{11,11,11,04,11,00,13,00,11,05,11,11,11},
	{11,00,36,00,11,06,00,35,11,00,34,00,11},
	{06,33,00,11,32,00,11,05,04,11,00,31,07},
	{04,12,00,04,00,11,11,11,11,11,07,12,04},
	{13,00,07,00,30,00,07,00,06,11,29,00,11},
	{05,28,11,00,11,11,11,11,00,27,00,07,11},
	{07,11,00,26,11,07,05,11,11,11,11,00,11},
	{11,9,11,00,00,11,25,06,11,07,11,24,04},
	{07,11,23,00,00,00,00,12,05,00,11,00,11},
	{06,00,06,11,22,11,00,11,21,11,11,07,11},
	{11,20,13,05,00,12,00,00,00,00,11,00,11},
	{07,00,04,11,11,11,00,11,00,19,00,05,11}

};//4红 5蓝 6绿 7红血 9绿血 11墙 0空 12黄门 13 蓝门 19~37怪物
char map1[13][13]={};
int dx[4]={1,0,-1,0};
int dy[4]={0,1,0,-1};
void clear()
{
	for(int i=0;i<524288;i++)
		allstatus[i]=atk0[i]=dex0[i]=mdef[i]=extrahp[i]=pre[i]=0;
	allstatus[0]=hp0;
	
}

int check()
{
	int maxx=0;int pos=0;
	for(int i=262144;i<524288;i++)
		if(allstatus[i]>maxx)
			maxx=allstatus[i],pos=i;
	return pos;
}
void out(int st)
{
	int uju=st;
	int tail=0;
	int route[20]={};
	while(st)
	{
		route[tail++]=st;
		st=pre[st];
	}
	printf("\n路线:\nhp:%d\n",allstatus[uju]);
	for(int i=tail-1;i>=0;i--)
		printf("%x\n",route[i]);
}
void dynamic()
{
	for(int i=1;i<524288;i++)
	{
		if(i==0x20094)
			int dfgsdfgdf=0;
		for(int j=0;j<19;j++)
		{
			int k=1<<j;
			if((i&k)&&allstatus[i^k]>0&&(enemy2[j]==-1||(enemy2[j]&(i^k))))//在节点,上一状态存在,怪物可以直接打,前置怪物打过了
			{
				int tmp=fight(allstatus[i^k],atk0[i^k],dex0[i^k],mdef[i^k],enemy[enemys[j]].hp,enemy[enemys[j]].atk,enemy[enemys[j]].dex,enemy[enemys[j]].spj);
				//tmp剩余血量
				if(tmp<=0)continue;
				tmp+=extrahp[i]-extrahp[i^k];
				if(tmp>allstatus[i])
					allstatus[i]=tmp,pre[i]=i^k;
			}
		}
	}
}
void bfs(int st,int x,int y)
{
	if(st==343434)
		int gdfgsdf=0;
	bool tgt[13][13]={};
	int tou=0,wei=0;
	pos q[444]={};
	q[0].x=x,q[0].y=y;
	tgt[x][y]=1;
	while(tou<=wei)
	{
		int tx=q[tou].x,ty=q[tou].y;
		for(int i=0;i<4;i++)
		{
			int txx=tx+dx[i],tyy=ty+dy[i];
			if(txx<13&&txx>=0&&tyy<13&&tyy>=0&&tgt[txx][tyy]==0&&map1[txx][tyy]<10)
				q[++wei].x=txx,q[wei].y=tyy,tgt[txx][tyy]=1;
		}
		tou++;
	}
	for(int i=0;i<13;i++)
		for(int j=0;j<13;j++)
			if(tgt[i][j])
				switch(map1[i][j])
				{
					case 4:
					atk0[st]++;
					break;
					case 5:
					dex0[st]++;
					break;
					case 6:
					mdef[st]+=4;
					break;
					case 7:
					extrahp[st]+=40;
					break;
					case 9:
					extrahp[st]+=193;
					break;
					default:
					break;
				}
}
void bfs3(int x,int y)
{
	bool tgt[13][13]={};//走空地和物品
	int tou=0,wei=0;
	pos q[444]={};
	q[0].x=x,q[0].y=y;
	tgt[x][y]=1;
	while(tou<=wei)
	{
		int tx=q[tou].x,ty=q[tou].y;
		for(int i=0;i<4;i++)
		{
			int txx=tx+dx[i],tyy=ty+dy[i];
			if(txx<13&&txx>=0&&tyy<13&&tyy>=0&&tgt[txx][tyy]==0&&map[txx][tyy]<10)
				q[++wei].x=txx,q[wei].y=tyy,tgt[txx][tyy]=1;
		}
		tou++;
	}
	bool tgt2[13][13]={};//距离为1的怪物可以打
	for(int i=0;i<19;i++)
		enemy2[i]=-2;
	for(int i=0;i<19;i++)
	{
		int tmpx=monster[i].x,tmpy=monster[i].y;
		for(int j=0;j<4;j++)
		{
			int txx=tmpx+dx[j],tyy=tmpy+dy[j];
			if(txx<13&&txx>=0&&tyy<13&&tyy>=0&&tgt[txx][tyy])
			{enemy2[i]=-1;break;}
		}
	}
	for(int i=0;i<524288;i++)
		atk0[i]+=atk1,dex0[i]+=dex1;
}
int bfs2(int x,int y)
{
	int tmp=map[x][y];
	bool tgt[13][13]={};//走空地和物品
	map[x][y]=0;
	int tou=0,wei=0;
	pos q[444]={};
	q[0].x=x,q[0].y=y;
	tgt[x][y]=1;
	while(tou<=wei)
	{
		int tx=q[tou].x,ty=q[tou].y;
		for(int i=0;i<4;i++)
		{
			int txx=tx+dx[i],tyy=ty+dy[i];
			if(txx<13&&txx>=0&&tyy<13&&tyy>=0&&tgt[txx][tyy]==0&&map[txx][tyy]<10)
				q[++wei].x=txx,q[wei].y=tyy,tgt[txx][tyy]=1;
		}
		tou++;
	}
	bool tgt2[13][13]={};//距离为1的怪物可以打
	int res=0;
	for(int i=0;i<19;i++)
	{
		int tmpx=monster[i].x,tmpy=monster[i].y;
		for(int j=0;j<4;j++)
		{
			int txx=tmpx+dx[j],tyy=tmpy+dy[j];
			if(txx<13&&txx>=0&&tyy<13&&tyy>=0&&tgt[txx][tyy])
			{res|=(1<<i);break;}
		}
	}
	map[x][y]=tmp;
	return res;
}
void init()
{
	clear();
	for(int i=0;i<524288;i++)
	{
		if(i==524000)
			int dfsgfgsd=0;
		for(int j=0;j<13;j++)
			for(int k=0;k<13;k++)
			map1[j][k]=map[j][k];
		for(int j=0;j<19;j++)
			if(i&(1<<j))
				map1[monster[j].x][monster[j].y]=0;//对应状态打过的怪物看作空地
		bfs(i,12,6);
	}
	bfs3(12,6);
	for(int i=0;i<19;i++)
	{
		if(i==17)
			int dfgsdfgf=0;
		if(enemy2[i]==-2)//不能直接打的怪物
		enemy2[i]=bfs2(monster[i].x,monster[i].y);//计算对应前驱怪物
	}
}
int main()
{
	int tot=0;
	for(int i=12;i>=0;i--)
		for(int j=12;j>=0;j--)
			if(map[i][j]>=19)
				monster[tot].x=i,monster[tot].y=j,tot++;
	enemy[0].hp=80,enemy[0].atk=11,enemy[0].dex=3,enemy[0].spj=1;
	enemy[1].hp=8,enemy[1].atk=28,enemy[1].dex=0,enemy[1].spj=2;
	enemy[2].hp=96,enemy[2].atk=21,enemy[2].dex=2,enemy[2].spj=3;
	enemy[3].hp=54,enemy[3].atk=28,enemy[3].dex=1,enemy[3].spj=4;
	enemy[4].hp=39,enemy[4].atk=50,enemy[4].dex=4,enemy[4].spj=0;
	enemy[5].hp=60,enemy[5].atk=23,enemy[5].dex=9,enemy[5].spj=0;
	enemy[6].hp=390,enemy[6].atk=26,enemy[6].dex=5,enemy[6].spj=0;
	yellowdoor[0].x=4,yellowdoor[0].y=1;
	yellowdoor[1].x=11,yellowdoor[1].y=5;
	yellowdoor[2].x=9,yellowdoor[2].y=7;
	yellowdoor[3].x=4,yellowdoor[3].y=11;
	bluedoor[0].x=1,bluedoor[0].y=6;
	bluedoor[1].x=5,bluedoor[1].y=0;
	bluedoor[2].x=11,bluedoor[2].y=2;
	
	for(int i=0;i<13;i++)
		for(int j=0;j<13;j++)
		{
			if(map[i][j]==11)//是墙,暴力枚举破掉每一面墙
			{
				map[i][j]=0;//变成空地
				for(int k1=0;k1<3;k1++)
					for(int k2=k1+1;k2<4;k2++)
					{
						map[yellowdoor[k1].x][yellowdoor[k1].y]=0;
						map[yellowdoor[k2].x][yellowdoor[k2].y]=0;
						for(int k3=0;k3<3;k3++)
						{
							printf("%d %d %d %d %d\n",i,j,k1,k2,k3);
							map[bluedoor[k3].x][bluedoor[k3].y]=0;
							init();//初始化逻辑
							dynamic();//动态规划
							FILE* fp=fopen("debug.log","wb");
							for(int i=0;i<524288;i++)
								if(allstatus[i])
								fprintf(fp,"%x %d %d %d %d %d\n",i,atk0[i],dex0[i],mdef[i],extrahp[i],allstatus[i]);
							int tmp=check();
							if(tmp>0){out(tmp);
							printf("\n破墙%d %d 黄门%d %d 蓝门 %d\n",i,j,k1,k2,k3);}//输出,退出程序
							map[bluedoor[k3].x][bluedoor[k3].y]=13;
						}
						map[yellowdoor[k1].x][yellowdoor[k1].y]=12;
						map[yellowdoor[k2].x][yellowdoor[k2].y]=12;
						
					}
				map[i][j]=11;
			}
		}
	//大约50*6*3*18*2^18约等于3538944000有望通过穷举找到解。
}

内容索引:脚本资源,HTML,网页游戏,魔塔   运行方法:进入 src 或 build 目录,用浏览器(如IE9)打开 td.html 即可运行。   请注意,IE8不能运行本游戏,你必需按以上要求运行。   相关的技术说明:   1.本游戏完全使用 HTML5 / JavaScript / CSS 实现,没有用到 Flash、SilverLight 等技术。   2.这一个版本没有用到图片,游戏中的所有物品都是使用 HTML5 画出来的。   3.这一个版本部分地方为 IE9 做了专门的优化,可正常运行在 IE9 下。   脚本及资源目录说明:   /build 压缩后的可发布的文件   /screenshorts 屏幕截图   /src 源码   /css 样式表   /js JavaScripts 源文件   /tools 小工具、脚本      作弊方法:为方便测试,本游戏内置了几个作弊方法,如下:   1.增加 100 万金钱:[removed]_TD.cheat="money+";void(0);   2.难度增倍:[removed]_TD.cheat="difficulty+";void(0);   3.难度减半:[removed]_TD.cheat="difficulty-";void(0);   4.生命值恢复:[removed]_TD.cheat="life+";void(0);   5.生命值降为最低:[removed]_TD.cheat="life-";void(0);   在浏览器地址栏输入上面的“[removed]...;”并回车,即可实现作弊。   注意,以上作弊方法主要是为测试设计,正常游戏过程中请酌情使用,否则可能会降低游戏乐趣。   更新历史:   2010-12-29 根据网友建议,增加生命自动恢复功能(每隔 5 波生命恢复 5 点,每隔 10 波生命恢复 10 点)。调整参数,减小了激光枪的射程,增强了重机枪的威力。(v0.1.12)。   2010-12-18 添加新武器“激光枪”(v0.1.8.0)。   2010-12-12 暂停图片资源版本分支的开发,继续优化、开发圈圈版(v0.1.7.0)。   2010-11-28 第一个图片资源版本(v0.2.1.3267)。   2010-11-23 发布 圈圈版(v0.1.6.2970)。   2010-11-14 线上发布第一个版本。   2010-11-11 开始编写这个游戏。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值