🌙 L1: 月球基地訓練

A2: 月球導航系統:邏輯控制與條件判斷

⏱️ 預計時間:3-4 小時 🎯 目標級分:1-2 級分 📊 難度:⭐⭐☆☆☆

🚀 任務背景

在月球表面執行任務時,你的月球車需要根據不同的地形和環境條件做出正確的決策。是繼續前進?轉向?還是停止?這些決策都依賴於精確的邏輯判斷系統。

作為探險隊的導航員,你需要掌握:
  • 如何根據感測器數據做出決策(條件判斷)
  • 如何處理複雜的多重條件(巢狀判斷)
  • 如何重複執行任務直到達成目標(迴圈控制)

📚 知識點說明

三大控制結構

在太空任務中,所有的決策系統都基於三種基本結構:

  1. 循序(Sequence):按順序執行指令
  2. 選擇(Selection):根據條件選擇執行路徑
  3. 重複(Repetition):重複執行直到滿足條件

條件判斷:if / elif / else

# 基本結構
if 條件1:
    # 條件1為真時執行
elif 條件2:
    # 條件1為假且條件2為真時執行
else:
    # 所有條件都為假時執行

布林邏輯運算子

  • and:兩個條件都必須為真
  • or:至少一個條件為真
  • not:反轉條件

迴圈結構

for 迴圈:已知次數的重複
for i in range(5):  # 執行 5 次,i = 0, 1, 2, 3, 4
    print(i)
while 迴圈:條件控制的重複
while 條件:
    # 當條件為真時持續執行

💻 範例程式碼

範例 1:月球車地形判斷系統

import sys

# 任務:根據地形類型決定行駛速度 terrain = sys.stdin.readline().strip()

if terrain == "平原": speed = 50 print(f"地形:{terrain},建議速度:{speed} km/h") elif terrain == "隕石坑": speed = 20 print(f"地形:{terrain},建議速度:{speed} km/h(小心駕駛)") elif terrain == "懸崖": speed = 0 print(f"地形:{terrain},建議速度:{speed} km/h(停止前進!)") else: speed = 30 print(f"地形:未知,建議速度:{speed} km/h(謹慎前進)")

範例 2:氧氣警報系統

import sys

# 任務:根據氧氣含量和電池電量發出警報 oxygen = int(sys.stdin.readline()) # 氧氣百分比 battery = int(sys.stdin.readline()) # 電池百分比

print(f"氧氣:{oxygen}%,電池:{battery}%")

if oxygen < 20 and battery < 30: print("🚨 緊急警報:氧氣和電池都不足!立即返回基地!") elif oxygen < 20: print("⚠️ 警告:氧氣不足!") elif battery < 30: print("⚠️ 警告:電池不足!") else: print("✅ 系統正常,可以繼續任務")

範例 3:隕石雨倒數系統

import sys

# 任務:倒數計時並在特定時刻發出警報 countdown = int(sys.stdin.readline())

for i in range(countdown, 0, -1): # 從 countdown 倒數到 1 if i == 10: print(f"{i} - 準備啟動防護罩") elif i == 5: print(f"{i} - 防護罩充能中") elif i == 1: print(f"{i} - 防護罩啟動!") else: print(i)

print("🛡️ 防護罩已啟動,隕石雨來襲!")

範例 4:尋找最佳著陸點

import sys

# 任務:在 N 個候選點中找到坡度最小的著陸點 n = int(sys.stdin.readline()) best_slope = float('inf') # 初始化為無限大 best_location = -1

for i in range(n): slope = int(sys.stdin.readline()) if slope < best_slope: best_slope = slope best_location = i + 1 # 位置從 1 開始編號 print(f"最佳著陸點:位置 {best_location},坡度:{best_slope}°")

範例 5:進階流程控制 - break 與 continue

import sys

# 任務:掃描隕石樣本,找到第一個含有水冰的樣本 n = int(sys.stdin.readline())

for i in range(1, n + 1): sample_type = sys.stdin.readline().strip() if sample_type == "空樣本": continue # 跳過空樣本,繼續下一個 if sample_type == "水冰": print(f"✅ 在樣本 {i} 發現水冰!任務完成!") break # 找到目標,立即結束搜索 print(f"樣本 {i}:{sample_type}(繼續搜索)") else: # 只有在迴圈正常結束(沒有 break)時才執行 print("❌ 所有樣本都不含水冰")

