我正在尝试创建一个基于文本的虚拟宠物护理游戏。我希望能够通过修改对象属性为您提供两只宠物(具有属性的对象)和与这些对象交互的函数。所以这就是我所拥有的:
//name[contains(text(), 'Other names')]/following-sibling::value[not(self)]/text()
当我运行代码时:
function Pet(pet_name){
this.pet_name = pet_name;
this.pet_hunger = Math.floor((Math.random() * 10) + 1);
this.pet_health = Math.floor((Math.random() * 10) + 1);
this.pet_happiness = Math.floor((Math.random() * 10) + 1);
this.feed = feed;
this.show = show;
}
pet1 = new Pet("Brian");
pet2 = new Pet("Lassy");
function feed(){
var amount = Math.floor((Math.random() *2) + 1);
this.pet_hunger = this.pet_hunger - amount;
if (this.pet_hunger < 0){
this.pet_hunger = 0;
}
this.show();
}
function show(){
var the_string = "";
if (this.pet_health === 0){
the_string = this.pet_name + " is dead!";
}
else {
the_string += "Name: " + this.pet_name;
the_string += "Hunger: " + this.pet_name;
the_string += "Health: " + this.pet_health;
the_string += "Happiness: " + this.pet_happinesss;
}
}
我收到以下内容:
console.log(pet1);
console.log(pet1.feed());
console.log(pet1);
所以我们可以看到{ pet_name: 'Brian',
pet_hunger: 4,
pet_health: 4,
pet_happiness: 10,
feed: [Function: feed],
show: [Function: show] }
undefined
{ pet_name: 'Brian',
pet_hunger: 2,
pet_health: 4,
pet_happiness: 10,
feed: [Function: feed],
show: [Function: show] }
函数正在运行。但是,我仍然不确定为什么undefined会显示。现在,我创建了一个名为feed
的函数。这应该显示四个人的统计数据(名字,饥饿,健康,幸福)。但是,当我尝试运行时:
show
我收到以下内容:
console.log(pet1.show);
console.log(pet1.feed());
console.log(pet1);
我不确定为什么我的[Function: show]
undefined
{ pet_name: 'Brian',
pet_hunger: 4,
pet_health: 1,
pet_happiness: 9,
feed: [Function: feed],
show: [Function: show] }
功能不起作用。我真的只是希望我的控制台干净利落:
名称:
饥饿:
健康:
幸福:
任何想法的家伙?
答案 0 :(得分:1)
例如,Feed方法可以是:
function feed(amountOfFood){
this.hunger += amountOfFood; //Same as this.hunger = this.hunger + amountOfFood;
}
然后,您可能会有一种方法可以让用户调用此方法,但我不确定您如何计划用户与游戏进行交互,因此无法解释更多......
答案 1 :(得分:1)
对于初学者,您可能想要跟踪每个属性的最小值(可能是0),最大值和当前值。从那里你只需要操纵当前值,例如
function Pet(name){
this.name = name;
this.maxHealth = Math.floor((Math.random() * 10) + 1);
this.currentHealth = this.maxHealth;
this.maxHappiness = Math.floor((Math.random() * 10) + 1);
this.currentHappiness = this.maxHappiness;
this.maxHunger = Math.floor((Math.random() * 5) + 1);
this.currentHunger = 0;
this.feed = function(amount = 1) {
if (amount > this.currentHunger) {
this.currentHunger = 0;
} else {
this.currentHunger -= amount;
}
};
}
答案 2 :(得分:1)
JavaScript具有基于原型的继承。当您执行pet1.something
之类的操作时,它会查看pet1实例以查看它是否具有名为something
的属性。如果没有,它会查看objet的原型,看它是否有一个名为something
的问题。如果没有,它会检查原型的原型,依此类推。
提供对象方法的智能方法就像在基于类的对象编程中一样,是为原型提供方法。
Pet.prototype.feed = function() {
this.nutrition += 20;
}; //note the semicolumn
如果你在构造函数中声明函数,每个宠物将拥有自己的每个函数的副本,它无缘无故地占用内存。有些特殊情况可能会有用,但在您的情况下,坚持原型方式。
或许更好的feed
功能可确保您不会过度喂食宠物。
Pet.prototype.feed = function() {
this.nutrition += 20;
if(this.nutrition > 100) {
this.health -= 10;
this.nutrition = 100;
this.say("I ate too much :S");
}
};
您可能希望存储不同统计信息的最大值和最小值。例如,如果任何值达到0,宠物就会死亡,但如果宠物的能量低于10,它就会入睡,如果它的饥饿或情绪低于10,它的健康状况会受到影响,依此类推。反之亦然,吃太多的宠物可能会生病。
那些告诉哪些值很重要的常量可以保存在构造函数本身中。您可能希望在每个子对象中存储多个值,如果该值低于该常量,那么您的宠物可能会要求您提供食物,睡眠等。
Pet.maxAny = 100;
Pet.hungerCaps = {good: 80, ok: 50, need: 30, bad: 20};
Pet.sleepCaps = {good: 50, ok: 40, need: 30, bad: 20};
Pet.moodCaps = {good: 80, ok: 60, need: 40, bad: 30};
然后你可以制作一个随时间推移降低所有统计数据的功能。我会让你考虑一下这段时间:))