|
Seite 1 von 1
|
[ 2 Beiträge ] |
|
Autor |
Nachricht |
chrisi1698
Registriert: 10/2007 Beiträge: 23 + 3
|
40 - Game of Life
da es heute in der ue keiner sonst hatte (dabei haett ich gedacht es waer einfacher als das n-queens-problem) und es vlt doch wen interessiert: | | | | Code: get_val := proc (mx::Matrix, r::integer, c::integer) local mrows, mcols, rn, cn; mrows, mcols := LinearAlgebra[Dimension](mx); rn := `mod`(r-1, mrows)+1; cn := `mod`(c-1, mcols)+1; return mx[rn, cn]; end proc;
get_alive_neighbors := proc (mx::Matrix, r::posint, c::posint) local i, j, alive; alive := 0; for i from r-1 to r+1 do for j from c-1 to c+1 do alive := alive+get_val(mx, i, j) end do; end do; alive := alive-mx[r, c]; return alive; end proc;
game_of_life := proc (mx::Matrix, gen::nonnegint) local n, r, c, mrows, mcols, mx1, mx2, an; mrows, mcols := LinearAlgebra[Dimension](mx); mx1 := LinearAlgebra[Modular][Copy](13, mx); for n to gen do mx2 := LinearAlgebra[Modular][Copy](13, mx1); for r to mrows do for c to mcols do an := get_alive_neighbors(mx1, r, c); if mx1[r, c] = 0 then if an = 3 then mx2[r, c] := 1; end if; else if an < 2 or 3 < an then mx2[r, c] := 0; end if; end if; end do; end do; mx1 := LinearAlgebra[Modular][Copy](13, mx2); end do; return mx1; end proc;
# simple test MX := Matrix(5, 4, [[0, 0, 0, 0], [0, 1, 0, 0], [0, 1, 1, 0], [1, 1, 1, 0], [0, 0, 1, 1]]); for generation from 0 to 5 do game_of_life(MX, generation); end do;
| | | | |
lg
|
Do 09-12-2010 15:05:33 |
|
|
ABotond
Registriert: 04/2010 Beiträge: 21
|
Re: 40 - Game of Life
Meine Version (damit mehrere gibt): | | | | Code: with(LinearAlgebra):with(plots):
GameOfLife:=proc(n,m,cycles::posint) local NewGame,NBCount,curmatrix,GetElem,NextGen,s,k,b;
NewGame:=proc() curmatrix:=(Matrix(n,m)); curmatrix[7,7]:=1;curmatrix[7,8]:=1;curmatrix[7,9]:=1;curmatrix[8,7]:=1;curmatrix[9,8]:=1; #Glider #curmatrix:=RandomMatrix(n,m,generator=0..1); end;
GetElem:=proc(xx,yy::integer) local l,r; if xx<1 then l:=eval(n); else if xx>n then l:=1; else l:=xx; fi; fi; if yy<1 then r:=eval(m); else if yy>m then r:=1; else r:=yy; fi; fi; return curmatrix(l,r); end;
NBCount:=proc(x,y::nonnegint) return GetElem(x-1,y-1)+GetElem(x-1,y)+GetElem(x-1,y+1)+GetElem(x,y-1)+GetElem(x,y+1)+GetElem(x+1,y-1)+GetElem(x+1,y)+GetElem(x+1,y+1); end;
NextGen:=proc() local nm, i, j, nc; nm:=Matrix(n,m); for i from 1 to n do for j from 1 to m do nc:=evalf(NBCount(i,j)); if (curmatrix(i,j)=1 and (nc=2 or nc=3)) then nm(i,j):=1; fi; if (curmatrix(i,j)=0 and nc=3) then nm(i,j):=1; fi; end do; end do; curmatrix:=nm; return curmatrix; end;
NewGame(); return seq(matrixplot(NextGen(),scaling=constrained,heights=histogram,gap=0.2,axes=framed,style=patch),k=1..cycles);
end;
| | | | |
Verwendung:
|
Do 09-12-2010 22:59:39 |
|
|
|
Seite 1 von 1
|
[ 2 Beiträge ] |
|
Wer ist online? |
Mitglieder in diesem Forum: 0 Mitglieder und 2 Gäste |
|
Du darfst neue Themen in diesem Forum erstellen. Du darfst Antworten zu Themen in diesem Forum erstellen. Du darfst deine Beiträge in diesem Forum nicht ändern. Du darfst deine Beiträge in diesem Forum nicht löschen. Du darfst keine Dateianhänge in diesem Forum erstellen.
|
|