🔍 程式碼解說

關鍵技術點

  1. elif 的優勢
  2. 比多個獨立的 if 更高效
  3. 一旦某個條件為真,後續條件不再檢查
  4. 邏輯更清晰,避免重複判斷
  1. range() 函數
   range(5)           # 0, 1, 2, 3, 4
   range(1, 6)        # 1, 2, 3, 4, 5
   range(10, 0, -1)   # 10, 9, 8, ..., 1
   
⚠️ 注意:stop 參數本身不包含在序列中!
  1. break vs continue
  2. break:立即跳出整個迴圈
  3. continue:跳過本次迭代,進入下一次
  1. for...else 結構
  2. else 區塊只在迴圈正常結束時執行
  3. 如果迴圈被 break 中斷,else 不執行
  4. 非常適合「搜索失敗」的處理

📝 Quiz: 火星探測器路徑規劃

題目:障礙物迴避系統

你的火星探測器正在執行路徑掃描任務。探測器會掃描前方 N 個位置,每個位置可能是:
  • 0:安全路徑
  • 1:小型障礙物(可以繞過)
  • 2:大型障礙物(必須停止)
請編寫程式:
  1. 如果遇到大型障礙物(2),立即停止並報告位置
  2. 統計有多少個小型障礙物
  3. 如果沒有大型障礙物,報告路徑安全
輸入格式:
  • 第一行:整數 N(掃描位置數量,1 ≤ N ≤ 100)
  • 第二行:N 個整數,用空格分隔,每個整數為 0、1 或 2
輸入範例 1:
8
0 1 0 0 1 2 0 1
輸出範例 1:
⚠️ 在位置 6 發現大型障礙物!
已掃描:5 個位置
小型障礙物:2 個
輸入範例 2:
6
0 1 0 1 0 0
輸出範例 2:
✅ 路徑安全!
總掃描:6 個位置
小型障礙物:2 個

💡 提示

  • 使用 enumerate() 可以同時獲得索引和值
  • 記得位置編號從 1 開始(對使用者友善)
  • 使用 break 在遇到大型障礙物時立即停止

---

Quiz 解答

import sys

# 讀取掃描位置數量 n = int(sys.stdin.readline())

# 讀取所有位置的障礙物數據 obstacles = list(map(int, sys.stdin.readline().strip().split()))

# 初始化計數器 small_obstacles = 0 scanned = 0

# 掃描每個位置 for position, obstacle_type in enumerate(obstacles, start=1): scanned = position # 記錄已掃描的位置 if obstacle_type == 1: small_obstacles += 1 # 統計小型障礙物 elif obstacle_type == 2: # 發現大型障礙物,立即停止 print(f"⚠️ 在位置 {position} 發現大型障礙物!") print(f"已掃描:{scanned - 1} 個位置") print(f"小型障礙物:{small_obstacles} 個") break else: # 迴圈正常結束,沒有遇到大型障礙物 print("✅ 路徑安全!") print(f"總掃描:{scanned} 個位置") print(f"小型障礙物:{small_obstacles} 個")

解答說明

  1. enumerate() 的使用
   for position, obstacle_type in enumerate(obstacles, start=1):
   
  • enumerate() 同時提供索引和值
  • start=1 讓位置編號從 1 開始(更符合人類習慣)
  1. 條件判斷邏輯
  2. 先檢查是否為小型障礙物(1),累加計數
  3. 再檢查是否為大型障礙物(2),立即 break
    1. for...else 的妙用
    2. 如果迴圈被 break 中斷,else 不執行
    3. 如果迴圈正常結束,else 執行,表示路徑安全
    1. 變數追蹤
    2. scanned 記錄當前掃描到的位置
    3. break 時,scanned - 1 是實際完成掃描的位置數

    效能分析

    • 時間複雜度:O(N) - 最多掃描 N 個位置
    • 空間複雜度:O(N) - 儲存 N 個障礙物數據
    • 最佳情況:O(1) - 第一個位置就是大型障礙物
    • 最壞情況:O(N) - 沒有大型障礙物,掃描全部

    ---

🎉

訓練完成!

恭喜你完成 導航邏輯與條件判斷 訓練!