Quenya 发表于 2021-12-9 00:55:19

[已解决]设计虚拟猫|定时器如何使用|threading.Timer

本帖最后由 Quenya 于 2022-1-5 12:28 编辑

【第二次编辑·新问题】
没有人回复QAQ
我自己摸索得差不多了。但是还有一个问题搞不好:
原来的要求中:“l 如果饥饿指数在大于 80,或低于 20 即过饱,则每个滴答,健康指数将减去 2
l 如果幸福指数低于 20,则每个滴答,健康指数将减去 1”在考虑睡眠和醒着自动交替时如何实现?(如下,代码由四个井号开头####的地方)

求大佬帮看哇


print('我的名字叫Tommy,一只可爱的猫咪....\n你可以和我一起散步,玩耍,\
你也需要给我好吃的东西,带我去看病,也可以让我发呆.....\Commands:\n1.walk:散步\n2.play:玩耍\
\n3.feed:喂我\n4.seedoctor:看医生\n5.letalone:让我独自呆着\
\n6.status:查看我的状态\n7.bye:不想看到我\n')        #打招呼、说明指令

commandList=['walk','play','feed','seedoctor','letalone','status','bye']#指令列表
import random
state_list=['我醒着但很无聊...','我在玩耍...','我在吃饭...','我在散步...','我在睡觉...','我在看医生...']#状态列表
#cat_state=state_list#随机给个状态
cat_state='我在睡觉...'
value_list=#随机选择三个指数的初始值
happy_value=random.choice(range(1,101))
hungry_value=random.choice(range(1,101))
healthy_value=random.choice(range(1,101))
      
import threading
import time

day_count=0

def fun_timer():
    global timer,hours,day_count
    hours+=1
    if hours >23:
      hours=0
      day_count=day_count+1#如果下达指令后跨日期
   
    timer = threading.Timer(5.0, fun_timer)#5s执行一次fun_timer
    timer.start()

def main():
    global hours
    global happy_value,hungry_value,healthy_value,day_count,cat_state

    hours = 0
    fun_timer()#启动定时器
#打开时自动报告状态和数值
    print('当前的时间:%-2d点'%hours,'\n我当前的状态:',cat_state,sep='')
    print('Happiness: Sad ','*'*(happy_value//2),'-'*(50-happy_value//2),'Happy(%03d)'%happy_value,'\nHungry: Full ',
          '*'*(hungry_value//2),'-'*(50-hungry_value//2),'Hungry(%03d)'%hungry_value,'\nHealth: Sick ',
          '*'*(healthy_value//2),'-'*(50-healthy_value//2),'Healthy(%03d)'%healthy_value,sep='')

    while True:
      startTime=hours#记录开始时间
      command=input('你想:')
      
      cs_map={'walk':'我在散步...','play':'我在玩耍...','feed':'我在吃饭...','seedoctor':'我在看医生...','letalone':'我醒着但很无聊...'}

      if command=='bye':
            print('记得来找我!Bye!')##要存放到文件
            break
      elif command not in commandList and command !='status':#错误指令
            print('听不懂~')
      elif command !='status'and cs_map is cat_state:#指令和当前状态吻合
            print('已经照办啦')
      
      else: #如果指令正确,改变状态或查询状态
            changeTime=hours#记录状态改变时间
            
            while 0<=hours<8 and (cat_state=='我醒着但很无聊...' or cat_state=='我在睡觉...'):#晚上没事干,入睡;如果23点还有事干就不主动睡觉
                cat_state='我在睡觉...'#前提保证changeTime<8,所以:
                if startTime<8:                  
                  asleep_time=changeTime-startTime+8*day_count #考虑跨日#睡觉总时长
                  hungry_value+=asleep_time#睡着状态,每个滴答饥饿指数加1
                  
                  awake_time=16*day_count#醒着什么也不做总时长(如果有跨日期
                  hungry_value+=2*awake_time
                  happy_value-=awake_time#醒着,每个滴答饥饿加2幸福减1

####如果饥饿、、如果幸福、、、##跨天不好计算#
                  #if hungry_value>80:
                        ##healthy_value-=80-hungry_value+2*awake_time
                  #if hungry_value<20+2*awake_time:
                        ##healthy_value-=20-hungry_value+2*awake_time#如果饥饿> 80或<20 ,则每个滴答健康减2;
                  if happy_value<20:
                        healthy_value-=happy_value+awake_time-20#如果幸福指数低于 20,则每个滴答健康指数将减1
                  #保证数值不超出范围
                  if hungry_value>=100:
                        hungry_value=100
                  if happy_value<0:
                        happy_value=0
                  if healthy_value<0:
                        healthy_value=0
                else:#startTime>=8时
                  asleep_time=changeTime+8*(day_count-1) #考虑跨日#睡觉总时长
                  hungry_value+=asleep_time#睡着状态,每个滴答饥饿指数加1
                                          
                  awake_time=24-startTime+16*(day_count-1)#醒着什么也不做总时长,定有跨日期
                  hungry_value+=2*awake_time
                  happy_value-=awake_time#醒着,每个滴答饥饿加2幸福减1
                  #如果饥饿、、如果幸福、、、#
                  if hungry_value>80:
                        healthy_value-=80-hungry_value+2*awake_time
                  if hungry_value<20+2*awake_time:
                        healthy_value-=20-hungry_value+2*awake_time#如果饥饿> 80或<20 ,则每个滴答健康减2;
                  if happy_value<20:
                        healthy_value-=happy_value+awake_time-20#如果幸福指数低于 20,则每个滴答健康指数将减1
                  #保证数值不超出范围
                  if hungry_value>=100:
                        hungry_value=100
                  if happy_value<0:
                        happy_value=0
                  if healthy_value<0:
                        healthy_value=0
                        
                #如果指令是查看状态
                while command=='status':
                  print('当前的时间:%-2d点'%hours,'\n我当前的状态:',cat_state,sep='')
                  print('Happiness: Sad ','*'*(happy_value//2),'-'*(50-happy_value//2),'Happy(%03d)'%happy_value,sep='')
                  print('Hungry: Full ','*'*(hungry_value//2),'-'*(50-hungry_value//2),'Hungry(%03d)'%hungry_value,sep='')
                  print('Health: Sick ','*'*(healthy_value//2),'-'*(50-healthy_value//2),'Healthy(%03d)'%healthy_value,sep='')
                  
                  day_count=0#状态数据已更新,重新计开始时间
                  break
               
                #如果指令是改变状态
                while command=='walk':
                  print('我在睡觉,一定要我散步吗?输入yes确认')#睡觉状态活动先提醒
                  command_confirm=input()
                  if command_confirm=='yes':                        
                        cat_state='我在散步...'                        
                        day_count=0
                        happy_value-=4 #坚持活动幸福减4
                        if happy_value<0:
                            happy_value=0
                  break
               
                while command=='play':
                  print('我在睡觉,一定要我玩耍吗?输入yes确认')#睡觉状态活动先提醒
                  command_confirm=input()
                  if command_confirm=='yes':
                        #print('我在玩耍...')为什么这里会自动打印cat_state不需要print这句?
                        cat_state='我在玩耍...'                        
                        day_count=0
                        happy_value-=4
                        if happy_value<0:
                            happy_value=0
                  break
               
                while command=='feed':
                  print('我在睡觉,一定要我吃饭吗?输入yes确认')#睡觉状态活动先提醒
                  command_confirm=input()
                  if command_confirm=='yes':
                        #print('我在吃饭...')
                        cat_state='我在吃饭...'                        
                        day_count=0
                        happy_value-=4
                        if happy_value<0:
                            happy_value=0
                  break
               
                while command=='seedoctor':
                  print('我在睡觉,一定要我看医生吗?输入yes确认')#睡觉状态活动先提醒
                  command_confirm=input()
                  if command_confirm=='yes':
                        #print('我在看医生...')
                        cat_state='我在看医生...'                        
                        day_count=0
                        happy_value-=4
                        if happy_value<0:
                            happy_value=0
                  break                  
                break

            while hours>=8 or (hours<8 and cat_state!='我在睡觉...'):#白天或者晚上有事情干
                if cat_state=='我在睡觉...':#说明已经是白天hours>=8,醒来
                  cat_state='我醒着但很无聊...'

                if cat_state=='我醒着但很无聊...':#肯定是白天hours>=8                  
                  asleep_time=8*(day_count+1)-startTime #睡着,考虑跨日
                  hungry_value+=asleep_time#睡着状态,每个滴答饥饿指数加1
                  if hungry_value>80:
                        healthy_value-=2*(80-hungry_time+asleep_time)
                  if hungry_value<20+asleep_time:
                        healthy_value-=2*(20-hungry_value+asleep_time)#如果饥饿> 80或<20 ,则每个滴答健康减2;
                  awake_time=16*day_count+changeTime-8#醒着什么也不做总时长(如果有跨日期
                  hungry_value+=2*awake_time
                  happy_value-=awake_time#醒着,每个滴答饥饿加2幸福减1
                  if hungry_value>80:
                        healthy_value-=80-hungry_value+2*awake_time
                  if hungry_value<20+2*awake_time:
                        healthy_value-=20-hungry_value+2*awake_time#如果饥饿> 80或<20 ,则每个滴答健康减2;
                  if happy_value<20:
                        healthy_value-=happy_value+awake_time-20#如果幸福指数低于 20,则每个滴答健康指数将减1
                  #保证数值不超出范围
                  if hungry_value>=100:
                        hungry_value=100
                  if happy_value<0:
                        happy_value=0
                  if healthy_value<0:
                        healthy_value=0
                  
                        
                elif cat_state=='我在散步...':
                  walk_time=24*day_count+changeTime-startTime
                  hungry_value+=3*walk_time
                  healthy_value+=walk_time
                  #如果饥饿> 80或<20 ,则每个滴答健康减2
                  if hungry_value>80:
                        healthy_value-=2*(80-hungry_value+3*walk_time)//3
                  if hungry_value-3*walk_time<20:
                        healthy_value-=2*(20-hungry_value+3*walk_time)//3
                  #控制范围
                  if hungry_value>=100:
                        hungry_value=100
                  if healthy_value>=100:
                        healthy_value=100
                  if healthy_value<0:
                        healthy_value=0
                        
                elif cat_state=='我在玩耍...':
                  play_time=24*day_count+changeTime-startTime
                  hungry_value+=3*play_time
                  happy_value+=play_time
                  #如果饥饿> 80或<20 ,则每个滴答健康减2
                  if hungry_value>80:
                        healthy_value-=2*(80-hungry_value+3*walk_time)//3
                  if hungry_value-3*walk_time<20:
                        healthy_value-=2*(20-hungry_value+3*walk_time)//3
                  #如果幸福<20,每个滴答健康减2
                  if happy_value-play_time<20:
                        healthy_value-=2*(20-happy_value+play_value)
                  #控制范围
                  if hungry_value>=100:
                        hungry_value=100
                  if happy_value>=100:
                        happy_value=100
                  if healthy_value<0:
                        healthy_value=0
                        
                elif cat_state=='我在看医生...':
                  treat_time=24*day_count+changeTime-startTime
                  healthy_value+=4*treat_time
                  if healthy_value>=100:
                        healthy_value=100                        
                else:#cat_state=='我在吃饭...':
                  eat_time=24*day_count+changeTime-startTime
                  hungry_value-=3*eat_time
                  if hungry_value<=0:
                        hungry_value=0
                  
                #如果指令是查看状态
                while command=='status':
                  print('当前的时间:%-2d点'%hours,'\n我当前的状态:',cat_state,sep='')
                  print('Happiness: Sad ','*'*(happy_value//2),'-'*(50-happy_value//2),'Happy(%03d)'%happy_value,sep='')
                  print('Hungry: Full ','*'*(hungry_value//2),'-'*(50-hungry_value//2),'Hungry(%03d)'%hungry_value,sep='')
                  print('Health: Sick ','*'*(healthy_value//2),'-'*(50-healthy_value//2),'Healthy(%03d)'%healthy_value,sep='')
                  
                  day_count=0#状态数据已更新,重新计开始时间
                  break
               
                #指令改变状态
                while command=='walk':
                  print('我在散步...')
                  cat_state='我在散步...'
                  
                  day_count=0
                  break
                while command=='play':
                  print('我在玩耍...')
                  cat_state='我在玩耍...'
                  
                  day_count=0
                  break
                while command=='feed':
                  print('我在吃饭...')
                  cat_state='我在吃饭...'
               
                  day_count=0
                  break
                while command=='letalone':
                  print('我醒着但很无聊...')
                  cat_state='我醒着但很无聊...'#如果是晚上本来在干事情就会回到强制入睡
               
                  day_count=0
                  break               
                while command=='seedoctor':
                  print('我在看医生...')
                  cat_state='我在看医生...'
                  
                  day_count=0
                  break                  
   
                break #回到whileTure重新开始计时
            #保存至文件,关闭#


   

if __name__ =="__main__":
    main()

——————————原帖分割线————————
要求是设计这样的一个虚拟猫:
猫一天分成 24 个部分,每一部分称为一个“滴答”,它在第 8 个滴答(8 点)醒来,第 24 个滴答(0 点)睡觉。

已经给出了定时器: 模拟做一个可以在 24 小时的时钟,每个滴答的实际时间是5s
如下:
def fun_timer():
    global timer,hours
    hours+=1
    if hours >23:
      hours=0
   
    timer = threading.Timer(5.0, fun_timer)#5s执行一次fun_timer,为什么要缩进
    timer.start()


def main():
    global hours

    hours = 0
    fun_timer()#启动定时器
    while True:
      print()
要求:
虚拟猫可以带它做散步(walk)、玩耍(play)、喂它吃东西(feed),带它看医生(see doctor)等活动。当这些活动结束的时候,你可以让它一个人呆一会,根据当前的时刻(几点),它将返回醒着什么都不做,或者睡觉状态。
3. 它有三个状态指数: 饥饿指数、幸福指数、健康指数,各指数的值在 0~100之间,各个指数根据虚拟猫 当前的状况发生变化,具体如下:
l 在醒着,什么事都不做的情况下,每个滴答,饥饿指数增加 2,幸福指数减少 1
l 在睡着状态,每个滴答,饥饿指数增加 1
l 在陪它散步状态,每个滴答,饥饿指数增加 3, 健康指数加 1
l 在陪它玩耍状态,每个滴答,饥饿指数增加 3,幸福指数增加 1
l 在喂食状态:每个滴答,饥饿指数则减少 3
l 如果饥饿指数在大于 80,或低于 20 即过饱,则每个滴答,健康指数将减去 2
l 如果幸福指数低于 20,则每个滴答,健康指数将减去 1l 如果带它去看医生,则每个滴答,健康指数将增加2
l 如果在睡觉状态,你要带它去活动,需要提醒,如果你坚持要带它去活动,幸福指数将减去 4。
4. 当你键入“bye”暂时关闭程序,你需要将 虚拟猫 的状态保存到文件(包括当前时刻,当前所处的状态,睡觉、散步等,各个状态指数),以便重新开始程序时,可以接着上次的状态开始你的游戏。
5. 当你键入“status“命令时,需要你用”*“和”-“字符(共计 50 个)模拟它的状态进度度,并给出当前状态指数的具体值

感谢看到这里!我尝试编的给在回复里,不知道哪里有问题,求教!

Quenya 发表于 2021-12-9 00:58:48

本帖最后由 Quenya 于 2021-12-9 01:07 编辑

虚拟猫的一天分成 24 个部分,每一部分称为一个“滴答”,它在第 8 个滴答(8 点)醒来,第 24 个滴答(0 点)睡觉。
已经有给的定时器,模拟做一个可以在 24 小时的时钟,每个滴答的实际时间是5s(但说实话我不懂这个怎么用,所以有后面的问题:
def fun_timer():
    global timer,hours
    hours+=1
    if hours >23:
      hours=0
   
    timer = threading.Timer(5.0, fun_timer)#5s执行一次fun_timer,为什么要缩进
    timer.start()


def main():
    global hours

    hours = 0
    fun_timer()#启动定时器
    while True:
      print()        #从这里
      command = input("Command:")
      if command == "print":
            print("Now is %-2d"%hours)
      elif command == "quit":
            print("Bye.....")
            timer.cancel()
            break        #到这里,是我们要改的


   

if __name__ =="__main__":
    main()


我尝试写的:(很长预警TAT
#虚拟宠物猫#
import random

import threading
import time

print('我的名字叫Tommy,一只可爱的猫咪....\n你可以和我一起散步,玩耍,\
你也需要给我好吃的东西,带我去看病,也可以让我发呆.....\Commands:\n1.walk:散步\n2.play:玩耍\
\n3.feed:喂我\n4.seedoctor:看医生\n5.letalone:让我独自呆着\
\n6.status:查看我的状态\n7.bye:不想看到我\n')        #打招呼、说明指令


def fun_timer():
    global timer,hours
    hours+=1
    if hours >23:
      hours=0
   
timer = threading.Timer(5.0, fun_timer)#5s执行一次fun_timer,#第二个参数注意是函数对象,进行参数传递,
#用函数名(如fun_timer)表示该对象,不能写成函数执行语句fun_timer()
timer.start()


def main():
    global hours

hours = 0
fun_timer()#启动定时器

#自动报告初始状态、随机数据
print('当前时间:%-2d'%hours)
if hours<8:
    print('我当前的状态:我在睡觉......')
else:
    status_list=['我醒着但很无聊...','我在玩耍...','我在吃饭...','我在散步...']
    r_status=random.choice(range(0,4))#随机挑选status_list中的一个状态
    print('我当前的状态:',status_list,sep='')
            
value_list=#随机选择三个指数的初始值
r1_value=random.choice(range(1,101))
print('Happiness: Sad ','*'*(r1_value//2),'-'*(50-r1_value//2),'Happy(%03d)'%r1_value,sep='')
r2_value=random.choice(range(1,101))
print('Hungry: Full ','*'*(r2_value//2),'-'*(50-r2_value//2),'Hungry(%03d)'%r2_value,sep='')
r3_value=random.choice(range(1,101))
print('Health: Sick ','*'*(r3_value//2),'-'*(50-r3_value//2),'Healthy(%03d)'%r3_value,sep='')
      
   
while True:

    command = input("Command:")
    if command == "walk":#指令为散步时
      new_status='我在散步...'
      print(new_status)
      
      def func_walk_hungry():
            global r2_value
            r2_value+=3
            if r2_value>100:
                r2_value=100
      hungry_value=threading.Timer(5.0,func_walk_hungry)#散步状态每个滴答饥饿指数增加3
      hungry_value.start()

      def func_walk_healty():
            global r3_value
            r3_value+=1
            if r3_value>100:
                r3_value=100   
      health_value=threading.Timer(5.0,func_walk_healty)#散步状态每个滴答健康指数增加1
      health_value.start()      
      
            
    elif command =='play':#指令为玩耍时
      new_status='我在玩耍...'
      print(new_status)
      
      def func_play_hungry():
            global r2_value
            r2_value+=3
            if r2_value>100:
                r2_value=100   
      hungry_value=threading.Timer(5.0,func_play_hungry)#玩耍状态每个滴答饥饿指数增加3
      hungry_value.start()      
                  
      def func_play_happy():
            global r1_value
            r1_value+=1
            if r1_value>100:
                r1_value=100   
      happy_value=threading.Timer(5.0,func_play_happy)#玩耍状态每个滴答幸福指数增加1
      happy_value.start()      
               
            
    elif command =='feed':#指令为吃饭时
      new_status='我在吃饭...'
      print(new_status)
            
      def func_feed_hungry():
            global r2_value
            r2_value-=3
            if r2_value<0:
                r2_value=0   
      hungry_value=threading.Timer(5.0,func_feed_hungry)#喂食状态每个滴答饥饿指数减少3
      hungry_value.start()         
            
    elif command == "bye":#指令为再见时,跳出循环
      print("记得来找我!Bye.....")
      timer.cancel()
      break
      
    else:
      if command=='status':#指令是查看状态时
            print('当前时间:%-2d'%hours)
            print('我当前的状态:',new_status)
         
            print('Happiness: Sad ','*'*(r1_value//2),'-'*(50-r1_value//2),'Happy(%03d)'%r1_value,sep='')
            print('Hungry: Full ','*'*(r2_value//2),'-'*(50-r2_value//2),'Hungry(%03d)'%r2_value,sep='')
            print('Health: Sick ','*'*(r3_value//2),'-'*(50-r3_value//2),'Healthy(%03d)'%r3_value,sep='')
      else:
            print('我不懂你在说什么')#收到错误指令时


if __name__ =="__main__":
    main()


但是没搞懂定时器怎么用,所以运行会出现主楼图片里的问题,时间只增加一次就不增加了:
页: [1]
查看完整版本: [已解决]设计虚拟猫|定时器如何使用|threading.Timer