|

楼主 |
发表于 2018-11-1 10:56:43
|
显示全部楼层
本帖最后由 BigSmall 于 2018-11-1 20:57 编辑
37课后习题
关于类和self的详解
https://www.bilibili.com/video/av24145796?from=search&seid=114635733586211685
import random as r #导入函数模块写在最前面即可,这样在类里面也可以引用
class Turtle:
def __init__(self): #这样的类一般放属性,不用调用就运行,有关属性的数据都加上self.,这样调用才不会出问题
# 初始体力
self.energy=100
# 初始位置随机
self.a1=r.randint(0,10) #随机位置,可以用随机函数产生x、y;游戏场景范围可以通过控制x、y实现
self.b1=r.randint(0,10)
def move(self): #定义类里面的函数也加self
# 随机计算方向并移动到新的位置(a2, b2)
self.a2=self.a1+r.choice([1,2,-1,-2]) #随机移动可以在原来的x、y加随机数,在这里随机数用一个r.choice函数实现
self.b2=self.b1+r.choice([1,2,-1,-2])
# 检查移动后是否超出场景x轴边界
if self.a2 < 0:
self.a1 = 0 - (self.a2 - 0) #超出边界后按照原路返回,这个地方不太好理解
elif self.a2 > 10:
self.a1 = 10 - (self.a2 - 10)
else:
self.a1 = self.a2
# 检查移动后是否超出场景y轴边界
if self.b2 < 0:
self.b1 = 0 - (self.b2 - 0)
elif self.b2 > 10:
self.b1 = 10 - (self.b2 - 10)
else:
self.b1 = self.b2
# 体力消耗
self.energy-=1
# 返回移动后的新位置
return (self.a1,self.b1) #第一做没返回值,想用这x,y直接比,但不行,因为这个函数不是__init__函数,需要.来调用,不能直接用来参数比较
def eat(self):
self.energy+=20
if self.energy>100:
self.energy=100 #注意这个地方,一般想不到,就是虽然会加血,但是血有上限
class Fish:
def __init__(self):
self.c1=r.randint(0,10)
self.d1=r.randint(0,10)
number=1
def move(self):
# 随机计算方向并移动到新的位置(x, y)
self.c2=self.c1+r.choice([1,-1])
self.d2=self.d1+r.choice([1,-1])
# 检查移动后是否超出场景x轴边界
if self.c2 < 0:
self.c1 = 0 - (self.c2 - 0)
elif self.c2 > 10:
self.c1 = 10 - (self.c2 - 10)
else:
self.d1 = self.d2
# 检查移动后是否超出场景y轴边界
if self.d2 < 0:
self.d1 = 0 - (self.d2 - 0)
elif self.d2 > 10:
self.d1 = 10 - (self.d2 - 10)
else:
self.d1 = self.d2
# 返回移动后的新位置
return (self.c1,self.d1)
turtle=Turtle()
fish=[] #10条鱼,用列表来保存
for i in range(10):
new_fish=Fish()
fish.append(new_fish)
while True: #这段函数不好想
if not len(fish):
print("鱼儿都吃完了,游戏结束!")
break
if not turtle.energy:
print("乌龟体力耗尽,挂掉了!")
break
pos = turtle.move() #就是这里,不能直接用move里面参数进行比较,需要调用函数,直接用函数来返回
for each_fish in fish[:]:
if each_fish.move() == pos:
# 鱼儿被吃掉了
turtle.eat()
fish.remove(each_fish) #死一条鱼,列表remove一条,直到鱼全死了
print("有一条鱼儿被吃掉了...")
|
|