python - 烏龜吃魚遊戲
阿新 • • 發佈:2019-01-03
#pygame 可以設定圖形,這裡不做講解。
遊戲程式設計:按以下要求定義一個烏龜類和魚類並嘗試編寫遊戲
假設遊戲場景為範圍(x,y)為0<=x<=10,0<=y<=10
遊戲生成1只烏龜和10條魚
它們的移動方向均隨機
烏龜的最大移動能力為2(它可以隨機選擇1還是2移動),魚兒的最大移動能力是1
當移動到場景邊緣,自動向反方向移動
烏龜初始化體力為100(上限)
烏龜每移動一次,體力消耗1
當烏龜和魚座標重疊,烏龜吃掉魚,烏龜體力增加20
魚暫不計算體力
當烏龜體力值為0(掛掉)或者魚兒的數量為0遊戲結束
import random class Turtle(object): # 建構函式什麼時候執行? =---=====建立物件時執行 def __init__(self): # self指的是例項化的物件; # 烏龜的屬性: x,y軸座標和體力值 # 烏龜的x軸, 範圍1,10 self.x = random.randint(1, 10) self.y = random.randint(1, 10) # 烏龜初始化體力為100 self.power = 100 # 類的方法: def move(self): # 烏龜的最大移動能力為2,規定為:[-2, -1, 0, 1, 2] move_skill = [-2, -1, 0, 1, 2] # 計算出烏龜的新座標(10, 12) new_x = self.x + random.choice(move_skill) new_y = self.y + random.choice(move_skill) # 對於新座標進行檢驗, 是哦否合法, 如果不合法, 進行處理 self.x = self.is_vaild(new_x) self.y = self.is_vaild(new_y) # 烏龜每移動一次,體力消耗1 self.power -= 1 def is_vaild(self, value): """ 判斷傳進來的x軸座標或者y軸座標是否合法? 1). 如果合法, 直接返回傳進來的值; 2). value<=0; =====> abs(value); 3). value > 10 ======> 10-(value-10); :param value: :return: """ if 1 <= value <= 10: return value elif value < 1: return abs(value) else: return 10 - (value - 10) def eat(self): """ 當烏龜和魚座標重疊,烏龜吃掉魚,烏龜體力增加20 :return: """ self.power += 20 class Fish(object): # 建構函式什麼時候執行? =---=====建立物件時執行 def __init__(self): # 魚的屬性: x, y軸座標 # 魚的x軸, 範圍1,10 self.x = random.randint(1, 10) self.y = random.randint(1, 10) # 類的方法: def move(self): # 魚的最大移動能力為1,[ -1, 0, 1] move_skill = [-1, 0, 1] # 計算出魚的新座標(10, 12) new_x = self.x + random.choice(move_skill) new_y = self.y + random.choice(move_skill) # 對於新座標進行檢驗, 是否合法, 如果不合法, 進行處理 self.x = self.is_vaild(new_x) self.y = self.is_vaild(new_y) def is_vaild(self, value): """ 判斷傳進來的x軸座標或者y軸座標是否合法? 1). 如果合法, 直接返回傳進來的值; 2). value<=0; =====> abs(value); 3). value > 10 ======> 10-(value-10); :param value: :return: """ if 1 <= value <= 10: return value elif value < 1: return abs(value) else: return 10 - (value - 10) def main(): # 建立一個烏龜; turtle = Turtle() print(turtle.x, turtle.y) # for迴圈建立10個魚 # fishs = [] # for i in range(10): # fishs.append(Fish()) # 建立10個魚物件; fishs = [Fish() for i in range(10)] # 遊戲開始 while True: # 判斷遊戲是否結束?( 當烏龜體力值為0(掛掉)或者魚兒的數量為0遊戲結束) if turtle.power <= 0: print("烏龜沒有體力了, Game over......") break elif len(fishs) == 0: print("魚被吃光, Game over......") break else: # 遊戲沒有結束. 烏龜和魚隨機移動 turtle.move() # 魚移動 for fish in fishs: fish.move() # 判斷魚是否被烏龜吃掉? # 當烏龜和魚座標重疊,烏龜吃掉魚,烏龜體力增加20 if turtle.x == fish.x and turtle.y == fish.y: turtle.eat() # 刪除被烏龜吃掉的魚 fishs.remove(fish) print("魚被烏龜吃掉, 還剩%d條魚....." % (len(fishs))) print("烏龜的最新體力為%s" % (turtle.power)) # 烏龜跟10個魚都比較結束後, 沒有發現吃到一個魚, 才執行, 跟for是一塊的; else: print("烏龜沒有吃到魚,最新體力為%s" % (turtle.power)) # pygame if __name__ == "__main__": print("遊戲開始".center(30, "*")) main()
因為烏龜和魚有很多相同的屬性和方法,所以可以合併成一個Animal類。
import random class Animal(object): """ 將烏龜和魚的共同特性抽象出來的類 """ def __init__(self): self.x = random.randint(1,10) self.y = random.randint(1,10) def move(self,move_skill): new_x = self.x + random.choice(move_skill) new_y = self.y + random.choice(move_skill) self.x = self.is_vaild(new_x) self.y = self.is_vaild(new_y) def is_vaild(self,value): if 1 <= value <= 10: return value elif value<1: return abs(value) elif value >10: return 10-(value-10) class Turtle(Animal): def __init__(self): super(Turtle,self).__init__() self.power=100 def move(self,move_skill= (-2,-1,0,1,2)): super(Turtle,self).move(move_skill) self.power -= 1 def eat(self): self.power += 20 class Fishs(Animal): def move(self,move_skill=(-1,0,1)): super(Fishs,self).move(move_skill) def main(): turtle = Turtle() fishs = [Fishs() for i in range(10)] while True: if turtle.power <= 0: print('烏龜沒有體力了') break elif len(fishs) == 0: print('魚被吃光了!') break else: turtle.move() for fish in fishs: fish.move() if turtle.x == fish.x and turtle.y == fish.y: turtle.eat() fishs.remove(fish) print('魚被烏龜吃了!') print('烏龜當前體力值為:%d' %(turtle.power)) else: print('烏龜沒有吃到魚,烏龜體力值:%d' %(turtle.power)) if __name__ == '__main__': print('遊戲開始!'.center(50,'*')) main()