heute ist der Geburtstag von
Pierre-Simon Laplace (28.03.1749 - 05.03.1827)


Auf das Thema antworten  [ 2 Beiträge ] 
40 - Game of Life 
Autor Nachricht

Registriert: 10/2007
Beiträge: 23 + 3
Mit Zitat antworten
Beitrag 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
Diesen Beitrag melden
Profil

Registriert: 04/2010
Beiträge: 21
Mit Zitat antworten
Beitrag 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:

Code:
h:=GameOfLife(10,10,100);
display3d(h,insequence=true);


Do 09-12-2010 22:59:39
Diesen Beitrag melden
Profil
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Auf das Thema antworten   [ 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.

Suche nach:
Gehe zu:  
cron
Powered by phpBB © phpBB Group.  |  Designed by STSoftware for PTF  |  © Czechnology 2007 - 2024  |  Deutsche Übersetzung durch phpBB.de