[已解决]设计虚拟猫|定时器如何使用|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 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]