Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/326.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何根据用户输入动态选择某个对象,然后使用其他方法更改该特定对象?_Java_Android - Fatal编程技术网

Java 如何根据用户输入动态选择某个对象,然后使用其他方法更改该特定对象?

Java 如何根据用户输入动态选择某个对象,然后使用其他方法更改该特定对象?,java,android,Java,Android,嗨,我目前正在编写一个虚拟宠物风格的应用程序,我已经为宠物的基础创建了一个名为Pet.Class的类 package com.grim.droidchi; public class Pet { public static int Health = 100; public static int Happiness = 10; public static int Level = 1; public static int Hunger = 0; pu

嗨,我目前正在编写一个虚拟宠物风格的应用程序,我已经为宠物的基础创建了一个名为Pet.Class的类

    package com.grim.droidchi;

public class Pet {

    public static int Health = 100;
    public static int Happiness = 10;
    public static int Level = 1;
    public static int Hunger = 0;
    public static int Exp = 0;
    public static String Name;
    public static Boolean isAlive = true;
    public static Boolean isSick = false;

    public Pet(int startHealth, int startLevel, int startHunger) {

    }

   }
还有一个“Dog”类,它扩展了基本的pet类

package com.grim.droidchi;


public class Dog extends Pet {

    public Dog(int startHealth, int startLevel, int startHunger) {
        super(startHealth, startLevel, startHunger);

    }

}
每隔30分钟,AlarmManager就会触发我的Gameloop.class

package com.grim.droidchi;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.media.MediaPlayer;
import android.util.Log;
import android.widget.TextView;

public class Gameloop extends BroadcastReceiver {
    MediaPlayer mp = null;
    private static final String TAG = "VPET";

    @Override
    public void onReceive(Context context, Intent intent) {
        Log.d(TAG, "Loop running");
        if (Pet.isAlive == true) {
            Pet.Hunger = Pet.Hunger + 1;
            Pet.Exp = Pet.Exp + 2;
            Pet.Happiness = Pet.Happiness - 1;

            mp = MediaPlayer.create(context, R.raw.beep);
            mp.start();
            petLevel();
            petStatus();
            randomEncounters();
        } else {

        }
    }

    private void petLevel() {


    }

    private void randomEncounters() {
        if (Math.random() < 0.20) {
            Pet.isSick = true; 

        }

    }

    private void petStatus() {
        if (Pet.Hunger > 7) {
            Pet.isAlive = false;

        } 

    }

}
package com.grim.droidchi;
导入android.content.BroadcastReceiver;
导入android.content.Context;
导入android.content.Intent;
导入android.media.MediaPlayer;
导入android.util.Log;
导入android.widget.TextView;
公共类Gameloop扩展了广播接收器{
MediaPlayer mp=null;
私有静态最终字符串TAG=“VPET”;
@凌驾
公共void onReceive(上下文、意图){
Log.d(标记“循环运行”);
如果(Pet.isAlive==true){
宠物饥饿=宠物饥饿+1;
宠物实验=宠物实验+2;
宠物幸福=宠物幸福-1;
mp=MediaPlayer.create(上下文,R.raw.beep);
mp.start();
petLevel();
petStatus();
随机遭遇();
}否则{
}
}
私有级别(){
}
私有void(){
if(Math.random()<0.20){
Pet.isSick=true;
}
}
私有状态(){
如果(宠物饥饿>7){
Pet.isAlive=false;
} 
}
}
如何让Gameloop中的操作取决于用户选择的特定宠物?(假设我创建更多宠物类型。)

另外,作为对这个问题的补充,实现让UI始终保持Gameloop类的最新状态的最佳方法是什么

任何帮助都将不胜感激。我仍在学习Java和Android,有时甚至在所有好的学习材料中也很难找到具体的问题/答案

谢谢。

有关宠物类型:

if (pet instanceof Dog)
要更新UI,请定义一个接口。请看我的回答:

这是一个不同的场景,但很容易适应

[编辑]

instanceof
通常是设计不佳的标志

试试这个:

public void feed(Pet pet, int foodAmount){
        pet.feed(foodAmount);
}

public class Pet{       
}

public class Dog extends Pet{
    public void feed(int foodAmount){
        // feed like a dog
    }
}


public class Cat extends Pet{
    public void feed(int foodAmount){
        // feed like a cat
    }
}

然后只需使用宠物饲料(10)

使用instanceof,真的吗?除非绝对必要,否则应避免这样做。继承在这里是一个更好的答案。谢谢,我想你回答了另一个我还没有问过的问题哈哈,我的意思是,例如,如果我有狗、马、鱼、大脚怪作为选择,而用户选择了大脚怪,那么我如何让游戏循环与大脚怪对象一起接收?或者我的游戏循环中会有很多if语句吗?事实上,我已经(再次感谢你,我确实明白了)看到了你的另一个答案,但事实上,如果我没有太多的经验,除了我所学的和你们所教的以外,尝试如何适应我的情况,这确实有点吓人。Gabe的意思是,instanceof很好用,但它通常是“掩盖裂缝”。最好使用重载方法,我已经编辑了我的答案。请再次阅读我关于使用接口的答案。适应起来真的很简单。事实上,您可能只需要更改传递给onReceived回调的参数。嗨,Simon,谢谢。我将接受您的答案,尽管它对我来说没有意义,但这并不意味着它是错误的,再次感谢您。