【发布时间】:2015-02-28 14:25:12
【问题描述】:
我正在使用 javascript/html 开发游戏。我有很多按钮,它们都使用相同的功能,但里面的值不同。
我有 32 个按钮,这意味着 32 个函数,这些函数的作用完全相同,只是它们使用不同的变量/值。
我正在考虑使用对象/数组,并在对象中放置一个函数,然后重用它来更改其变量,但我不知道这是否可能,或者这是一个好主意。
我还是新手。这些按钮用于“攻击”怪物,每个按钮都不同,即“统计/健康/伤害”。
我的按钮名为“attack1/attack2/”,功能为“attack1/attack2”。每次我想添加怪物时,我都会复制整个函数并更改其值,这并不难,但考虑到我想更改伤害公式,我需要更改所有 32 个函数,这不是我想做的。
我已经创建了一个对象,我在其中使用数组存储所有怪物数据。
最后,我不是以英语为母语的人,如果您看不懂我,请见谅。让我知道是否有任何方法可以帮助您更好地理解它。
谢谢
var monsterStats = {
killed: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
hp: [10, 30, 70, 130, 190, 280, 380, 500, 700, 900, 1300, 1600, 2200, 2600,
3000, 4000, 5000, 7000, 9000, 12000, 15000, 18000, 22000, 28000, 34000, 40000,
48000, 570000, 65000, 72000, 80000, 88000],
maxHp: [10, 30, 70, 130, 190, 280, 380, 500, 700, 900, 1300, 1600, 2200,
2600, 3000, 4000, 5000, 7000, 9000, 12000, 15000, 18000, 22000, 28000, 34000,
40000, 48000, 570000, 65000, 72000, 80000, 88000],
def: [0, 2, 4, 6, 9, 13, 18, 25, 30, 38, 45, 53, 65, 75, 88, 95, 120, 140,
170, 200, 220, 250, 300, 400, 500, 700, 1000, 1200, 2000, 2500, 3000],
minDmg: [2, 2, 4, 6, 9, 13, 18, 25, 32, 40, 50, 60, 75, 86, 96, 105, 140,
160, 200, 230, 260, 290, 350, 420, 500, 900, 1200, 1700, 2500, 3200, 4500,
6000],
maxDmg: [3, 5, 7, 10, 14, 19, 23, 30, 37, 45, 58, 67, 80, 92, 100, 110,
160, 185, 215, 250, 275, 320, 380, 550, 700, 1200, 1500, 2200, 3000, 4000,
5500, 8000],
baseExp:[5, 10, 30, 50, 90, 140, 190, 260, 340, 450, 560, 700, 810, 940,
1060, 1200, 1600, 2150, 2600, 3400, 5000, 7000, 10000, 15000, 23000, 35000,
70000, 120000, 180000, 290000, 430000, 680000, 1000000]
};
function attack(number) {
if (monsterStats.hp[0] >= 1) {
var damage = Math.floor(Math.random() * (maxdamage - mindamage + 1)) +
mindamage;
damage = Math.floor(damage - monsterStats.def[0] * 1.2);
if (damage > 1) {
monsterStats.hp[0] -= damage;
document.getElementById("hp1").innerHTML = monsterStats.hp[0];
Log("You deal " + damage + " <span style=\"color:blue\">damage</span>");
} else Log("<span style=\"color:blue\">Enemy block your attack! </span>");
var dmg = Math.floor(Math.random() * (monsterStats.maxDmg[0] - monsterStats.minDmg[0] + 1)) + monsterStats.minDmg[0];
dmg = Math.floor(dmg - defense * 1.2);
if (dmg > 1) {
health = health - dmg;
document.getElementById("health").innerHTML = health;
Log("Enemy hit you for " + dmg + " <span style=\"color:red\">damage</span>");
} else Log("<span style=\"color:green\">You blocked enemy attack! </span>");
if (health < 1) {
monsterStats.hp[0] = monsterStats.maxHp[0];
health = maxhealth;
document.getElementById("hp1").innerHTML = monsterStats.hp[0];
document.getElementById("health").innerHTML = health;
Log("<span style=\"color:blue\">You have lost!</span>");
}
if (monsterStats.hp[0] < 1) {
monsterStats.killed[0] = monsterStats.killed[0] + 1;
monsterStats.hp[0] = monsterStats.maxHp[0];
document.getElementById("hp1").innerHTML = monsterStats.hp[0];
document.getElementById("kills1").innerHTML = monsterStats.killed[0];
var expgain = monsterStats.baseExp[0] / (level / 5);
if (experience < maxexperience) {
experience = Math.floor(experience + expgain);
if (experience >= maxexperience) {
level += 1;
stats += 2;
experience = experience - maxexperience;
maxexperience = Math.floor(maxexperience * 1.2);
Log("You leveled up! Your current level is: " + level);
document.getElementById("maxexperience").innerHTML = maxexperience;
document.getElementById("level").innerHTML = level;
document.getElementById("stats").innerHTML = stats;
document.getElementById("experience").innerHTML = experience;
} else Log("You gain: " + Math.floor(expgain) + "experience!");
document.getElementById("experience").innerHTML = experience;
}
var goldLog = 0;
var golddrop = Math.floor((Math.random() * 100) + 1);
if (golddrop > 95) {
golddrop = Math.floor((Math.random() * 20) + 1);
gold = gold + golddrop;
Log("You loot: " + golddrop + "gold!");
document.getElementById("gold").innerHTML = gold;
} else if (golddrop >= 75) {
golddrop = Math.floor((Math.random() * 10) + 1);
gold = gold + golddrop;
Log("You loot: " + golddrop + "gold!");
document.getElementById("gold").innerHTML = gold;
} else if (golddrop >= 60) {
golddrop = Math.floor((Math.random() * 5) + 1);
gold = gold + golddrop;
Log("You loot: " + golddrop + "gold!");
document.getElementById("gold").innerHTML = gold;
}
"This is <span style=\"color:red\">RED</span> text.";
var itemdrop = Math.floor((Math.random() * 100) + 1);
if (itemdrop < 33) {
var fusiondrop = Math.floor((Math.random() * 100) + 1);
if (fusiondrop < 70) {
common = common + 1;
Log("You loot:<span style=\"color:grey\">Common</span> Fusion stone!");
document.getElementById("common").innerHTML = common;
} else if (fusiondrop <= 100) {
rare = rare + 1;
Log("You loot:<span style=\"color:blue\">Rare</span> Fusion stone!");
document.getElementById("rare").innerHTML = rare;
}
} else if (itemdrop < 66) {
var expdrop = Math.floor((Math.random() * 100) + 1);
if (expdrop < 70) {
commonexp = commonexp + 1;
Log("You loot:<span style=\"color:grey\">Common</span> Exp orb!");
document.getElementById("commonexp").innerHTML = commonexp;
} else if (expdrop <= 100) {
rareexp = rareexp + 1;
Log("You loot:<span style=\"color:blue\">Rare</span> Exp orb!");
document.getElementById("rareexp").innerHTML = rareexp;
}
} else {
var golddrop = Math.floor((Math.random() * 100) + 1);
if (golddrop < 70) {
commongold = commongold + 1;
Log("You loot:<span style=\"color:grey\">Common</span> Gold orb!");
document.getElementById("commongold").innerHTML = commongold;
} else if (golddrop <= 100) {
raregold = raregold + 1;
Log("You loot:<span style=\"color:blue\">Rare</span> Gold orb!");
document.getElementById("raregold").innerHTML = raregold;
}
}
}
}
}
这是代码的一部分,我用了这个代码 32 次。
【问题讨论】:
-
这就是函数参数的用途。
-
正是@Barmar 所说的。您可以将其简化为
attack(1);和attack(2);,而不是使用attack1()和attack2() -
您可以拥有一个名为
attack(id)的函数,当用户单击button1 时,通过传递适当的id、attack(1)来调用该函数。让attack函数内的代码创建一个monster并将其添加到全局数组array.push(monster)。说了这么多,请贴出相关的代码,你试过的,以便更正和改进.. -
嘿,谢谢你的回答,我把代码放在我的问题中。我不确定我为什么要使用
array.push(monster)。如果我的代码可以帮助您理解我的问题,请告诉我。
标签: javascript arrays performance function javascript-objects