(toiminnot)

hwechtla-tl: Kommentteja ja lisäsääntövihjeitä robogemiin

Kierre.png

Mikä on WikiWiki?
nettipäiväkirja
koko wiki (etsi)
viime muutokset


Robogem on lautapeli, mekaniikaltaan ja teemaltaan käytännössä yksinkertaistettu klooni RAMbots-pelistä tai sitä paljon muistuttavasta Roborallysta. Peliä markkinoidaan suomessa ohjelmoinnin opetuspelinä, ja kieltämättä se muistuttaakin paljon erilaisia netissä olevia "opi ohjelmointia robottien kanssa" -alustoja, mutta vastapelaajat tuovat siihen tietysti oman viehätyksensä. Rambotsissa, Robogemin esikuvassa, robottien vuorovaikutusta on paljon ja se tuo ohjelmiin ennakoimattomuutta. Robogemissä taas ennakoimattomuus syntyy siitä, että ohjelmiin käytettävissä olevat komennot tulevat arpomalla korttipakasta.

Säännöt lyhyesti

Peliä pelataan shakkilaudalla eli 8x8-ruudukolla, johon on lisätty 0--12 estettä ja noin 10 timanttia. Pelin tarkoitus on kerätä kolme timanttia ja palata takaisin kulmassa olevaan tukikohtaan. Peli etenee vuoroissa.

Pelin alussa ja jokaisen vuoron lopussa pelaaja saa pakasta viisi korttia, joista hän asettelee itselleen ohjelman. (Pakassa on 50 eteenpäin-käskyä, 25 vasemmalle ja 25 oikealle kääntymistä, sekä 10 "funktiokutsua".) Pelaaja saa asettaa viisi korttiaan haluamaansa järjestykseen ja jättää niin monta käyttämättä, kuin haluaa. Kun pelaaja on saanut "ohjelmansa" eli korttirivin valmiiksi, kortit suoritetaan yksi kerrallaan.

Jos robotti eteenpäin mennessään osuu: (a) timanttiin, hän saa timantin mukaansa, (b) esteeseen, reunaan tai vastustajaan, jonka takana on jotain, ohjelman suoritus keskeytyy, robotti jää siihen paikkaan ja vuoro loppuu, (c) vastustajaan jonka takana ei ole mitään, vastustaja siirtyy robotin edellä poispäin ja luovuttaa yhden timantin tönijälleen, ja (d) omaan tukikohtaan, timantit jäävät sinne talteen ja voi lähteä tyhjänä jatkamaan etsintöjä. Mielenkiintoisena pikku yksityiskohtana myös timantit katsotaan esteiksi, jos on "täynnä" eli kerännyt jo kolme timanttia.

Ohjelman tekemisen sijaan voi heittää kaikki korttinsa pois, jolloin saa seuraavalle vuorolle viiden kortin sijaan seitsemän.

Peli on ihan hyvä toimintaohjeiden suunnitteluharjoitus ilman funktioita, mutta funktiot ovat pelin oikeasti mielenkiintoinen osa. (Ilman niitä pelissä on käytännössä kyse vain siitä, kuka saa parhaat kortit, joka yleensä merkitsee eniten eteenpäin-käskyjä.) Jos funktiokortit ovat mukana pelissä, pois heitettävät kortit, eli ne, joita ei halua käyttää, saa laittaa poistopinon sijaan talteen "funktioon" (oikeasti aliohjelmaan). Kun ohjelmassa on funktiokortti, sen sijaan suoritetaan kaikki funktiossa tallessa olevat käskyt talletusjärjestyksessä. Funktiossa saa olla enintään viisi käskyä. Jos funktio on täynnä, käyttämättä jätettyjä kortteja ei voi enää laittaa sinne. Myös funktio saa sisältää funktiokortteja. Koska funktiokortti aiheuttaa funktion uudelleensuorituksen, funktion suoritus ei lopu millään muulla kuin seiniin törmäämisellä, mikäli funktio sisältää funktiokortin. Jos robotti ei voi törmätä seiniin ollessaan ikuisessa funktion suorituksessa, säännöissä sanotaan, että koko vuoro perutaan eli robotti palautetaan entiseen paikkaansa.

