跳轉到內容

維基少年:樹莓派/樹莓派“Simon Says”遊戲

來自華夏公益教科書,開放世界的開放書籍
1978 年的原始 Simon 遊戲。

Simon Says(或簡稱為 Simon)是一款電子棋盤遊戲,其目標是記住紅色、黃色、藍色和綠色的順序,然後按順序按下相應的按鈕。

麵包板

[編輯 | 編輯原始碼]

迷你麵包板 有頂部和底部部分。每個部分中每列的所有點都連線在一起,因此我們可以進行電氣連線。

您將需要 ×1 麵包板

發光二極體(LED)

[編輯 | 編輯原始碼]

LED(發光二極體) 有一條短腿和一條長腿。如果您用手摸摸邊緣,您還會發現一個平邊。短腿和平邊始終連線到負極(接地)。

您將需要 ×4 LED:×1 紅色,×1 藍色,×1 綠色和 ×1 黃色。

電阻器

[編輯 | 編輯原始碼]

電阻器 可以以任何方式連線。我們使用的是 270 歐姆電阻器,但 220-470 歐姆之間的任何電阻器都可以正常工作。

您將需要 ×4 電阻器

瞬時開關

[編輯 | 編輯原始碼]

開關 可以以任何方式連線。按下時,它允許電流透過;鬆開時,電流停止。這種型別的按鈕被稱為“瞬時按下式開關”。

您將需要 ×4 瞬時開關

跳線(也稱為杜邦線)將電子元件連線到 GPIO 引腳。您還應該有兩根短跳線和一根長跳線(所有跳線都是“母對母” – 兩端都有孔)。

您將需要 ×16 跳線

組裝麵包板

[編輯 | 編輯原始碼]

樹莓派有兩種標記通用輸入輸出 (GPIO) 引腳的方式

  • 板號 – 僅從左下角開始,從 1 開始,一直向上和向右,一直到 40。
  • BCM 號碼(Broadcom 號碼) – 是樹莓派處理器檢視引腳連線的方式。

步驟 1: 將 LED 連線到樹莓派的 GPIO 引腳。您可以使用任何組合的 GPIO 引腳,但請注意,LED 必須連線到支援 PWM(脈寬調製)的引腳。

元件GPIO 引腳
紅色 LED引腳 17(GPIO 17)
藍色 LED引腳 27(GPIO 27)
黃色 LED引腳 22(GPIO 22)
綠色 LED引腳 23(GPIO 23)

步驟 2: 將按鈕連線到樹莓派的 GPIO 引腳。您可以使用任何組合的 GPIO 引腳,但請注意,按鈕必須連線到支援輸入的引腳。

元件GPIO 引腳
按鈕引腳 5(GPIO 5)
按鈕引腳 6(GPIO 6)
按鈕引腳 13(GPIO 13)
按鈕引腳 19(GPIO 19)

編寫 Python 程式

[編輯 | 編輯原始碼]

步驟 3: 編寫一個 Python 程式來控制 LED 和按鈕。該程式應該生成一個隨機的 LED 點亮序列,然後等待使用者按順序按下相應的按鈕。如果使用者正確地按下了按鈕,程式應該進入下一級。如果使用者按下了錯誤的按鈕,程式應該結束遊戲。

編寫完 Python 程式後,您可以將其儲存為一個副檔名為 `.py` 的檔案,例如 `simon_says.py`。然後,您可以在終端視窗中輸入以下命令來執行程式

python simon_says.py

遊戲將開始,LED 會以隨機順序點亮。按順序按下相應的按鈕以進入下一級。如果您按下了錯誤的按鈕,遊戲將結束。

您可以透過增加序列的長度並新增不同的動作型別(例如拍手或跺腳)來使遊戲更具挑戰性。您還可以使用蜂鳴器或揚聲器為遊戲新增聲音效果。

A Piano Note MIDI.mid.mp3

[編輯 | 編輯原始碼]





C Piano Note MIDI.mid.mp3

[編輯 | 編輯原始碼]





simon-says.py

[編輯 | 編輯原始碼]
import RPi.GPIO as GPIO
import random

# Define the GPIO pins for the LEDs and buttons
led_pins = [17, 27, 22, 23]
button_pins = [5, 6, 13, 19]

# Set up the GPIO pins
GPIO.setmode(GPIO.BCM)
for pin in led_pins:
    GPIO.setup(pin, GPIO.OUT)
for pin in button_pins:
    GPIO.setup(pin, GPIO.IN)

# Define a function to light up an LED
def light_led(pin):
    GPIO.output(pin, GPIO.HIGH)

# Define a function to turn off an LED
def turn_off_led(pin):
    GPIO.output(pin, GPIO.LOW)

# Define a function to generate a random sequence of LEDs
def generate_random_sequence():
    sequence = []
    for i in range(4):
        sequence.append(random.randint(0, 3))
    return sequence

# Define a function to check if the user pressed the buttons in the correct sequence
def check_user_input(sequence):
    for i in range(len(sequence)):
        if GPIO.input(button_pins[sequence[i]]) == False:
            return False
    return True

# Start the game
sequence = generate_random_sequence()

# Light up the LEDs in the sequence
for i in range(len(sequence)):
    light_led(led_pins[sequence[i]])
    time.sleep(0.5)
    turn_off_led(led_pins[sequence[i]])

# Wait for the user to press the buttons in the sequence
while True:
    if check_user_input(sequence):
        # The user pressed the buttons correctly
        sequence += generate_random_sequence()
    else:
        # The user pressed the wrong button
        print("Game over!")
        break

# Clean up the GPIO pins
GPIO.cleanup()
華夏公益教科書