鱼C论坛

 找回密码
 立即注册
查看: 1092|回复: 1

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

[复制链接]
发表于 2021-12-9 00:55:19 | 显示全部楼层 |阅读模式
10鱼币
本帖最后由 Quenya 于 2022-1-5 12:28 编辑

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

求大佬帮看哇


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

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

  17. day_count=0

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

  27. def main():
  28.     global hours
  29.     global happy_value,hungry_value,healthy_value,day_count,cat_state

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

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

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

  62. ####如果饥饿、、如果幸福、、、#  #跨天不好计算#
  63.                     #if hungry_value>80:
  64.                         ##healthy_value-=80-hungry_value+2*awake_time
  65.                     #if hungry_value<20+2*awake_time:
  66.                         ##healthy_value-=20-hungry_value+2*awake_time#如果饥饿> 80或<20 ,则每个滴答健康减2;
  67.                     if happy_value<20:
  68.                         healthy_value-=happy_value+awake_time-20#如果幸福指数低于 20,则每个滴答健康指数将减1
  69.                     #保证数值不超出范围[0,100]
  70.                     if hungry_value>=100:
  71.                         hungry_value=100
  72.                     if happy_value<0:
  73.                         happy_value=0
  74.                     if healthy_value<0:
  75.                         healthy_value=0
  76.                 else:#startTime>=8时
  77.                     asleep_time=changeTime+8*(day_count-1) #考虑跨日#睡觉总时长
  78.                     hungry_value+=asleep_time#睡着状态,每个滴答饥饿指数加1
  79.                                             
  80.                     awake_time=24-startTime+16*(day_count-1)#醒着什么也不做总时长,定有跨日期
  81.                     hungry_value+=2*awake_time
  82.                     happy_value-=awake_time#醒着,每个滴答饥饿加2幸福减1
  83.                     #如果饥饿、、如果幸福、、、#
  84.                     if hungry_value>80:
  85.                         healthy_value-=80-hungry_value+2*awake_time
  86.                     if hungry_value<20+2*awake_time:
  87.                         healthy_value-=20-hungry_value+2*awake_time#如果饥饿> 80或<20 ,则每个滴答健康减2;
  88.                     if happy_value<20:
  89.                         healthy_value-=happy_value+awake_time-20#如果幸福指数低于 20,则每个滴答健康指数将减1
  90.                     #保证数值不超出范围[0,100]
  91.                     if hungry_value>=100:
  92.                         hungry_value=100
  93.                     if happy_value<0:
  94.                         happy_value=0
  95.                     if healthy_value<0:
  96.                         healthy_value=0
  97.                         
  98.                 #如果指令是查看状态
  99.                 while command=='status':
  100.                     print('当前的时间:%-2d点'%hours,'\n我当前的状态:',cat_state,sep='')
  101.                     print('Happiness: Sad ','*'*(happy_value//2),'-'*(50-happy_value//2),'Happy(%03d)'%happy_value,sep='')
  102.                     print('Hungry: Full ','*'*(hungry_value//2),'-'*(50-hungry_value//2),'Hungry(%03d)'%hungry_value,sep='')
  103.                     print('Health: Sick ','*'*(healthy_value//2),'-'*(50-healthy_value//2),'Healthy(%03d)'%healthy_value,sep='')
  104.                     
  105.                     day_count=0#状态数据已更新,重新计开始时间
  106.                     break
  107.                
  108.                 #如果指令是改变状态
  109.                 while command=='walk':
  110.                     print('我在睡觉,一定要我散步吗?输入yes确认')#睡觉状态活动先提醒
  111.                     command_confirm=input()
  112.                     if command_confirm=='yes':                        
  113.                         cat_state='我在散步...'                        
  114.                         day_count=0
  115.                         happy_value-=4 #坚持活动幸福减4
  116.                         if happy_value<0:
  117.                             happy_value=0
  118.                     break
  119.                
  120.                 while command=='play':
  121.                     print('我在睡觉,一定要我玩耍吗?输入yes确认')#睡觉状态活动先提醒
  122.                     command_confirm=input()
  123.                     if command_confirm=='yes':
  124.                         #print('我在玩耍...')为什么这里会自动打印cat_state不需要print这句?
  125.                         cat_state='我在玩耍...'                        
  126.                         day_count=0
  127.                         happy_value-=4
  128.                         if happy_value<0:
  129.                             happy_value=0
  130.                     break
  131.                
  132.                 while command=='feed':
  133.                     print('我在睡觉,一定要我吃饭吗?输入yes确认')#睡觉状态活动先提醒
  134.                     command_confirm=input()
  135.                     if command_confirm=='yes':
  136.                         #print('我在吃饭...')
  137.                         cat_state='我在吃饭...'                        
  138.                         day_count=0
  139.                         happy_value-=4
  140.                         if happy_value<0:
  141.                             happy_value=0
  142.                     break
  143.                
  144.                 while command=='seedoctor':
  145.                     print('我在睡觉,一定要我看医生吗?输入yes确认')#睡觉状态活动先提醒
  146.                     command_confirm=input()
  147.                     if command_confirm=='yes':
  148.                         #print('我在看医生...')
  149.                         cat_state='我在看医生...'                        
  150.                         day_count=0
  151.                         happy_value-=4
  152.                         if happy_value<0:
  153.                             happy_value=0
  154.                     break                    
  155.                 break

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

  159.                 if cat_state=='我醒着但很无聊...':#肯定是白天hours>=8                    
  160.                     asleep_time=8*(day_count+1)-startTime #睡着,考虑跨日
  161.                     hungry_value+=asleep_time#睡着状态,每个滴答饥饿指数加1
  162.                     if hungry_value>80:
  163.                         healthy_value-=2*(80-hungry_time+asleep_time)
  164.                     if hungry_value<20+asleep_time:
  165.                         healthy_value-=2*(20-hungry_value+asleep_time)#如果饥饿> 80或<20 ,则每个滴答健康减2;
  166.                     awake_time=16*day_count+changeTime-8#醒着什么也不做总时长(如果有跨日期
  167.                     hungry_value+=2*awake_time
  168.                     happy_value-=awake_time#醒着,每个滴答饥饿加2幸福减1
  169.                     if hungry_value>80:
  170.                         healthy_value-=80-hungry_value+2*awake_time
  171.                     if hungry_value<20+2*awake_time:
  172.                         healthy_value-=20-hungry_value+2*awake_time#如果饥饿> 80或<20 ,则每个滴答健康减2;
  173.                     if happy_value<20:
  174.                         healthy_value-=happy_value+awake_time-20#如果幸福指数低于 20,则每个滴答健康指数将减1
  175.                     #保证数值不超出范围[0,100]
  176.                     if hungry_value>=100:
  177.                         hungry_value=100
  178.                     if happy_value<0:
  179.                         happy_value=0
  180.                     if healthy_value<0:
  181.                         healthy_value=0
  182.                   
  183.                         
  184.                 elif cat_state=='我在散步...':
  185.                     walk_time=24*day_count+changeTime-startTime
  186.                     hungry_value+=3*walk_time
  187.                     healthy_value+=walk_time
  188.                     #如果饥饿> 80或<20 ,则每个滴答健康减2
  189.                     if hungry_value>80:
  190.                         healthy_value-=2*(80-hungry_value+3*walk_time)//3
  191.                     if hungry_value-3*walk_time<20:
  192.                         healthy_value-=2*(20-hungry_value+3*walk_time)//3
  193.                     #控制范围
  194.                     if hungry_value>=100:
  195.                         hungry_value=100
  196.                     if healthy_value>=100:
  197.                         healthy_value=100
  198.                     if healthy_value<0:
  199.                         healthy_value=0
  200.                         
  201.                 elif cat_state=='我在玩耍...':
  202.                     play_time=24*day_count+changeTime-startTime
  203.                     hungry_value+=3*play_time
  204.                     happy_value+=play_time
  205.                     #如果饥饿> 80或<20 ,则每个滴答健康减2
  206.                     if hungry_value>80:
  207.                         healthy_value-=2*(80-hungry_value+3*walk_time)//3
  208.                     if hungry_value-3*walk_time<20:
  209.                         healthy_value-=2*(20-hungry_value+3*walk_time)//3
  210.                     #如果幸福<20,每个滴答健康减2
  211.                     if happy_value-play_time<20:
  212.                         healthy_value-=2*(20-happy_value+play_value)
  213.                     #控制范围
  214.                     if hungry_value>=100:
  215.                         hungry_value=100
  216.                     if happy_value>=100:
  217.                         happy_value=100
  218.                     if healthy_value<0:
  219.                         healthy_value=0
  220.                         
  221.                 elif cat_state=='我在看医生...':
  222.                     treat_time=24*day_count+changeTime-startTime
  223.                     healthy_value+=4*treat_time
  224.                     if healthy_value>=100:
  225.                         healthy_value=100                        
  226.                 else:#cat_state=='我在吃饭...':
  227.                     eat_time=24*day_count+changeTime-startTime
  228.                     hungry_value-=3*eat_time
  229.                     if hungry_value<=0:
  230.                         hungry_value=0
  231.                     
  232.                 #如果指令是查看状态
  233.                 while command=='status':
  234.                     print('当前的时间:%-2d点'%hours,'\n我当前的状态:',cat_state,sep='')
  235.                     print('Happiness: Sad ','*'*(happy_value//2),'-'*(50-happy_value//2),'Happy(%03d)'%happy_value,sep='')
  236.                     print('Hungry: Full ','*'*(hungry_value//2),'-'*(50-hungry_value//2),'Hungry(%03d)'%hungry_value,sep='')
  237.                     print('Health: Sick ','*'*(healthy_value//2),'-'*(50-healthy_value//2),'Healthy(%03d)'%healthy_value,sep='')
  238.                     
  239.                     day_count=0#状态数据已更新,重新计开始时间
  240.                     break
  241.                
  242.                 #指令改变状态
  243.                 while command=='walk':
  244.                     print('我在散步...')
  245.                     cat_state='我在散步...'
  246.                   
  247.                     day_count=0
  248.                     break
  249.                 while command=='play':
  250.                     print('我在玩耍...')
  251.                     cat_state='我在玩耍...'
  252.                   
  253.                     day_count=0
  254.                     break
  255.                 while command=='feed':
  256.                     print('我在吃饭...')
  257.                     cat_state='我在吃饭...'
  258.                  
  259.                     day_count=0
  260.                     break
  261.                 while command=='letalone':
  262.                     print('我醒着但很无聊...')
  263.                     cat_state='我醒着但很无聊...'#如果是晚上本来在干事情就会回到强制入睡
  264.                  
  265.                     day_count=0
  266.                     break               
  267.                 while command=='seedoctor':
  268.                     print('我在看医生...')
  269.                     cat_state='我在看医生...'
  270.                   
  271.                     day_count=0
  272.                     break                    
  273.    
  274.                 break #回到whileTure重新开始计时
  275.             #保存至文件,关闭#


  276.    

  277. if __name__ =="__main__":
  278.     main()
复制代码

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

已经给出了定时器: 模拟做一个可以在 24 小时的时钟,每个滴答的实际时间是5s
如下:

[code]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 个)模拟它的状态进度度,并给出当前状态指数的具体值

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

虚拟猫的问题.PNG
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2021-12-9 00:58:48 | 显示全部楼层
本帖最后由 Quenya 于 2021-12-9 01:07 编辑

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


  9. def main():
  10.     global hours

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


  22.    

  23. if __name__ =="__main__":
  24.     main()
复制代码


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

  3. import threading
  4. import time

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


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


  18. def main():
  19.     global hours

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

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

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

  53.         def func_walk_healty():
  54.             global r3_value
  55.             r3_value+=1
  56.             if r3_value>100:
  57.                 r3_value=100   
  58.         health_value=threading.Timer(5.0,func_walk_healty)#散步状态每个滴答健康指数增加1
  59.         health_value.start()        
  60.         
  61.             
  62.     elif command =='play':#指令为玩耍时
  63.         new_status='我在玩耍...'
  64.         print(new_status)
  65.         
  66.         def func_play_hungry():
  67.             global r2_value
  68.             r2_value+=3
  69.             if r2_value>100:
  70.                 r2_value=100   
  71.         hungry_value=threading.Timer(5.0,func_play_hungry)#玩耍状态每个滴答饥饿指数增加3
  72.         hungry_value.start()        
  73.                     
  74.         def func_play_happy():
  75.             global r1_value
  76.             r1_value+=1
  77.             if r1_value>100:
  78.                 r1_value=100   
  79.         happy_value=threading.Timer(5.0,func_play_happy)#玩耍状态每个滴答幸福指数增加1
  80.         happy_value.start()        
  81.                
  82.             
  83.     elif command =='feed':#指令为吃饭时
  84.         new_status='我在吃饭...'
  85.         print(new_status)
  86.             
  87.         def func_feed_hungry():
  88.             global r2_value
  89.             r2_value-=3
  90.             if r2_value<0:
  91.                 r2_value=0   
  92.         hungry_value=threading.Timer(5.0,func_feed_hungry)#喂食状态每个滴答饥饿指数减少3
  93.         hungry_value.start()         
  94.             
  95.     elif command == "bye":#指令为再见时,跳出循环
  96.         print("记得来找我!Bye.....")
  97.         timer.cancel()
  98.         break
  99.         
  100.     else:
  101.         if command=='status':#指令是查看状态时
  102.             print('当前时间:%-2d'%hours)
  103.             print('我当前的状态:',new_status)
  104.            
  105.             print('Happiness: Sad ','*'*(r1_value//2),'-'*(50-r1_value//2),'Happy(%03d)'%r1_value,sep='')
  106.             print('Hungry: Full ','*'*(r2_value//2),'-'*(50-r2_value//2),'Hungry(%03d)'%r2_value,sep='')
  107.             print('Health: Sick ','*'*(r3_value//2),'-'*(50-r3_value//2),'Healthy(%03d)'%r3_value,sep='')
  108.         else:
  109.             print('我不懂你在说什么')#收到错误指令时


  110. if __name__ =="__main__":
  111.     main()
复制代码


但是没搞懂定时器怎么用,所以运行会出现主楼图片里的问题,时间只增加一次就不增加了:
虚拟猫的问题.PNG
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-5-11 12:41

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表