[Udemy] python課程專案練習

Visits: 2


課程有提供一個網址,裡面有許多練習題,以下是練習筆記

Find PI to the Nth Digit

說明:我的解法是使用正規表達式,將pi依照小數位分成1個物件,取出

import math
import re
pi = math.pi

def cut(obj, digit):
    obj_cutted = re.split("\.", str(obj))[1][digit - 1]
    return obj_cutted

print(pi)
print("-----after cut-----")
print(cut(pi, 1))

Collatz Conjecture(考拉茲猜想)

說明:對於每一個正整數,如果它是奇數,則對它乘3再加1,如果它是偶數,則對它除以2,如此循環,最終都能夠得到1。

def collatz(n):
    result = list()
    result.append(n)
    while n > 1:
        if n % 2 == 0:
            n = n / 2
            result.append(n)
        else:
            n = n * 3 + 1
            result.append(n)
    while n == 1:
        print("result reach 1, end the loop")
        print(result)
        print("number of step: " + str(len(result)))
        print("biggest number is: " + str(max(result)))
        break

Sort

Bubble sorting(氣泡排序法)

氣泡排序法就是相臨資料互相比較,若發現資料順序不對,就將資料互換,直到完成為止。下方的程式碼可透過不斷的把現階段迴圈內的物件print出來,對於我這個程式新手來說,是很方便的功能。

def bubble_sort_flag(list): # aescending
    for i in range(0,len(list)-1): # 有n-1回合(n為數字個數)
        print("第" + str(i) + "回合") # for check
        print(list) # for check
        flag = False
        for j in range(0,len(list)-1-i):  # 每回合進行比較的範圍
            print("第" + str(j) + "與第" + str(j+1) + "比較") # for check
            if list[j] > list[j+1]: # 是否需交換
                flag = True
                tmp = list[j] # 先把位置j存起來
                list[j] = list[j+1] # 把原本的j位以j+1位的值填入
                list[j+1] = tmp # 把j+1位的值以tmp填回
                print(list)
        if flag == False:
            break
        print("pass",i+1,": ", list)

順道一提,在寫這題的時候,找到了一個很棒的網站,該網站可將迴圈拆解成一步一步的過程,非常適合學習,而且該作者還將他寫的python書完全開源,可以在網站上找到更多的資料結構與演化法的基礎課程,大推大推。

鳥吃魚(遊戲程式設計)

為了熟悉OOP的寫法,網路上找到了一個題目,要設計出一個10*10的場地,讓烏龜跟魚隨機移動,若兩者座標重疊,則吃掉魚。我自己稍微修改了一下,把烏龜換成魚,並把程式需求條件換成以下:

  1. 假設遊戲場景為範圍(x,y)為0<=x<=10,0<=y<=10
  2. 遊戲生成1隻鳥和10條魚
  3. 它們的移動方向均隨機
  4. 鳥在每一軸的最大移動能力為3(它可以隨機選擇1還是2移動),魚兒的最大移動能力是1
  5. 當移動到場景邊緣,自動向反方向移動
  6. 鳥初始化體力為100(上限)
  7. 鳥每移動一次,體力消耗1
  8. 當鳥和魚座標重疊,鳥吃掉魚,鳥體力增加20
  9. 魚暫不計算體力
  10. 當鳥體力值為0時結束遊戲,看最終鳥吃了幾條魚

以下是我的解法

# Game setting
import random  # 利用套件達成隨機移動
class Bird:
    # 鳥的體力初始化且上限為100(符合條件6)
    def __init__(self):
        self.hp = 100
        # 鳥的座標(條件1)
        self.x = random.randint(0, 10)
        self.y = random.randint(0, 10)

    # 鳥的移動
    def move(self):  # 符合條件4
        new_x = self.x + random.choice([-3, -2, -1, 1, 2, 3])
        new_y = self.y + random.choice([-3, -2, -1, 1, 2, 3])
        # 若鳥移動到場景邊緣,則自動往反向移動(條件5)
        if new_x < 0:
            self.x = 0 - new_x
        elif new_x > 10:
            self.x = 10 - (new_x - 10)
        else:
            self.x = new_x

        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.hp -= 1  # 鳥移動一次,體力減1(條件7)

    def eat(self):
        self.hp += 20
        if self.hp > 100:
            self.hp = 100  # 體力上限為100(條件6)

class Fish:
    def __init__(self):
        self.x = random.randint(0, 10)
        self.y = random.randint(0, 10)

    # 魚的移動
    def move(self):
        new_x = self.x + random.choice([1, -1])
        new_y = self.y + random.choice([1, -1])
        # 若移動到場景邊緣,則自動往反向移動(條件5)
        if new_x < 0:
            self.x = 0 - new_x
        elif new_x > 10:
            self.x = 10 - (new_x - 10)
        else:
            self.x = new_x

        if new_y < 0:
            self.y = 0 - new_y
        elif new_y > 10:
            self.y = 10 - (new_y - 10)
        else:
            self.y = new_y

# Game init
bird = Bird()
fish = Fish()
print("origin location of bird: " + "(", bird.x, bird.y, ")")
print("origin location of fish: " + "(", fish.x, fish.y, ")")

# Game start
i = 0
while i >= 0:
    if fish.x == bird.x and fish.y == bird.y:
        bird.eat()
        print("太好了,鳥吃掉魚了,現在鳥的體力是: " + str(bird.hp))
        fish = Fish()
        i += 1
        continue
    else:
        bird.move()
        fish.move()
        print("鳥現在的體力是" + str(bird.hp))
    if bird.hp <= 0:
        print("殘念,鳥體力耗盡了")
        print("-----本次遊戲,鳥總共吃到" + str(i) + "條魚-----")
        break

About the Author

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *

You may also like these