Yksi omituisimpia asioita on, että ymmärtääkseni ylimääräiset kortit heitetään pois, ennen kuin ohjelman suoritus alkaa, joten ne ehtii laittaa funktioon jo samalle vuorolle. Tämä lisää huomattavasti mahdollisuuksia, mitä korteilla voi tehdä.

Sääntömuunnelmia

Peli suorastaan huutaa "parannuksia" sääntöihinsä. Säännöt on suunniteltu sellaisiksi, että ne on helppo omaksua, mutta ne eivät tue pelin peliluonnetta. Tässä on muutamia ehdotuksia, joilla pelistä saa paljon jännittävämmän.

0) Taistelumoodi: pelin tarkoituksena ei olekaan kerätä timantteja, vaan tönäistä vastustaja esteeseen / ulos laudalta. Vastustaja tippuu siis pois pelistä, kun sitä työnnetään ja takana on este tai laudan reuna. Viimeinen laudalla olija voittaa. (Tämän muunnelman keksi keskimmäinen lapseni.)

0a) Timantit painona: voit työntää vain vastustajia, joilla on sama tai pienempi määrä timantteja kuin sinulla.

0b) Timantit tehonlähteenä: voit työntää 2-muunnelman (jonojen työntö) henkisesti useampia asioita jonossa. Kuinka monta voi työntää jonossa, riippuu siitä, kuinka monta timanttia sinulla on. Vastustajaa ei voi voittaa työntämällä esteen hänen päälleen (vaan vastustaja siirtyy jonossa poispäin), ainoastaan litistämällä vastustajan kahden esteen väliin. Jos työntö työntää vastustajaa ja timanttia vastakkain, vastustaja saa timantin.

1) Esteet ovat työnnettäviä: myös esteitä, ei ainoastaan vastustajia, saa työntää, mikäli niiden takana on tyhjää.

2) Jonojen työntö: myös esteitä/vastustajia, joiden takana on jotain, saa työntää. Takana olevat asiat siirtyvät eteenpäin nekin. Vastustajalta tai maasta saa timantin vain, jos on sen vieressä, ei koskaan esteen tai toisen vastustajan takaa.

3) Etukäteen tehdyt ohjelmat: ohjelma tehdään oman vuoron lopuksi, kun on saanut uudet kortit. Näin muut pelaajat voivat käyttää tietoa muiden ohjelmista avuksi, kun suunnittelevat omaa ohjelmaansa.

4) Yhtaikaa tehtävät ohjelmat: tämä on Rambotsin mahtavin piirre. Kaikki tekevät ohjelmansa yhtaikaa näyttämättä niitä muille. Kun kaikki ovat saaneet ohjelmansa valmiiksi, niitä aletaan suorittaa pelaajat vuorotellen, yksi komento kerrallaan. Tässä tapauksessa pitää tietysti olla jokin sääntö, kuka aloittaa suorituksen, vaikkapa viime vuoron viimeisen komennon suorittaneesta pelaajasta seuraava pelaaja.

4a) Komento, joka ei vie aikaa: jos ohjelmia suoritetaan lomittain, on hauskaa, jos jokin komento (esim. oikealle kääntyminen) ei vie "aikaa", vaan sen perään suoritetaan heti pelaajan seuraava komento.

5) Funktioon saa lisätä kortteja mihin kohtaan vain: perussäännöissä funktion uudet käskyt lisätään aina funktion loppuun. Funktio on paljon monikäyttöisempi ja mielenkiintoisempi, jos ne saa lisätä mihin vain. Sekin parantaa peliä, jos käskyt lisätään aina funktion alkuun lopun sijaan.

6) Ei pituusrajoitusta funktiolle: ainoa hyöty 5 käskyn maksimipituudesta lienee, että silmukoiden kirjoittaminen tulee hivenen houkuttavammaksi. Parempi jättää funktioiden hyvän pituuden harkinta pelaajille.

7) Kaikkia kortteja voi käyttää funktiokutsuina: pelin suurin ongelma on se, että tuurilla on vähän liian iso vaikutus, jos käskyt saadaan suoraan pakasta (vuorot, joilla on esim. 0 tai 1 eteenpäin-käskyä käytettävissä, ovat aika yleisiä). Yksi tapa lievittää tätä on se, että kortin voi aina pelata selkäpuoli ylöspäin, jolloin se on funktiokutsukortti.

