JavaScript虚拟宠物

时间:2015-05-04 21:57:18

标签: javascript function object properties constructor

我正在尝试创建一个基于文本的虚拟宠物护理游戏。我希望能够通过修改对象属性为您提供两只宠物(具有属性的对象)和与这些对象交互的函数。所以这就是我所拥有的:

//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] } 功能不起作用。我真的只是希望我的控制台干净利落: 名称: 饥饿: 健康: 幸福: 任何想法的家伙?

3 个答案:

答案 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};

然后你可以制作一个随时间推移降低所有统计数据的功能。我会让你考虑一下这段时间:))