011
09.10.2002, 16:31 Uhr
Bruder Leif
dances with systems (Operator)
|
So, hier ne graphische Möglichkeit. Ist zwar C# und erzeugt den Startzustand zufällig, aber ganz nett anzuschauen:
C++: |
using System; using System.Drawing; using System.Threading; using System.Windows.Forms;
class Test: Form { private Thread aThread; private Pen aBlackPen, aWhitePen; private Graphics aGraphics;
//------------------------------------------------------------------------------
private void MatrixOut(bool[,] bMatrix) { for(int y=1, PaintY=0; y<51; y++, PaintY+=5) { for(int x=1, PaintX=0; x<51; x++, PaintX+=5) { if(bMatrix[x,y]) aGraphics.DrawRectangle(aBlackPen, PaintX, PaintY, 4, 4); else aGraphics.DrawRectangle(aWhitePen, PaintX, PaintY, 4, 4); } } }
//------------------------------------------------------------------------------
private void NextGen(bool[,] bCurrentMatrix, bool[,] bNextMatrix) { // Neue Belegung in der nächsten Generation ermitteln int iLivingNeighbors; bool bLiving;
for(int x=1; x<51; x++) { for(int y=1; y<51; y++) { bLiving = bCurrentMatrix[x,y]; iLivingNeighbors = 0;
// Erst mal zählen. Wie viele "lebende" Nachbarn hat die Zelle eigentlich? if(bCurrentMatrix[ x-1, y-1 ]) iLivingNeighbors++; if(bCurrentMatrix[ x-1, y ]) iLivingNeighbors++; if(bCurrentMatrix[ x-1, y+1 ]) iLivingNeighbors++; if(bCurrentMatrix[ x, y-1 ]) iLivingNeighbors++; if(bCurrentMatrix[ x, y+1 ]) iLivingNeighbors++; if(bCurrentMatrix[ x+1, y-1 ]) iLivingNeighbors++; if(bCurrentMatrix[ x+1, y ]) iLivingNeighbors++; if(bCurrentMatrix[ x+1, y+1 ]) iLivingNeighbors++;
if(iLivingNeighbors < 2 || iLivingNeighbors > 3) bLiving = false; else if(iLivingNeighbors == 3) bLiving = true;
bNextMatrix[x,y] = bLiving; } } }
//------------------------------------------------------------------------------
private void myTimerFunc() { Random aRandom;
aRandom = new Random();
// Zwei Arrays erstellen: Eins für die aktuelle Generation, eins für die nächste (jeweils abwechselnd) // Dabei einen "Rand" von 1 Punkt lassen (immer "tot", erspart uns einen Haufen Überprüfungen) bool[,] bMatrix1 = new bool[52, 52]; bool[,] bMatrix2 = new bool[52, 52]; int iCurrentMatrix = 1;
// Startmatrix mit Zufallswerten füllen Random r = new Random(); for(int x=1; x<51; x++) for(int y=1; y<51; y++) bMatrix1[x,y] = (r.Next() % 100 > 80); // Anderer Wert für andere Startdichte
// Und los gehts! for(;;) { if(iCurrentMatrix==1) { MatrixOut(bMatrix1); NextGen(bMatrix1, bMatrix2); iCurrentMatrix = 2; } else { MatrixOut(bMatrix2); NextGen(bMatrix2, bMatrix1); iCurrentMatrix = 1; } Thread.Sleep(50); } }
//------------------------------------------------------------------------------
private void OnClosing(object sender, System.ComponentModel.CancelEventArgs e) { aThread.Abort(); }
//------------------------------------------------------------------------------
public Test() { ClientSize = new Size(250, 250); Text = "Game Of Life"; FormBorderStyle = FormBorderStyle.FixedSingle; MaximizeBox = false;
aBlackPen = new Pen(Color.Black, 1); aWhitePen = new Pen(Color.White, 1); aGraphics = CreateGraphics(); Closing += new System.ComponentModel.CancelEventHandler(OnClosing); aThread = new Thread(new ThreadStart(myTimerFunc)); aThread.Start(); }
//------------------------------------------------------------------------------
public static void Main() { Application.Run(new Test()); }
//------------------------------------------------------------------------------
}
|
Sollte eigentlich auch relativ einfach nach API-C umsetzbar sein... *grübl* -- Mit 40 Fieber sitzt man nicht mehr vor dem PC. Man liegt im Bett. Mit dem Notebook. |