0.按以下要求定义一个乌龟类和鱼类并尝试编写游戏
游戏场景为范围(x,y)为 0<=x<=10,0<=y<=10
游戏生成1只乌龟和10条鱼
它们的移动方向均随机
乌龟的最大移动能力为2(可以随机选择1还是2),鱼儿的最大移动能力为1
当移动到场景边缘,自动向反方向移动
乌龟初始化体力为100(上限),乌龟每移动一次,体力消耗1
当乌龟和鱼坐标重叠,乌龟吃掉鱼,乌龟体力增加20,鱼暂不计算体力
当乌龟体力值为0(挂掉)或鱼儿的数量为0游戏结束
import random as r class Turtle: #初始化坐标定位及能力 def __init__(self): self.power = 100 self.x = r.randint(0,10) self.y = r.randint(0,10) def move(self): #随机计算位移并算出新的位置,0为横向移动,1为纵向移动 self.direction = r.randint(0,1) if self.direction == 0: new_x = self.x + r.choice([1,-1,2,-2]) new_y = self.y #移动后检查x轴是否超出边缘 if new_x < 0: self.x = 0 - new_x elif new_x > 10: self.x = 10 - (new_x - 10) else: self.x = new_x else: new_x = self.x new_y = self.y + r.choice([1,-1,2,-2]) #移动后检查y轴是否超出边缘 if new_y < 0: self.y = 0 - new_y elif new_y > 10: self.y = 10 - (new_y - 10) else: self.y = new_y self.power -= 1 return (self.x,self.y) def eat(self): self.power += 20 if self.power > 100: self.power = 100 class Fish: def __init__(self): self.x = r.randint(0,10) self.y = r.randint(0,10) def move(self): #随机计算位移并算出新的位置,0为横向移动,1为纵向移动 self.direction = r.randint(0,1) if self.direction == 0: new_x = self.x + r.choice([1,-1]) new_y = self.y else: new_x = self.x new_y = self.y + r.choice([1,-1]) #移动后检查x轴是否超出边缘 if new_x < 0: self.x = 0 - new_x elif new_x > 10: self.x = 10 - (new_x - 10) else: self.x = new_x #移动后检查y轴是否超出边缘 if new_y < 0: self.y = 0 - new_y elif new_y > 10: self.y = 10 - (new_y - 10) else: self.y = new_y return (self.x,self.y) #测试数据 turtle = Turtle() fish = [] for i in range(10): new_fish = Fish() fish.append(new_fish) while True: if len(fish) == 0: print('小鱼仔都被吃完了,Game Over!') break if turtle.power == 0: print('乌龟体力被耗尽了,Game Over!') break #开始游戏 print('乌龟移动前的坐标:',(turtle.x,turtle.y)) turtle.move() print('乌龟移动后的坐标:',(turtle.x,turtle.y)) for f in fish: print('鱼移动前的坐标:',(f.x,f.y)) f.move() print('鱼移动后的坐标:',(f.x,f.y)) if f.x == turtle and f.y == turtle.y: turtle.eat() fish.remove(f) print('鱼被吃掉一条') print('乌龟现在体力值为:'% turtle.power)
1.定义一个点(Point)类和直线(Line)类,使用getLen方法可以获得直线的长度。
import random import math class Point: def __init__(self): self.x = random.randint(0,10) self.y = random.randint(0,10) class Line: def __init__(self,p1,p2): self.x = abs(p1.x - p2.x) self.y = abs(p1.y - p2.y) self.len = math.sqrt(self.x**2 + self.y**2) def getLen(self): return self.len p1 = Point() print('点1为:',(p1.x,p1.y)) p2 = Point() print('点2为:',(p2.x,p2.y)) line = Line(p1,p2) print('直线长为:',line.getLen())
2.请动手在一个类中定义一个变量,用于跟踪类有多少个实例被创建,(当实例化一个对象,这个变量+1,当销毁一个对象,这个变量自动-1)
class C: count = 0 def __init__(self): C.count += 1 print(C.count) def __del__(self): C.count -= 1 print(C.count)
3.定义一个栈(Stack)类,用于模拟一种具有后进先出(LIFO)特征的数据结构。至少需要有以下办法:
方法名 | 含义 |
---|---|
isEmpty() | 判断当前栈是否为空(返回True或False) |
push() | 往栈的顶部压入一个数据项 |
pop() | 从栈顶弹出一个数据项(并在栈中删除) |
top() | 显示当前栈顶的一个数据项 |
botton() | 显示当前栈底的一个数据项 |
class Stack: def __init__(self,start=[]): self.stack = [] #判断当前栈是否为空(返回True或False) def isEmpty(self): return not bool(self.stack) #往栈顶压入一个数据 def push(self,obj): print('入栈数据:',obj) self.stack.append(obj) #把栈顶数据弹出 def pop(self): if self.stack: print('出栈数据:',self.stack[-1]) self.stack.pop() else: raise LookupError('栈为空!') #显示当前栈顶数据 def top(self): if self.stack: print('栈顶数据:',self.stack[-1]) else: raise LookupError('栈为空!') #显示当前栈底数据 def botton(self): if self.stack: print('栈底数据:',self.stack[0]) else: raise LookupError('栈为空!') #显示栈的所有数据 def show(self): if self.stack: print(self.stack) else: raise LookupError('栈为空!')