7a) Funktiokutsukortti onkin hyppy: jos mitä tahansa korttia saa käyttää funktiokutsuna, varsinaisen funktiokutsukortin voi ottaa uuteen käyttöön, esim. siten että sillä siirrytään edessä olevien esteiden/vastustajien yli niiden takana olevaan ruutuun. Hyppykortista tulee samalla eräänlainen ehtorakenne, koska se on ainoa kortti, joka toimii eri tavalla sen mukaan, mitä robotin edessä on (lukuun ottamatta eteenpäin-korttia, joka joko menee eteenpäin tai lopettaa ohjelman suorituksen kokonaan). Niinpä rekursiivinen funktio hyppää-käänny-kutsu saattaa esteiden sijainneista riippuen tuottaa hyvinkin monimutkaisia tuloksia. Hyppykortti lopettaa ohjelman suorituksen, mikäli hyppy veisi laudan ulkopuolelle.

7b) Funktiokutsukortti onkin suoritushyppy: toinen, paljon mielenkiintoisempi mahdollisuus on uudelleenlanseerata funktiokutsukortti tarkoittamaan: "jos edessäni on este, jätä seuraava komento suorittamatta". Tällä voi saada aikaan erittäin monimutkaisia funktioita. Huomaa, että tässä muunnelmassa ei voi jättää huomiotta rekursiivisen funktiokutsun jälkeisiä kortteja, sillä ne tulevat suoritetuiksi siinä vaiheessa, jos rekursiivinen kutsu jääkin tekemättä. Kirjanpito-ongelmia on siis samaan tapaan kuin 13-muunnelmassa (paikallinen keskeytys), ne eivät vain toteudu ihan niin helposti.

8) Korttien vaihtaminen: pelaajat saavat uudet kortit saatuaan vaihtaa niitä muiden pelaajien kanssa. Jos pelataan 3-muunnelmaa (etukäteen tehdyt ohjelmat), pois vaihdettu kortti/kortit otetaan pois ohjelmasta ja tilalle saatu/saadut asetetaan haluttuun kohtaan, tai heitetään pois tai funktioon.

9a) Korttien valinta: satunnaisen korttien jakamisen sijaan pelaajat vain ottavat haluamansa kortit. Tämä on ihan hyvä lähestymistapa 4-muunnelman (yhtaikaa tehtävät ohjelmat) kanssa, koska yhtaikaa tehdyistä ohjelmista on muutenkin paljon satunnaisuutta pelissä.

9b) Vakiokortit: satunnaisten korttien jakamisen sijaan pelaajat saavat aina 3 eteenpäin-käskyä ja yhden käännöksen kumpaankin suuntaan. Lisäksi yhden kortin voi vaihtaa funktiokutsuun, tai käyttää 7-muunnelmaa (kaikkia kortteja voi käyttää funktiokutsuina). Tämä toimii hyvin 8-muunnelman (korttien vaihtaminen) kanssa.

9c) Korttien valinta vuorotellen: pöytään jaetaan (pelaajien määrä + 1) x 5 korttia, ja pelaajat valitsevat näistä vuorotellen yhden kortin, kunnes kaikilla on viisi. Vasta sitten aletaan rakentaa ohjelmia. Korttien valinnan aloitusvuoro joko siirtyy eteenpäin joka kierroksella tai on aina ikäjärjestys nuorimmasta vanhimpaan. Mikäli tätä ei pelata 4-muunnelman (yhtaikaa tehtävät ohjelmat) kanssa, pitää kierrättää, kenen vuoron jälkeen huutokauppa on. Yksi tapa tähän on se, että se pelaaja, jonka vuoro on kauimpana, ei osallistu korttien valintaan. Toinen on se, että seuraavana vuorossa oleva pelaaja saa ylijäämäkortit ja sommittelee saamistaan korteista kaksi vuoroa.

9d) Korttien huutokauppaaminen: muuten kuin 9c, paitsi että kortteja ei valita vuorotellen, vaan eniten jonkinlaista virtuaalivaluuttaa (jota saa pelin alussa esim. 20 yksikköä) tarjoava saa valita kortin. Pelaajat voivat myös kaupata keskenään kortteja, virtuaalivaluuttaa ja timantteja haluamansa kaltaisina yhdistelminä.

