1. 程式人生 > >python - 烏龜吃魚遊戲

python - 烏龜吃魚遊戲

#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()

在這裡插入圖片描述