Speden Speli

Alunperin julkaistu: 17.6.2017

Viimeksi muokattu: lauantai 9.12.2017

Jotkut lukijoista muistanevat varmaan legendaarisen Speden Spelit televisio-ohjelmasta tutun nopeuspelin. Kyseisessä pelissä pelaajalla on painettavanaan neljä eri väristä nappulaa, joihin syttyy valo satunnaisessa järjestyksessä. Tällaista peliä olen joskus jossain huoltoasemalla huvikseen pelannut ja hauska pelihän se on kieltämättä.

Varmaan siitä syystä on mielessäni muhinut jo vuosia halu rakentaa sellainen peli myös itselleen. Ei välttämättä sellainen täysin identtinen kopio vaan peli-idealtaan vastaava laitos.

Koska olen blogiin jo rakentelujen eri vaiheista kirjoittanut, koostan tälle sivulle vain linkit rakenteluihin ja lopuksi kerron hieman tarkemmin ohjelman toiminnasta sekä käytetyistä ohjelmista ja apuohjelmista.

http://www.hutasu.net/nopeuspelin-rakentelua-osa-1/
http://www.hutasu.net/nopeuspelin-rakentelua-osa-2-speden-speli/
http://www.hutasu.net/nopeuspelin-rakentelua-osa-3-speden-speli/
http://www.hutasu.net/nopeuspelin-rakentelua-osa-4-speden-speli/
http://www.hutasu.net/nopeuspelin-rakentelua-osa-5-speden-speli/

Lopulliseen versioon sain korjattua löydetyt bugit softasta sekä lisäsin myös DC-pistokkeen kojeen taakse. DC-pistokkeen avulla peliä voi pelata ilman paristoa, kunhan vain töpselisähköä jostain löytyy.

Käytetyt ohjelmistot ja apuohjelmat

Koodin tekemiseen käytin Texas Instrumentsin ilmaista Code Composer Studio -ohjelmaa. Ohjelma on ladattavissa Texasin sivuilla ja sen voi asentaa tietokoneelle joko online-asennuksena tai ladata kaikki asennustiedostot kokonaan levylle.

Mikro-ohjaimena käytin MSP430G2553 piiriä, joka pitää sisällään 16-bittisen prosessorin sekä muita oheislaitteita kuten IO/AD-muunnin/Timereita jne mitä nyt tavanomaisesta mikro-ohjaimesta tuppaa löytymään.

Grace-apuohjelmalla oli kätevä säätää porttipinnien, AD-muuntimien ja timereiden asetuksia graafisesti. Grace onkin koodigenerointityökalu, joka tuottaa tarvittavat .c ja .h -tiedostot mikro-ohjaimen konfigurointiin. Käytännössä MCU:n rekistereihin tarvitsee koskea generoinnin jälkeen vain hyvin vähän ja alustukset ovat kunnossa jo heti lähtiessä.

Piirilevyä en projektista tehnyt vaan rakensin kytkennät näkkärille, tästä syystä myöskään piirikaaviota kytkennästä ei ole (muuta kuin pääkopassa). Kytkentä on kuitenkin aika yksinkertainen, sillä mikro-ohjain ohjailee vain neljää lediä, summeria ja ottaa inputteina 4 kytkintä. Näyttöä puolestaan ohjataan BCD-7-segmentti ohjainpiirin avulla joten yhteensä ohjattavia lähtöjä on viisi ja tuloja neljä.

Ohjelman toiminta

Ohjelma toimii niin, että kun kone käynnistetään niin peli menee automaattisesti ns "demo moodiin". Tämä on siis tila, missä laite vain vilkuttelee ledejä satunnaisin aikavälein. Tämän tilan tarkoituksena on vain viestiä että kone on kunnossa ja odottaa pelaajaa.

Peli alkaa kun pelaaja painaa jotakin näppäintä. Tämä ilmaistaan äänimerkillä ja valoja vilkutellaan kolmesti ja näyttö nollataan. Pienen satunnaisen aikaviiveen jälkeen peli alkaa ja pelaajan tulee pyrkiä painamaan nappuloita siinä järjestyksessä missä kone on ne arponutkin. Pelaaja voi olla enintään 7 näppäintä jäljessä koneesta.

Pelin päälogiikka on alla:

            // Arvotaan random nappula ja soitetaan nappulan ääni ja laitetaan oikea valo palamaan.
            // Laitetaan myös nappulan tieto talteen
            currentKey = randomButton();

            if(rightKeyIndex > sizeof(rightKeyTable) - 1)
            {
                // ei päästetä indeksiä kasvamaan liian suureksi
                rightKeyIndex = 0;
            }

            if(rightKeyTable[rightKeyIndex] == 0) // jos paikalla on 0, niin mitään ei ole arvottu ja pelaaja on kerennyt painamaan oikein
            {
               rightKeyTable[rightKeyIndex++] = currentKey;
            }
            else
            {
               // Liian monta numeroa arvottu koska taulukossa ei ole tyhjää, toisin sanoen pelaaja on liian paljon jäljessä
               gameState = GAME_OVER;
               break;
            }
            currentDelay = gameDelayMs;
            switch (currentKey)
            {
                case 1:
                    SetSound(BUTTON1_SOUND);
                    BUTTON1_LED_ON;
                    break;
                case 2:
                    SetSound(BUTTON2_SOUND);
                    BUTTON2_LED_ON;
                    break;
                case 3:
                    SetSound(BUTTON3_SOUND);
                    BUTTON3_LED_ON;
                    break;
                case 4:
                    SetSound(BUTTON4_SOUND);
                    BUTTON4_LED_ON;
                    break;
                default:
                    break;
            }

            // Ennen seuraavan nappulan arvontaa odotellaan viiveellä,
            // joka pienenee koko ajan kun peli etenee. Tarkastetaan myös painoiko käyttäjä nappia vai
            // heräsikö peli viiveen loputtua
            currentDelay = gameDelayMs;
            while(gameDelayMs)
            {
                updateDisplay();

                // jos nappia on painettu niin ehto täyttyy
                if(pressedKey != NO_BUTTON)
                {

                    if(rightKeyTable[pressedKeyIndex] == pressedKey)
                    {
                        increaseScore();
                        rightKeyTable[pressedKeyIndex] = 0;
                    }
                    else
                    {
                        gameState = GAME_OVER;
                        gameDelayMs = 0;
                    }

                    pressedKeyIndex++;
                    if(pressedKeyIndex > sizeof(rightKeyTable) - 1)
                    {
                        pressedKeyIndex = 0;
                    }
                    pressedKey = NO_BUTTON;
                }
            }

            gameDelayMs = calculateNewDelay(currentDelay);

            BUTTON_LEDS_OFF;
            StopSound();

Alta löytyy video, mistä nähdään pelin toiminta käytännössä:

Lopuksi vielä pahoittelen hieman vajaavaista rakentelu-päivitystä, mutta tsekkaa blogimerkinnät sivun alusta niin siitä pitäisi vähän syvällisempää tietoa saada tämän homman tiimoilta.

Ei muuta kuin ensi kertaan!