10) Useampia funktioita: sen sijaan, että on vain yksi funktio, jota kutsutaan funktiokutsukortilla, onkin esim. kolme funktiota. Funktiokutsu on kahden kortin yhdistelmä: funktiokutsukortti + eteenpäin-kortti kutsuu funktiota yksi, funktiokutsukortti + vasen käännös funktiota kaksi ja niin edelleen.

11) Enemmän kuin kolme timanttia: jostain syystä säännöissä sanotaan, että timantteja voi jättää omaan tukikohtaan, vaikka tätä ei käytännössä koskaan kannata tehdä (koska tukikohta on niin kaukana ja siellä käväiseminen on suuri ylimääräinen vaiva). Jos pitää kerätä esim. 4 timanttia, tukikohdassa on pakko käydä jossain välissä tyhjentämässä. Tyhjentämisreissun ajoituksen kanssakin voi taktikoida vähän.

12) Tukikohdat keskemmällä: tukikohdat ovat laudan nurkissa, a- ja h-sarakkeiden 1- ja 8-riveillä. Jos tukikohdat ovat lähempänä keskustaa, muilla pelaajilla on paremmat mahdollisuudet estää tönimällä tukikohtaan palaaminen tuhoamatta täysin omaa peliään. Tukikohtien kannattanee olla c- ja f-sarakkeiden 3- ja 6-riveillä.

13) Paikallinen keskeytys: seinään törmääminen ei keskeytä koko ohjelman suoritusta, vaan vain senhetkisen funktiokutsun suorituksen. Tällöin ohjelman suoritus jatkuu funktiokutsun tehneen käskyn jälkeen. Simppelistä kuvauksestaan huolimatta tämä sääntömuunnelma tuottaa paljon monimutkaisuutta. Huomaa, että jos käytät tätä sääntöä, sinun pitää oikeasti pitää muistissa, kuinka monta kertaa funktio on kutsunut rekursiivisesti itseään, tai vieläkin vaikeammin, jos käytät 10-muunnelmaa (useampia funktioita), sinun pitää pitää kirjaa, minkä funktioitten kautta nykyiseen funktioon on tultu. Ja funktiohan voi olla myös moninkertaisesti rekursiivinen, jolloin pitää pitää muistissa, mihin kohtaan asti minkäkin kutsukerran suoritus ehti edetä (jotta voi funktion loppuessa palata oikeaan kohtaan kutsuvaa funktiota).

Kommentteja pelistä

Kuten varmaan huomaatte, peli on minun makuuni liian yksinkertainen. Se on tietysti ihan ymmärrettävää, jos tarkoitus on vain saada lapset kärsivällisesti miettimään toimintaohjeita, joiden vaikutus ei näy heti. Kaikki oikeasti ohjelmoineet kuitenkin tietävät, että (a) ohjelmat ilman silmukoita ovat aika turhia ja naurettavan helppoja tehdä, ja (b) jotta silmukat olisivat hyödyllisiä, pitäisi käytössä olla ehtorakenteita. Toisaalta seiniin törmäämistä voi yrittää käyttää luovasti, mutta harmillisesti vuoro kuitenkin aina loppuu seiniin törmäämiseen.

Hyvää pelissä on se, että sen vaikeutta voi asteittain lisätä lähes loputtomiin. Kolmella funktiolla pelissä saa jo ihan todellisia ohjelmia aikaan, varsinkin jos hyppykäskyt on käytössä. Muutenkin arvostan pelissä suuresti sitä, että hankalat ja vaikeaselkoiset silmukat on korvattu funktiokutsuilla ja rekursiolla. Rekursion eleganssi ohjelmoinnissa siirtyy ihan kiltisti vastaavaksi eleganssiksi pelissä.

Jos haluaa lisätä pelin monimutkaisuutta mahdollisimman vähän mutta parantaa sen peliluonnetta, suosittelen pelkästään 3-muunnelmaa (etukäteen tehdyt ohjelmat). Taitavat pelaajat voivat tällöin käydä tönimässä muita ja aiheuttaa jänniä tilanteita.

Jos haluat kunnon pelin, jossa on todellista taistelua, käytä muunnelmia 0b (taistelumoodi + timantit tehonlähteenä), 5 ja 6 (rajoittamaton funktionmuodostus) sekä 7a (kaikkia kortteja voi käyttää funktiokutsuina + funktiokutsu onkin hyppy).


Pikalinkit:


kommentoi (viimeksi muutettu 05.02.2017 13:06)