Otsikko kertonee kaiken oleellisen.
Eli siis, jotta saisin useampia tutustumaan lempi ohjelmiston kehitys alustaani, niin ajattelin kirjoitella jonkunlaisen oppaan, mikä antaisi perusteet jonkun yksinkertaisen pelin toteuttamiseen Infernolle Limbo-ohjelmointikielellä.
Pelin toteutuksessa ajattelin käyttää Tk:ta. Piirtäminen tapahtuisi puskuriin käyttäen Infernon Draw moduulia, mikä antaa monipuoliset mahdollisuudet grafiikan tuottamiseen. Puskurin sisältö saadaan Tk-ikkunaan käyttämällä panel-widgettiä, johon puskurin sisältö saadaan tk-putimagen avulla.
Haluaisin hyviä ideoita toteutettavaksi peliksi. Pelin pitäisi olla riittävän yksinkertainen, mutta silti riittävän mielenkiintoinen. Matopeliä en halua toteuttaa, siitä löytyy jo Metabolixin kirjoittama hyvä opas, vaikkakin pelin rakenne olisi Infernolla hiukan erilainen.
Peli voisi olla sellainen, minkä olet ajatellut itse toteuttavasi. Olisi mukava tekovaiheessa keskustella erilaisista toteutustavoista ja ideoista.
Ristinolla. Selitä juurtajaksain, miten olet toteuttanut koodivinkeistä löytyvän pelin :) Myös shakki voisi olla hyvä vaihtoehto.
Korjasin ristinollaan pari asiaa. Korjattu versio löytyy koodivinkeistä. Ajattelin nyt kuitenkin toteuttaa jotain uutta.
Shakki on liian monimutkainen toteutettava oppaaseen ja aikani tuskin riittäisi vaadittavien asioiden opiskeluun, jotta siitä saisi edes välttävän toteutuksen.
Joku yksinkertaisempi kahden pelattava verkkopeli tai joku yksinpeli tulisi kyllä kyseeseen. Itse olen miettinyt jotain Boulder Dash:in tapaista tai sitten MBasic:in mukana tulevan Pitman esimerkkipelin tapaista toteutusta.
Muutama ajatus:
Minusta hyvä lähtökohta olisi opettaa ensin järjestelmän asennus ja kielen perusteet, jotka kuuluvat kyllä aivan omaan oppaaseensa. Lisäksi epäilen, ettei monikaan löydä syytä toteuttaa peliä ympäristössä, jota juuri kenenkään koneelta ei löydy, jonka asennuspaketti on aika iso ja joka on ainakin minun kokemukseni mukaan hankala asentaa Linuxiin niin, että se edes jollain tavalla sulautuisi kiltisti muuhun järjestelmään muttei kuitenkaan sotkisi kotihakemistoa.
Kiinnitä erityisesti huomiota oppaan selkeyteen. Koodivinkkisi osoitti, että teet melkoisesti oletuksia siitä, mikä on koodista nähtävissä tai helppo arvata – tyypillinen kokeneen ohjelmoijan ongelma. :) Oppaan lukijaa ei saa yliarvioida. Kommentteja tuskin onnistut koskaan kirjoittamaan liikaa, eikä koodikaan voi olla liian selkeää.
Kannattanee ensin kirjoittaa peli kerran, miettiä asioita uudestaan ja lopuksi kirjoittaa aivan puhtaalta pöydältä "täydellinen" versio runsaasti kommentoituna. Oppaassa koodin on hyvä olla viimeisteltyä ja tyylikästä.
Metabolix kirjoitti:
Lisäksi epäilen, ettei monikaan löydä syytä toteuttaa peliä ympäristössä, jota juuri kenenkään koneelta ei löydy, jonka asennuspaketti on aika iso ja joka on ainakin minun kokemukseni mukaan hankala asentaa Linuxiin niin, että se edes jollain tavalla sulautuisi kiltisti muuhun järjestelmään muttei kuitenkaan sotkisi kotihakemistoa.
Toisaalta Windows käyttöjärjestelmälle Infernon asennus onnistuu yksinkertaisesti vain purkamalla Zip-paketti.
En ole asentanut Infernoa Linuxille, mutta olen ajanut sitä useammalla erilaisella vanhemmalla SGI:n työasemalla Irix käyttöjärjestelmän päällä. Tällöin muistaakseni lisäsin järjestelmään vain oman inferno käyttäjän, jotta oma kotihakemistoni pysyisi koskematta ja suoritin asennus shell-skriptin.
Mielestäni on hyvä, että Inferno ei lisäile esim. Windows asennuksessa mitään asetustietoja tai muuta tauhkaa registryyn tai muualle piiloon. Sen poistaminen onnistuu yksinkertaisesti vain poistamalla asennushakemisto. Sen voi kopioida suoraan muistitikulle, ottaa mukaan ja käyttää vaikka koululla tai töissä.
Käynnistystä varten kannattaa tehdä pikakuvake työpöydälle. Itse käynnistän komennolla:
/inferno/Nt/386/bin/emu -r/inferno -g1280x1024 wm/wm wm/logon -u inferno
Ajattelin jotakin alla olevan kaltaista rakennetta oppaalleni:
1. Tutustuminen Infernon kehitys ympäristöön.
- Acme editori
- Limbo kääntäjä
- Debuggeri
2. Grafiikka
- Context
- Display
- Screen
- Image
- Rect
- Point
3. Tk:n perusteet Infernolla
- Minimaalinen Tk-ohjelma
- Näppäimistö
- Hiiri
- Käyttöliittymän muodostaminen.
- Perus widgetit ja niiden käsittely.
4. TCP/IP (olettaen, että oppaassa toteutetaan verkkopeli)
- Serveri
- Asiakas
5. Pelin toteutus
- Nivotaan edellä opittu yhteen toimivaksi kokonaisuudeksi ja toteutetaan peli.
Miltä tuo vaikuttaisi?
Minne unohtui Limbon esittely kielenä? Perusoppaan lukijalle ei voi sanoa "lue vähän C-opasta ja sovella loput", vaan kaikki täytyy opettaa kädestä pitäen.
Ajattelit viidessä oppaassa opettaa uuden ympäristön, uuden kielen, uuden grafiikkakirjaston, uuden käyttöliittymäkirjaston sekä verkko-ohjelmoinnin ja vielä kirjoittaa pelin. Jos nyt katsotaan vertailun vuoksi matopeliopassarjaani: esitietoina vaaditaan C++-opassarjasta ensimmäiset seitsemän osaa ja SDL-opassarjasta pari osaa, ja lopputuloksena on kaikkiaan 7 + 2 + 4 = 13 osan jälkeenkin hyvin yksinkertainen yhden pelaajan peli. Oma suunnitelmasi kattaa enemmän asioita, ja pelikin on paljon laajempi. En usko, että kukaan pelinteon perusopasta tarvitseva saa noin tiiviistä paketista mitään irti. Jospa vain jätetään peliosuus pois ja laitetaankin nimeksi "Inferno + Limbo + Tk for Gurus in 15 minutes".
Jos ihan tosissasi aiot ruveta projektiin, kirjoita kokeiluversio jostain osasta ja vertaile sitten tekstisi pituutta ja selkeyttä muihin Ohjelmointiputkan oppaisiin. Luultavasti ainakin jompikumpi on pahasti pielessä. Näistä toki pituus on helpompi korjata: jaetaan vain teksti useampaan osaan. Selkeys taas ei tule itsestään, ja viime aikoina linja on sen suhteen ollut hyvin kireä.
Metabolix kirjoitti:
Ajattelit viidessä oppaassa opettaa uuden ympäristön, uuden kielen, uuden grafiikkakirjaston, uuden käyttöliittymäkirjaston sekä verkko-ohjelmoinnin ja vielä kirjoittaa pelin.
Itse asiassa ajattelin käsitellä nuo viisi osiota yhdessä oppaassa. Tarkoituksenani ei ole kertoa asioista kaiken kattavasti, vaan sillä tarkkuudella, mitä noista tarvitsee tietää pystyäkseen toteuttamaan Infernolle Limbolla yksinkertaisen pelin.
Toisin sanoen en varsinaisesti kuvittelekaan opettavani ketään ohjelmoimaan, vaan yritän antaa lähtökohdan, millä aloittaa tutustuminen järjestelmään ja minkä kanssa voi leikkiä ja kokeilla asioita.
Mielestäni tärkein asia ohjelmointia opetellessa ei ole tietää valitsemastaan ohjelmointikielestä kaikkia hienouksia, vaan oppia ajattelemaan.
Aloitan rauhallisesti kirjoittamalla ensin siistin helppolukuisen version pelistä. Tämän jälkeen aloitan itse oppaan tekemisen siten, että opas ja peli tukevat toistensa ymmärtämistä.
Pelin aiheeksi valitsin yksinkertaisen puzzle-pelin, jossa pelaaja liikkuu yhden ruudun kerrallaan ja tarkoituksena on päästä maalialueelle. Pelaaja voi käyttää tikkaita apuna ja työnnellä laatikoita.
Jos täältä löytyisi joku piirtotaitoinen, niin apu olisi tervetullutta.
Alustava kokeilu kentän piirrosta: http://www.tip9ug.jp/who/jalih/map.jpg
Peli alkaa nyt pikkuhiljaa hahmottua, vaikka ajan puute harrasteluun onkin hidastanut etenemistä.
Tähän asti on päästy: http://www.tip9ug.jp/who/jalih/peli.jpg
Kuten arvata saattaa, tikapuilla kiinanpalatsikoira pääsee liikkumaan ylös ja alas. Kiviä voi työnnellä ja ne putoilevat. Pelaaja voi pudota ja jäädä jumiin. Kysessä on siis puzzle-peli, jossa tarkoituksena on löytää tie maaliin, eli luun luo.
Tehtävää löytyy vielä:
Parseri pelin kenttiä varten, pelin tietorakenteet enemmän luokkamaisiksi, valikot, siirtolaskuri, kentän resetointi ja lisäksi mitä mieleen juolahtaa.
Pelin tietorakenteet alkavat olla valmiina. Tällä hetkellä pelattavaa on vain yksi kenttä, joten toteutettavana on vielä level adt kenttää varten, kenttien suunnittelu ja niiden laittaminen listaan.
Pelin tietorakenteissa päädyin alla olevan kaltaiseen luokkamaiseen ratkaisuun:
esim. pelikentällä olevat kivet:
Rock : adt { pos : Point; new : fn(x : int, y : int) : ref Rock; if_can_fall : fn(rock : self ref Rock); }; Rocks : adt { rocks : array of ref Rock; new : fn() : ref Rocks; add : fn(rocks : self ref Rocks, x : int, y : int); sort : fn(rocks : self ref Rocks); draw : fn(rocks : self ref Rocks); if_can_fall : fn(rocks : self ref Rocks); search_pos : fn(rocks : self ref Rocks, pos : Point) : ref Rock; };
Pelikentällä olevien kivien määrittely onnistuu yksinkertaisesti:
rocks = Rocks.new(); # Alusta kivet (tyhjä vielä). rocks.add(7,8); # rocks.add(4,2); # Lisätään rocks.add(4,3); # kiviä (x, y) - koordinaateihin. rocks.add(4,1); # rocks.add(4,0); # rocks.sort(); # Lajittele kivet y - koordinaatin mukaan.
Jos kiireiltäni ehdin, niin laitan toimivan pelin ladattavaksi parin viikon sisällä. Alan myös kirjoittelemaan opasta, mitä voi käyttää apuna koodiin tutustumisessa ja sen ymmärtämisessä.
Sain toimivan parserin pelin kenttiä varten valmiiksi ja peli rupeaa muutenkin olemaan jo melkein valmis. Lisäilen vielä muutaman jutun ennen, kuin kehtaan väittää peliä valmiiksi.
Kunhan käyttämäni Plan 9 - palvelin Japanissa on taas ylhäällä, niin laitan pelin kehitystiedostot ladattavaksi. Koodia on tällä hetkellä vajaat 750 väljää riviä, jokunen pieni kuva peligrafiikkaa varten ja tekstitiedosto pelin kenttiä varten.
Pelinteko-opas seuraa piakkoin perässä.
Puzzle-pelini Infernolle Limbolla on nyt valmis. Toteutettuna on lähestulkoon kaikki, mitä alunperin ajattelin peliin tulevan. Laittaisin zip-pakatun pelin kehityshakemiston ladattavaksi, mutta käyttämäni palvelin on ollut alhaalla jo useamman päivän ajan.
Kyseessä on siis puzzle-peli, jossa ohjataan Kiinanpalatsikoiraa, jonka tarkoituksena on päästä maaliin, eli pelikentällä sijaitsevan luun luo. Tikapuita voi käyttää ylä -ja alasuunnassa liikkumiseen. Kiviä voi työnnellä ja ne myös putoavat kuten pelihahmokin, jos ovat tyhjän päällä. Pelissä on yksinkertainen käyttöliittymä, josta voi liikkua kenttälistassa eteen -ja taaksepäin sekä resetoida kentän jumitilanteessa. Peliin on toteutettu yksinkertainen parseri kenttien tekstitiedostosta lukemista varten.
Saanen huomauttaa että esittelemäsi oppaan sisällön perusteella et opeta mitään itse ohjelmointikielestä: Kukaan ei tuon oppaan perusteella saa mitään järkevää aikaiseksi, eikä mitään ymmärrä pelin sisällöstä ilman laajaa kokemuspohjaa muista samantapaisista kielistä. Tässä valossa taas "oppaasi" on äärimmäisen turha: ainoa mahdollinen "kohderyhmä" (aloittelijat) eivät ymmärrä mistään mitään.
Ei näin.
Laitoin pelin kehitystiedostot ladattavaksi.
Peli tarvitsee epätoivoisesti kenttiä (saa toteuttaa...).
Pelikenttä voi koostua viidenlaisista ruuduista:
EMPTY = tyhjä ruutu
WALL = seinä (este)
WALL2 = hiekkaseinä (päällä voi kävellä, mutta ruutuun voi kaivaa ala -ja sivu suunnissa
LADDER = tikapuu (ylä -ja alasuunnassa liikkumiseen)
GOAL = maali (luu)
Kentät luetaan tekstitiedostosta ja huomionarvoinen asia on, että rivien pitää päättyä unix-tyyppisesti pelkkään LF:ään eli '\n':ään. Kentän koon pitää olla 10x10 ruutua.
Kray kirjoitti:
Saanen huomauttaa että esittelemäsi oppaan sisällön perusteella et opeta mitään itse ohjelmointikielestä: Kukaan ei tuon oppaan perusteella saa mitään järkevää aikaiseksi, eikä mitään ymmärrä pelin sisällöstä ilman laajaa kokemuspohjaa muista samantapaisista kielistä.
Itse aloitin ohjelmointiharrastukseni tutkimalla muiden tekemiä ohjelmalistauksia ja yrittämällä ymmärtää niitä. Ohjelmointikursseja en ole käynyt, mikä välillä voi kyllä näkyä koodin ulkoasussa. En välttämättä tiedä ohjelmointikielen kaikkia hienouksia, mutta olen kuitenkin onnistunut soveltamaan oppimaani ja huomaan oppivani uutta koko ajan.
Kray kirjoitti:
Tässä valossa taas "oppaasi" on äärimmäisen turha: ainoa mahdollinen "kohderyhmä" (aloittelijat) eivät ymmärrä mistään mitään.
Ei näin.
Eikö? Itse olen kiitollinen kaikille, jotka ovat viitsineet jakaa tietoa, kokemuksiaan ja omia tuotoksiaan muiden opittavaksi. Michael Abrash:in kirja: Zen of Assembly Language on muuten edelleen mielestäni paras lukemani ohjelmointiaiheinen kirja. Kirja eroaa monista muista kirjoista siinä, että ohjelmoimaan opettamisen ohessa se opettaa myös jotain tärkeämpää: ajattelemaan.
Lisäsin muuten peliin alustavan äänituen. Laitan myöhemmin äänillä, väli-animaatioilla ja oikeilla kentillä terästetyn pelin ladattavaksi.
jalski kirjoitti:
Itse aloitin ohjelmointiharrastukseni tutkimalla muiden tekemiä ohjelmalistauksia ja yrittämällä ymmärtää niitä.
Väitän, että et oppinut ohjelmoinnin perusteita (ja ennen kaikkea sen vaatimia ajattelutapoja) vain lukemalla jonkun epämääräisen pelin lähdekoodeja - jos opit, et ole tältä planeetalta. Kukaan ei osaa luontaisesti ohjelmointikielien syntakseja, tai niihin sopeutumiseen vaadittavia lainalaisuuksia. Henkilölle, joka ei ole koskaan ohjelmoinut, on kaikkea muuta kuin itsestäänselvää mitä aaltosulut yleensä tarkoittavat, tai mikä on hienon termin int merkitys. Ei, nämä täytyy opettaa kädestä pitäen havainnollistavilla esimerkeillä, mistä tuollainen järkälemäinen koodinpätkä on kaukana. Jos joku joka ei ole ikinä ohjelmoinut yrittää oppia tuon avulla, hän turhautuu ja hylkää koko homman "nörtti touhuna".
Jos taas kyseessä on henkilö, jolla on peruskäsitys ohjelmoinnista ja välttävä englanninkielen taito, hänelle on sata kertaa hyödyllisempiä kunnolliset oppaat eikä "sinne päin" kommentoitu koodimötkäle.
Kray kirjoitti:
Jos taas kyseessä on henkilö, jolla on peruskäsitys ohjelmoinnista ja välttävä englanninkielen taito, hänelle on sata kertaa hyödyllisempiä kunnolliset oppaat eikä "sinne päin" kommentoitu koodimötkäle
Siinä vaiheessa, kun henkilöllä on peruskäsitys ohjelmoinnista ja valitsemastaan ohjelmointikielestä, niin kannattaa keskittyä itse asiaan eli ohjelmointiin.
Ohjelmointikielen syntaksin ja rakenteiden opiskelu on opiskeltavasta määrästä se kaikkein pienin osa. Jos osaa yhden samankaltaisen ohjelmointikielen kohtuullisesti, niin uuden oppiminen välttävästi ei ole kovinkaan vaikeaa.
Hyödyllisempää on opiskella tuntemaan ympäristö mihin ohjelmia kehittää, tutustua erilaisiin algoritmeihin, ohjelmointirajapintoihin ja kirjastoihin. Kaikkein tärkeintä on kuitenkin harjoitella ja tehdä niitä erilaisia ohjelmia.
Tulevan oppaani tarkoitus on keskittyä Inferno-ohjelmoinnin perusteisiin, eikä varsinaisesti uuden ohjelmointikielen opettamiseen.
Ennen oppaan tuomitsemista kannattaa odottaa, että jalski kirjoittaa sen ensin.
Olennaista on, että opas on laadukas, jolloin opas julkaistaan varmasti riippumatta aiheesta ja kohdeyleisön määrästä.
Jos joku kirjoittaa oppaan matopelin tekemisestä Basicilla ja oppaan voi ymmärtää vain yliopiston professori, opas kuitenkin julkaistaan, jos se on laadukas.
Tietysti usein on järkevää valita oppaan aihe niin, että siitä on hyötyä laajalle lukijakunnalle.
Kirjoitin pelin käytännössä kokonaan uusiksi vastaamaan MBasic esimerkkipeliä Pitman. Pelin koodissa on mukana myös yksinkertainen tuki äänille, tosin itse pelissä ei vielä ääniä ole mukana.
Pelissä on 22 kenttää, joista pitäisi rittää haastetta joksikin aikaa.
Lisätietoa löytyypi tuolta: https://www.ohjelmointiputka.net/koodivinkit/
Täytyy olla tosissaan kiinnostunut tämä kielen (limbo) oppimiseen, että tuosta koodista jaksaa vetää jotakin irti =D.
jo123 kirjoitti:
Täytyy olla tosissaan kiinnostunut tämä kielen (limbo) oppimiseen, että tuosta koodista jaksaa vetää jotakin irti =D.
Jep, jalski on jo pitkään tuntunut Infernon Limbon suurlähettiläältä.
Helpottaisi suuresti, jos koodissa olisi edes kommentteja kertomaan, mitä mikäkin kohta tekee. Etenkin, jos koodi on tehty aloittelijoita varten.
tgunner kirjoitti:
Helpottaisi suuresti, jos koodissa olisi edes kommentteja kertomaan, mitä mikäkin kohta tekee. Etenkin, jos koodi on tehty aloittelijoita varten.
Kommentit tulevat kyllä lopulliseen versioon, minkä julkaisen oppaan kanssa. Tuo on kehitysversioni.
Laitoin tuon jo näkyville, koska mielestäni pelistä kuitenkin tuli ihan kiva.
Aihe on jo aika vanha, joten et voi enää vastata siihen.