Android Tamgotchi类应用程序日/夜循环

Android Tamgotchi类应用程序日/夜循环,android,calendar,Android,Calendar,为了学习android,我正在制作一个类似tamagotchi的应用程序。它的食物等级每小时降低1,所以如果你几个小时不给它喂食,它就会死亡。我还发现在晚上8点到早上8点之间它睡着了。只是有个问题。要将其状态更改为睡眠,您需要在晚上8点到早上8点之间打开应用程序。这就产生了以下问题: 如果你给它喂食,比如说在晚上7点,睡觉前1小时,你在晚上8点到早上8点之间不打开应用程序,但是在第二天早上9点,他认为13小时已经过去了,而不是1小时(他不应该计算睡眠时间)。你们有什么建议吗 这是困倦和衰败的代码

为了学习android,我正在制作一个类似tamagotchi的应用程序。它的食物等级每小时降低1,所以如果你几个小时不给它喂食,它就会死亡。我还发现在晚上8点到早上8点之间它睡着了。只是有个问题。要将其状态更改为睡眠,您需要在晚上8点到早上8点之间打开应用程序。这就产生了以下问题:

如果你给它喂食,比如说在晚上7点,睡觉前1小时,你在晚上8点到早上8点之间不打开应用程序,但是在第二天早上9点,他认为13小时已经过去了,而不是1小时(他不应该计算睡眠时间)。你们有什么建议吗

这是困倦和衰败的代码

public void checkSleepyTime()
{
    c = Calendar.getInstance();

    int hour = c.get(Calendar.HOUR_OF_DAY);
    int daypart = c.get(Calendar.AM_PM);
    if (hour >= 20 && daypart == 1)
    {
        foodButton.setText("ZZzz");
        prefs.edit().remove("foodTime").commit();
        buddy.setSleeping(true);
    }

    else
    {
        foodButton.setText("Awake");
        buddy.setSleeping(false);
    }
}

public void initBuddy()
{
debugView.setText(“FoodLevel:+buddy.getFoodLevel());
如果(!buddy.getSleeping()&&buddy.getAlive())
{
long currentTime=prefs.getLong(“currentTime”,getcurrentTime());
long foodTime=prefs.getLong(“foodTime”,getCurentTime());
while(食物时间<当前时间)
{
如果(当前时间-食物时间>=一小时)
{
老兄,腐败食品();
}
foodTime=foodTime+一小时;
}
}

如果上次喂食后的时间比睡眠时间长,请检查预期睡眠时间是否在该时间内。然后采取相应行动(快速破解方法是将睡眠时间添加到上次喂食的时间中)。同时检查喂食后的时间是否超过一天。类似如下:

if (currentTime - foodTime >= ONE_HOUR)
{
  if (currentTime - foodTime >= WHOLE_NIGHT &&   sleepPeriodFitsInBetween(foodTime, currentTime))
  {
    foodTime+=WHOLE_NIGHT;
    int numberOfFullDays=countNumberOfDays(currentTime - foodTime);
    if(numberOfFullDays>1)
    {
        currentTime+=numberOfFullDays*(24-WHOLE_HIGHT); // assuming WHOLE_NIGHT is in hours.

    }
  }
  ...
}

我现在有以下两种方法来获取当前时间和关闭时间(保存在onStop();)中,并将其转换为天/周/月/年。我想检查关闭时间和当前时间之间有多少个夜晚,但我不确定如何处理这些信息。有人能为我指出正确的方向吗

    public void checkSleepTimes()
{
    closeCalendar = timeHelper.convertLongToCal(loadCloseTime());
    closeArray = loadDateArrayList(closeArray, closeCalendar);

    currentCalendar = timeHelper.convertLongToCal(getCurentTime());
    closeArray = loadDateArrayList(currentArray, currentCalendar);

    long curTime = getCurentTime();
    int times = 0;
    long totalSleepTime = 0;
    while (closeTime < curTime)
    {
            closeTime = closeTime + WHOLE_DAY;
            times ++;

    }
    //TODO Check how many times it was between 08:00 and 20:00
    totalSleepTime = SLEEP_TIME * times; // not sure if correct approach
}

public ArrayList loadDateArrayList(ArrayList arrayList, Calendar calendar)
{
    arrayList.add(0,calendar.DATE);
    arrayList.add(1,calendar.WEEK_OF_YEAR);
    arrayList.add(2,calendar.MONTH);
    arrayList.add(3,calendar.YEAR);
    return arrayList;
}
public void checkSleepTimes()
{
closeCalendar=timeHelper.convertLongToCal(loadCloseTime());
closeArray=loadDateArrayList(closeArray,closeCalendar);
currentCalendar=timeHelper.convertLongToCal(getCurentTime());
closeArray=loadDateArrayList(currentArray,currentCalendar);
long curTime=getCurentTime();
整数倍=0;
长总睡眠时间=0;
while(关闭时间<缩短时间)
{
关闭时间=关闭时间+一整天;
时代++;
}
//TODO检查在08:00和20:00之间发生了多少次
totalSleepTime=SLEEP\u TIME*times;//不确定方法是否正确
}
公共ArrayList loadDateArrayList(ArrayList ArrayList,日历)
{
arrayList.add(0,calendar.DATE);
arrayList.add(1,日历,每年的星期);
arrayList.add(2,日历月);
arrayList.add(3,日历年);
返回数组列表;
}

听起来像是一个计划。只有一个问题。如果我两天都不启动应用程序,食物会不会保持不变?因为42小时比整晚大。这取决于你如何设置currentTime和foodTime。如果它们距离某个起始点只有几小时,那么你只需要每24小时添加一整晚。嗯,我是bit卡住。我想做的是,当应用程序启动时,它会检查上一次foodtime的时间是否为20:00。要做到这一点,我想使用Calendar,如果使用feed方法,则将其保存到sharedPRefs。只是我无法在prefs中获取日历。我知道我必须将其转换为long,而不是保存毫秒,但不知道如何更轻松地保存当您有一个整数时,计算完整天数。例如,整数包含小时数fullDays=totalTime%24。但是,您的代码似乎已经在这样做了。如果它工作正常,“times”应该是完整天数。
    public void checkSleepTimes()
{
    closeCalendar = timeHelper.convertLongToCal(loadCloseTime());
    closeArray = loadDateArrayList(closeArray, closeCalendar);

    currentCalendar = timeHelper.convertLongToCal(getCurentTime());
    closeArray = loadDateArrayList(currentArray, currentCalendar);

    long curTime = getCurentTime();
    int times = 0;
    long totalSleepTime = 0;
    while (closeTime < curTime)
    {
            closeTime = closeTime + WHOLE_DAY;
            times ++;

    }
    //TODO Check how many times it was between 08:00 and 20:00
    totalSleepTime = SLEEP_TIME * times; // not sure if correct approach
}

public ArrayList loadDateArrayList(ArrayList arrayList, Calendar calendar)
{
    arrayList.add(0,calendar.DATE);
    arrayList.add(1,calendar.WEEK_OF_YEAR);
    arrayList.add(2,calendar.MONTH);
    arrayList.add(3,calendar.YEAR);
    return arrayList;
}