本帖最后由 lingyiling 于 2020-7-30 00:32 编辑
第一次发帖还有点紧张,最近在跟别的网站学python 写了段很菜的小程序。《小乌龟吃小鱼》{:1_918:} 听名字 刚学python的同学们肯定都知道我在哪自学的了哈
但是具体实现功能还是能唠两句的:
#################################################################
# 游戏场景为范围(x,y)为 0<=x<=10,0<=y<=10
# 游戏生成1只乌龟和10条鱼
# 它们的移动方向均随机
# 乌龟的最大移动能力为2(可以随机选择1还是2),鱼儿的最大移动能力为1
# 当移动到场景边缘,自动向反方向移动
# 乌龟初始化体力为100(上限)
# 乌龟每移动一次,体力消耗1
# 当乌龟和鱼坐标重叠,乌龟吃掉鱼,乌龟体力增加20
# 鱼暂不计算体力
# 当乌龟体力值为0(挂掉)或鱼儿的数量为0游戏结束 #################################################################
以上是实现程序的基本功能。
写程序之前我们先来理一下思路:
范围是10*10的方格内
移动方向随机
两种生物 乌龟和鱼
乌龟移动1-2步
鱼移动1步
乌龟有体力吃鱼增加体力但有上限
鱼没有体力
PS;提前报告有部分功能没有实现还在摸索中
以下是部分程序:
程序比较简单只用到了一个模块random
生成随机数字
一:
习惯性先写入口函数main()
二.0:
首先创建一个动物类
因为乌龟有体力,class没有分开写所以添加了体力
默认名字999
随机xy
class Animal():
tili = 100
x = random.randint(0,10)
y = random.randint(0,10)
name = 999
二.1:
初始化定义类成鱼还是乌龟还是外星生物(手动狗头)
def init(self,name):
if name == '乌龟':
self.name = 0
elif name == '鱼':
self.name = 1
else:
print('出错')
exit
二.2:
题中出现边缘反弹的当时想了好久用到了abs绝对值
变量z随机x还是y
变量fuhao随机正负
如果原运算结果小于0 则取绝对值
如果原运算结果大于10则相减取绝对值
def move(self):
z = random.randint(0,1)
fuhao = random.randint(0,1)
if z == 0:
if fuhao == 0:
self.x = self.x - random.randint(1,2)
if self.x < 0:
self.x = abs(self.x)
else:
self.x = self.x + random.randint(1,2)
if self.x > 10:
self.x = 10 - (self.x - 10)
else:
if fuhao == 0:
self.y = self.y - random.randint(1,2)
if self.y < 0:
self.y = abs(self.y)
else:
self.y = self.y + random.randint(1,2)
if self.y > 10:
self.y = 10 - (self.y - 10)
二.3:
虽然鱼没有体力,但是乌龟有呀,所以这个大类中添加了一项关于体力
传入参数1,0
1吃到
0没吃到
def power(self,chidao = 99):
if chidao == 1:
print("呀,吃到了")
self.tili += 20
chidao = 99
elif chidao == 0:
self.tili -= 1
chidao = 99
if self.tili == 0:
return False
return self.tili
二.4:
下一项获取位置,把当前位置返回出去,主函数中判断是否重叠,乌龟是否抓到鱼
def get_X_Y(self):
self.x = 0
# self.y = 1
weizhi = [self.x,self.y]
return weizhi
二.5:
最后关于显示问题应该不大,这里我把随机移动的函数直接写在显示里运行了,这样写可能有点不太合理,你们觉得呢?
def print_xy(self):
self.move()
if self.name == 0:
print("%s的位置是(%s,%s),体力为%s" % (str(self.name),str(self.x),str(self.y),str(self.tili)))
if self.name == 1:
print("%s的位置是(%s,%s)" % (str(self.name),str(self.x),str(self.y)))
return self.get_X_Y()
大类写完接下来就是主函数了
三.1
首先实例化一个乌龟
考虑到鱼不是一条是一群所以循环实例化到列表中
初始化完成
# 实例化乌龟
gui = Animal('乌龟')
yuqun = []
# 实例化鱼
for i in range(0,10):
yuqun.append('yu' + str(i))
yuqun[i] = Animal('鱼')
三.2
接下来就是运行的主核心了
循环主体直到鱼塘没有鱼或者乌龟没有体力
创建一个临时列表count来存放吃到的鱼儿再在循环结束之后统一删除
因为在循环中直接删除会报NULL的错误
最后判断打印结束
while gui.power() > 0 and len(yuqun) > 0:
count = []
gui.power(chidao=0)
gui_weizhi = gui.print_xy()
for i in range(0,len(yuqun)):
weizhi = yuqun[i].print_xy()
if(gui_weizhi == weizhi):
gui.power(chidao=1)
count.append(str(i))
if(len(count) > 0):
for i in range(0,len(count)):
del yuqun[i]
if gui.power() ==0:
print("乌龟输了,还剩下%s条鱼没抓到"%len(yuqun))
if len(yuqun) == 0:
print("鱼全吃完了")
以上是全全全全全全全部内容,感觉有些功能没实现(乌龟移动1-2步),而有些段落又比较多余(鱼不需要体力),还有些没有发现的问题,请大家帮忙指出,后期可能会听取意见或建议更新新版本谢谢 |