跳转到内容

维基少年:树莓派/树莓派“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()
华夏公益教科书