Igra Simon

Zadnja naloga pri projektu igre Simon bo izdelava celotne delujoče igre Simon. To pomeni, da boš na preizkusno ploščico dodal/-a 4 LED diode (rdečo, modro, oranžno in zeleno), 4 gumbe in priklopil 4-številčni 7-segmentni prikazovalnik ter vse sprogramiral/-a tako, da boš lahko igral igro Simon.

Strojna oprema

  • 1 Malina
  • 1 preizkusna ploščica (angl. breadboard)
  • 1 zatič oblike T s kablom (angl. T-cobbler with breakout cable)
  • 4 LED diode (rdeče, modre, oranžne in zelene barve)
  • 4 upori 330 Ω
  • 4 pritisni gumbi (angl. tactile switch)
  • 4 upori 10 kΩ
  • 1 komponenta TM1637/3642BH 4-številčni 7-segmentni prikazovalnik (angl. 4-digit 7-segment display)
  • vtične žičke moški-moški (angl. jumper wire male-to-male)
  • 4 vtične žičke moški-ženska (angl. jumper wire male-to-female)

Programska oprema

  • Python 3 (prednameščen na Raspbianu)
  • Pythonov modul gpiozero (prednameščen na Raspbianu)
  • Pythonov modul pygame (prednameščen na Raspbianu)
  • Pythonov modul random (prednameščen na Raspbianu)
  • Pythonov modul RPi.GPIO (prednameščen na Raspbianu), ki ga za delovanje potrebuje modul tm1637
  • Pythonov modul time (prednameščen na Raspbianu)
  • Pythonov modul tm1637 (datoteka modula tm1637.py biti mora v isti mapi kot datoteka s kodo, da modul lahko vključiš v svojo kodo)
Opomba

Primere uporabe modula tm1637 si lahko ogledaš v datoteki test.py.

Navodila

  1. Poveži Malinine GPIO nožice in preizkusno ploščico s pomočjo T-zatiča in kabla.
  2. Poveži rdečo LED diodo z nožico GND in nožico GPIO 18 (glej zavihek Vezje).
  3. Poveži modro LED diodo z nožico GND in nožico GPIO 4 (glej zavihek Vezje).
  4. Poveži oranžno LED diodo z nožico GND in nožico GPIO 22 (glej zavihek Vezje).
  5. Poveži zeleno LED diodo z nožico GND in nožico GPIO 23 (glej zavihek Vezje).
  6. Poveži vse gumbe z nožico GND in nožicami GPIO 13, GPIO 16, GPIO 19 in GPIO 20 (glej zavihek Vezje).
  7. Poveži nožico GND komponente z nožico GND na Malini (glej zavihek Vezje).
  8. Poveži nožico DIO komponente z nožico SDA na Malini (glej zavihek Vezje).
  9. Poveži nožico CLK komponente z nožico SCL na Malini (glej zavihek Vezje).
  10. Poveži nožico VCC komponente z nožico 3V3 na Malini (glej zavihek Vezje).
  11. Odpri IDLE in ustvari novo datoteko tako, da klikneš File > New file.
  12. Shrani novo datoteko tako, da klikneš File > Save. Datoteki daj ime simon4.py.
  13. V datoteko simon4.py vnesi kodo z zavihka Koda.
  14. Shrani kodo s Ctrl+S in jo nato zaženi s F5.
  15. Ko boš pognal(-a) program, bo prikazovalnik zaporedno prikazoval nivoje igre od 1 do 20 ter nato še ustrezni sporočili ob koncu igre (ali je igralec zmagal, ali je izgubil).


# encoding: utf-8
import gpiozero
import random
import tm1637
import time
import pygame
pygame.init()


led = [
    gpiozero.LED(4),  # modra
    gpiozero.LED(18), # rdeča
    gpiozero.LED(22), # oranžna
    gpiozero.LED(23)  # zelena
]

start = gpiozero.Button(26) # gumb za začetek igre
gumb = [
    gpiozero.Button(13), # modra
    gpiozero.Button(16), # rdeča
    gpiozero.Button(19), # oranžna
    gpiozero.Button(20)  # zelena
]

zvok = [
    pygame.mixer.Sound('blue.ogg'),   # modra
    pygame.mixer.Sound('red.ogg'),    # rdeča
    pygame.mixer.Sound('orange.ogg'), # oranžna
    pygame.mixer.Sound('green.ogg')   # zelena
]

prikaz = tm1637.TM1637(3, 2)


zaporedje = []
nivo = 0


def predvajaj(i):
    led[i].on()
    zvok[i].play()
    time.sleep(1)
    led[i].off()

def konec_igre():
    prikaz.set_values(['b', 'u', 'u', 'u'])
    prikaz.set_doublepoint(False)
    time.sleep(3)
    prikaz.clear()
    raise SystemExit # nemudoma konča program

def nova_igra():
    zaporedje = []  # sprazni zaporedje lučk
    prikaz.clear()  # prikazovalni ne kaže nič

    # največ koliko nivojev mora igralec ponoviti,
    # da zmaga
    nivoji = 20
    for nivo in range(nivoji):
        time.sleep(1)
        nov_nivo()
        igralec_ponovi_nivo()

    # zmaga igralca
    prikaz.set_doublepoint(False)
    prikaz.set_values(['J', 'A', 'A', 'A'])
    time.sleep(3)
    prikaz.clear()
    

def nov_nivo():
    global nivo, prikaz
    nivo = nivo + 1
    # izpiši nivo
    D = nivo // 10 # desetice
    E = nivo % 10  # enice
    prikaz.set_values(['n', 'I', D, E])
    prikaz.set_doublepoint(True)
    # ustvari novo naključno lučko
    poteza = random.randint(0, 3)
    zaporedje.append(poteza)
    # prižigaj lučke in predvajaj zvoke v zaporedju
    for barva in zaporedje:
        led[barva].on()
        zvok[barva].play()
        time.sleep(1)
        led[barva].off()
        time.sleep(0.2)


def igralec_ponovi_nivo():
    poteza = 0
    while poteza < len(zaporedje):
        # za vsako potezo ima igralec na voljo
        # 5 sekund = 50 x 0.1 sekunde
        for korak in range(50):
            #print(korak)
            # modra
            if gumb[0].is_pressed:
                predvajaj(0)
                if zaporedje[poteza] != 0:
                    konec_igre()
                poteza = poteza + 1
                break
            # rdeča
            if gumb[1].is_pressed:
                predvajaj(1)
                if zaporedje[poteza] != 1:
                    konec_igre()
                poteza = poteza + 1
                break
            # oranžna
            if gumb[2].is_pressed:
                predvajaj(2)
                if zaporedje[poteza] != 2:
                    konec_igre()
                poteza = poteza + 1
                break
            # zelena
            if gumb[3].is_pressed:
                predvajaj(3)
                if zaporedje[poteza] != 3:
                    konec_igre()
                poteza = poteza + 1
                break
            time.sleep(0.1)


prikaz.clear()
while True:
    if start.is_pressed:
        nova_igra()

Izvorna koda