Hits: 560
課程有提供一個網址,裡面有許多練習題,以下是練習筆記
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的場地,讓烏龜跟魚隨機移動,若兩者座標重疊,則吃掉魚。我自己稍微修改了一下,把烏龜換成魚,並把程式需求條件換成以下:
- 假設遊戲場景為範圍(x,y)為
0<=x<=10,0<=y<=10
- 遊戲生成1隻鳥和10條魚
- 它們的移動方向均隨機
- 鳥在每一軸的最大移動能力為3(它可以隨機選擇1還是2移動),魚兒的最大移動能力是1
- 當移動到場景邊緣,自動向反方向移動
- 鳥初始化體力為100(上限)
- 鳥每移動一次,體力消耗1
- 當鳥和魚座標重疊,鳥吃掉魚,鳥體力增加20
- 魚暫不計算體力
- 當鳥體力值為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
Comments