10.07.2015 Views

Game of Life i MATLAB

Game of Life i MATLAB

Game of Life i MATLAB

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

Kapitel 2ImplementationImplementationen av <strong>Game</strong> <strong>of</strong> <strong>Life</strong> i <strong>MATLAB</strong> kommer bli något av ettfulhack, då <strong>MATLAB</strong> egentligen inte är konstruerat för att göra saker somdessa. I vissa avseenden är <strong>MATLAB</strong> dock mycket väl lämpat för dennauppgift, främst när det gäller representationen av själva världen i spelet,som bekvämt kan göras med hjälp av matriser.2.1 Regler<strong>Game</strong> <strong>of</strong> <strong>Life</strong> följer ett bestämt antal regler. I grunden fungerar det så attmellan varje generation elimineras eller uppstår nya celler i rutnätet, baseratpå dessa fyra regler:1. Levande celler med mindre än två levande grannar dör2. Levande celler med mer än tre grannar dör3. Levande celler med två eller tre grannar överlever4. Döda celler med exakt tre levande grannar återuppstårRegel 3 följer helt enkelt av de två första, som ska simulera ensamhetrespektive trängsel. Den sista regeln är den enda som faktiskt skapar liv,men detta är fullt tillräckligt. Det bör även nämnas att dessa regler endastgäller för tvådimensionella rutnät med celler som är kvadratiska, dvs. varjecell har nio grannar. Det finns även regeluppsättningar för hexagonala rutnät.Man kan även definiera vissa begrepp så som ljushastighet (en ruta pergeneration) och namn på olika grupper av figurer, men det är irrelevant föruppgiften i fråga.3


2.2 ExempelkörningEn exempelkörning kommer nu att demonstreras. Vi kör GoL.m i MAT-LAB, och får upp ett rutnät, 40×40 rutor stort (notera att källkoden har ettstörre rutnät, detta p.g.a. ytterligare tester efter exempelkörningen). MAT-LAB säger nu åt oss att mata in vår startgeneration genom att med musenklicka på de rutor vi vill aktivera (eller inaktivera) och därmed skapa enintressant startuppställning, som kan ses i Figur 2.1a.Vi trycker enter för att avsluta inmatningen och därmed starta simuleringen.Efter ett par generationer går vi tillbaks till <strong>MATLAB</strong>s fönster ochstoppar exekveringen, då ingen pausfunktion har implementerats. Detta föratt kunna spara ännu en bild för att visa att vår implementation verkligenfungerar, vilket den gör. Som man kan se i Figur 2.1b har det gått ett pargenerationer, och vår glider har rört sig diagonalt några rutor.(a) Inmatning av första generationen(b) Rutnätet efter några generationerFigur 2.1: Resultatet av testkörningen som gjordes, då en så kallad gliderritats upp som första generation.Några saker skall påpekas när det gäller källkoden i Appendix A; dennahar nämligen utvecklats något sedan den här exempelkörningen utfördes.Rutnätet har utökats till 150 × 113 celler för att bättre kunna studera litestörre mönster, en generationsräknare har lagts till för att kunna föra liteinexakt statistik över mönster, och lite kosmetiska ändringar har gjorts.4


l i f e ( floor ( x ) +1, floor ( y ) +1) =not ( l i f e ( floor ( x ) +1, floor ( y ) +1) ) ;d r a w l i f e ( l i f e ) ;while ( 1 )line ( hlinex , hliney , ’ Color ’ , l i n e c )line ( vlinex , vliney , ’ Color ’ , l i n e c )[ x y ] = ginput ( 1 ) ;i f ( isempty ( x ) ˜= 1)l i f e ( floor ( x ) +1, floor ( y ) +1) =not ( l i f e ( floor ( x ) +1, floor ( y ) +1) ) ;d r a w l i f e ( l i f e ) ;else%saveas ( gcf , ’ Figur1 . eps ’ ) ;d r a w l i f e ( l i f e ) ;breakendendg e n e r a t i o n s = 0 ;while ( 1 )l i f e =nextgen ( l i f e ) ;d r a w l i f e ( l i f e ) ;text ( width /200 , height , [ ’ \ bfGeneration ’ ,num2str( g e n e r a t i o n s ) ] , ’ Color ’ , ’ b ’ ,’ VerticalAlignment ’ , ’ top ’ ) ;pause (25/( width∗ height ) ) ;g e n e r a t i o n s = g e n e r a t i o n s + 1 ;endA.2 Drawlifegrid.mfunction a = D r a w l i f e g r i d ( l g r i d )cla ;[w h ] = size ( l g r i d ) ;fori =1:wforendj =1:hi f l g r i d ( i , j )==1patch ( [ i −1; i ; i ; i −1] ,[ j −1; j −1; j ; j ] , [ 0. 8 0 ] , ’ EdgeColor ’ , ’ none ’ ) ;end6


endendA.3 Nextlifegen.mfunction b=N e x t l i f e g e n ( l g r i d )[w h]= size ( l g r i d ) ;l=zeros (w+2,h+2) ;l ( 2 : (w+1) , 2 : ( h+1) )=l g r i d ;l g r i d=l ;ng=zeros (w, h ) ;forendendb=ng ;endi =2:(w+1)forj =2:(h+1)p r e v i=i −1;n e x t i=i +1;p r e v j=j −1;n e x t j=j +1;gr = l g r i d ( p r e v i : nexti , p r e v j : n e x t j ) ;gr ( 2 , 2 ) =0;s=sum(sum( gr ) ) ;i f l g r i d ( i , j )==1 && ( s==2 | | s==3)ng ( previ , p r e v j ) =1;e l s e i fng ( previ , p r e v j ) =1;elseng ( previ , p r e v j ) =0;endl g r i d ( i , j )==0 && s==37

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!