Pixel-liv
- Tuesday, May 25th, 2010
- Skriv en kommentar
I denne blogposten om hvordan det er å være en gammer programmerer refererte Uncle Bob Martin i kommentarfeltet til noe han kalte Langton’s Ant. Wikipedia kunne fortelle meg at dette er en todimensjonal Turingmaskin oppfunnet av Chris Langton i 1986. Den består av et par enkle regler, men utviser kompleks, emergent adferd. Reglene er: Står mauren på en hvit celle, snu 90 grader til høyre – står mauren på en svart celle, snu 90 grader til venstre. Endre deretter fargen på cellen, og gå én celle frem.
Langton’s Ant virket som en interessant, liten programmeringsoppgave i samme bane som Conway’s Game of Life. Jeg fikk selvsagt lyst til å prøve meg på en implementasjon, så jeg satte igang i mitt favoritt-fritids-språk Ruby. For den grafiske representasjonen fant jeg frem Gosu, et genialt og enkelt rammeverkt jeg har sett litt på tidligere for å lage grafiske spill i Ruby. Gosu gir meg et vindu med en update-draw-syklus (for dem som er vandt til spill-utvikling), og enkle metoder for å plassere og manipulere grafikk.
Og her er resultatet – etter noen få hundre steg har mauren laget en liten krussedull:
![]()
Ser du den lille, rød mauren? Etter noen tusen steg virker det som om alt bare er kaos:
Men etter rundt 10.000 steg begynner det å skje noe. Mauren begynner å lage en “motorvei”. Det er ikke bevist at dette alltid vil skje, men alle forsøk som er gjort – uansett start-forhold – har før eller senere produsert et slikt mønster.
Det var ganske kult å for en gangs skyld ikke kunne skrive enhetstester for adferden jeg var ute etter. I stedet måtte jeg vente over ti tusen sykler (ca 2,8 minutter – 0,01685 sekund pr steg – en framerate på nesten 60 pr sekund) for å se at mauren min fungerte som den skulle. Jeg kunne selvsagt skrevet tester for andre ting, men valgte å kjøre uten sikkerhetsnett denne gangen.
Hvis noen er interessert i å se koden så ligger den på min github-konto. Selve logikken for å vise et todimensjonalt sort/hvitt grid i et Gosu-vindu gjorde jeg generell. Jeg implementerte også en versjon av Conway’s Life med den – den ble noe tregere enn jeg hadde håpet, skylder det på Gosu-rammeverket inntil jeg finner en bedre optimalisering i min egen kode :P
![]()
Hva har du gjort i dag for å bli en bedre utvikler enn du var i går? Her er to forslag til hva du kan gjøre. 1) Les koden min, last den ned, og forsøk enkelte modifikasjoner for å forsikre deg om at du forstår den. Kom gjerne med spørsmål til koden, eller forbedringsforslag. Eller 2) Implementer din egen Langton’s Ant. Hva med en .NET-implementasjon vha. XNA?
Kategorier: Diverse prosjekter, Ruby.
RSS feed for kommentarene.
Tilbaketråkk.



May 25th, 2010 at 8:17 pm
Koselig. Fikk umiddelbart lyst å gjøre det i JavaScript + HTML 5. Vi får se hva fremtiden bringer :)
May 26th, 2010 at 5:10 pm
Hei,
jeg er ikke spesielt aktiv på å skrive i min egen blogg om diverse utvikling jeg holder på med. Men i arbeidet mot å bli en generelt bedre utvikler kan jeg klart se fordeler i å oppdatere så ofte som mulig. Fant bloggen din for noen uker tilbake, og har lest en del av innleggene dine og “veien” – som du beskriver det – til å bli en bedre utvikler. Du skal ha kudos for å ha klart å oppretteholde en grei post-frekvens! :)
Som en code-kata jeg ville gjøre selv, implementerte jeg en Conway’s Game of Life i C# med mye fokus på å skrive tester og generell TDD tankegang under uviklingen.
Det jeg stusser litt på var utsagnet ditt om at du ikke lengre kunne skrive tester. Dette gjorde jeg da jeg skreiv min implementasjon, som i og for seg stiller under de samme premissene som Langdon’s Ant. Jeg mener at dersom du vet reglene for spillet ditt, så bør du i det minste også kunne skrive en test for et forventet resultat?
Jeg skreiv en tester som hadde et input, output og et expectedoutput. Jeg setter først opp input, og deretter det jeg forventer å få i output. Så sjekker jeg output mot expectedoutput.
Det er riktignok bare noen få tester jeg har foretatt meg, og de har mest fokus på at input og output er som forventet.
Spørsmålet er da om det kanskje ikke var det du mente i det hele tatt? Uansett, resultatet mitt av dette ble en ganske så dynamisk Game of Life implementasjon som jeg kan skrive egne render-komponenter til. Jeg hadde på forhånd tenkt at jeg ikke kun ville forholde meg til konsoll, og begynte før helgen å føre dette prosjektet i XNA. :)
Kildekoden til testingen kan du se her: http://kwgameoflifekata.pastebin.com/WaGCDASh
Eksempel på output fra en test:
Gameboard result is not what is expected
Input:
…..
.##..
.##..
…..
…..
Result:
…..
…..
…..
…..
…..
Expected:
…..
.##..
.##..
…..
…..
May 27th, 2010 at 8:55 am
Hei Kenneth, og takk for skryt. Jeg beklager at jeg gav inntrykk av at jeg ikke kunne skrive tester for denne type kode.., selvsagt kan du det, og jeg er glad du ikke lot deg stoppe.
Når jeg sa “ikke kunne skrive enhetstester for adferden jeg var ute etter” så mente jeg at jeg ikke kunne, eller ikke så det hensiktsmessig, å skrive tester for den adferden som dukker opp først etter 10.000 steg. Altså det at mauren min ville produsere en motorvei.
Jeg kunne ha studert hvilke forhold som fører til en motorvei, og så satt opp et slikt input, kjørt noen steg, og verifisert motorvei i output. Men reglene for Langton’s Ant sier ingen ting om denne adferden, så jeg måtte nesten hatt en fungerende implementasjon for å finne hva input/tilstanden måtte være.
For alt det andre burde jeg had skrevet tester, og det var med en følelse av å være en rebell jeg droppet det. Og jeg angret da jeg måtte lete etter en irriterende bug mot slutten, så det er ikke en anbefaling.
June 14th, 2010 at 3:02 pm
Som vanlig nok en konge post! Digger at noen leverer bra innhold på Norsk :)
Implementerte Game Of Life som skoleoppgave, og implementasjonen ligger ute på http://jonas.follesoe.no/PermaLink,guid,19314bc0-ca08-43e5-ba51-2181c959a4d6.aspx – om du har Java installert kan du kjøre applikasjonen direkte ved å åpne JAR fila: http://jonas.follesoe.no/ct.ashx?id=19314bc0-ca08-43e5-ba51-2181c959a4d6&url=http%3a%2f%2fjonas.follesoe.no%2fcontent%2fbinary%2fGameOfLife.jar
En morsom ting med Game Of Life er at det finnes en del “kjente” mønster som repeterer seg gjennom generasjoner. F.eks kan du lage en bie som flyr over skjermen, en pulserende stjerne osv.
F.eks:
0*0
***
*0*
***
0*0
vil vokse til en pulserende stjerne. :)