Autor Beitrag
Nini Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 170
Erhaltene Danke: 12



BeitragVerfasst: Di 24.03.15 17:39 
ja, so läuft das programm wieder :)
Narses
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10183
Erhaltene Danke: 1256

W10ent
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Di 24.03.15 17:46 
Moin!

OK, dann setz N doch mal testweise auf 10 und starte das Programm. Was fällt auf? ;)

cu
Narses

_________________
There are 10 types of people - those who understand binary and those who don´t.
Nini Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 170
Erhaltene Danke: 12



BeitragVerfasst: Di 24.03.15 17:50 
mit N=10 ist das Raster 10x10 groß
Narses
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10183
Erhaltene Danke: 1256

W10ent
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Di 24.03.15 18:10 
Moin!

Ja, klar. :lol: Aber das Fenster dürfte doch in der Größe nicht passen und kommt man noch an den Automatik-Button dran? ;)

cu
Narses

_________________
There are 10 types of people - those who understand binary and those who don´t.
Nini Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 170
Erhaltene Danke: 12



BeitragVerfasst: Di 24.03.15 18:22 
ne, das fenster musste ich größer machen und das dinf zum simulation starten musste ich auch verschieben :P
Narses
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10183
Erhaltene Danke: 1256

W10ent
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Di 24.03.15 18:27 
Moin!

OK, dann schlage ich vor:
  • du verschiebst die Automatik-Checkbox nach oben
  • du passt die Koordinaten-Berechnung für die Shapes an, so dass sie etwas weiter unten liegen
  • mit der Eigenschaft ClientWidth und ClientHeight kannst du die Größe des Fensters in der FormCreate-Methode auch per Code anpassen
cu
Narses

_________________
There are 10 types of people - those who understand binary and those who don´t.
Nini Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 170
Erhaltene Danke: 12



BeitragVerfasst: Di 24.03.15 20:18 
jaaa, so klappts :) jetzt passt das fenster
Narses
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10183
Erhaltene Danke: 1256

W10ent
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Di 24.03.15 21:09 
Moin!

Dann zeig doch bitte nochmal den aktuellen Stand der FormCreate-Methode. :les: ;)

Was soll´s denn als nächstes sein? :D Möchtest du die Regeln für Geburt/Tod anpassbar machen? Oder willst du lieber erst die Feldgröße vom Benutzer wählen lassen? :nixweiss:

Bedenke: was auch immer du wählst, du musst dazu auch irgend eine Idee haben, wie man das denn umsetzen könnte... 8) (klar, das muss kein fertiger Code sein, eine umgangssprachliche Beschreibung, wie vorzugehen ist oder welcher besondere "Trick"/Gedanke weiterhilft, um an´s Ziel zu kommen, reicht auch schon) :idea:

cu
Narses

_________________
There are 10 types of people - those who understand binary and those who don´t.
Nini Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 170
Erhaltene Danke: 12



BeitragVerfasst: Di 24.03.15 21:21 
also die aktuelle formcreate-methode
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
procedure TForm1.FormCreate(Sender: TObject);
var snr,y,x : integer;
    shape : TShape;
begin
  for y := 0 to N-1 do
   for x := 0 to N-1 do begin
    Shape := TShape.Create(Self); // Shape-Objekt erzeugen, als Eigentümer das Formular (=Self) angeben
    Shape.Parent := Self; // das neue Shape soll auf dem Formular (=Self) angezeigt werden
    snr := x +y *N +1;
    Shape.Name := 'Shape'+inttostr(snr); // Name der Komponente
    Shape.Left := 8+x*25// 8 Pixel vom linken Rand
    Shape.Top := 48+y*25// 8 Pixel vom oberen Rand
    Shape.Width := 25// 25 Pixel breit
    Shape.Height := 25// 25 Pixel hoch
    Shape.OnMouseDown := @Shape1MouseDown; // haben wir hier nicht, aber so weist man eine Methode zu
    ClientHeight := N*25+100;
    ClientWidth := N*25+80;
   end;
end;




ich würde die Regeländerun bevorzugen.
Mein ganz grober plan: Ich muss eingeben können,was passiert bei wie viel NAchbarn, dafür würde ich checkboxen nehmen, also 8 für geburt und 8 für tod, wenn nichts gewählt wird für ne bestimmte nachbar-anzahl, dann passiert nichts mit der Zelle.
Und dann muss das Ergebnis, ob die Zelle geboren wird in die Rechnen-prozedur einlesen können, damit die das dann anwenden kann
Narses
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10183
Erhaltene Danke: 1256

W10ent
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Mi 25.03.15 00:07 
Moin!

user profile iconNini hat folgendes geschrieben Zum zitierten Posting springen:
also die aktuelle formcreate-methode
Warum setzt du denn N^2 mal die Formulargröße? :shock: Einmal reicht doch... :angel: Aber sonst OK. ;)

user profile iconNini hat folgendes geschrieben Zum zitierten Posting springen:
ich würde die Regeländerun bevorzugen.
OK, dann machen wir die Regeln anpassbar. :zustimm:

user profile iconNini hat folgendes geschrieben Zum zitierten Posting springen:
dafür würde ich checkboxen nehmen, also 8 für geburt und 8 für tod, wenn nichts gewählt wird für ne bestimmte nachbar-anzahl, dann passiert nichts mit der Zelle.
Dann füg doch bitte mal der Anwendung ein weiteres Formular hinzu. Das gestaltest du so, wie du dir die Oberfläche für die Regeldefinition vorstellst und dann stellst du einen Screenshot hier rein. :lupe:

user profile iconNini hat folgendes geschrieben Zum zitierten Posting springen:
Und dann muss das Ergebnis, ob die Zelle geboren wird in die Rechnen-prozedur einlesen können, damit die das dann anwenden kann
Klar, das schauen wir uns dann an. ;)

cu
Narses

_________________
There are 10 types of people - those who understand binary and those who don´t.
Nini Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 170
Erhaltene Danke: 12



BeitragVerfasst: Mi 25.03.15 12:36 
ich würd das so machen:
Regeländerung
Einloggen, um Attachments anzusehen!
Narses
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10183
Erhaltene Danke: 1256

W10ent
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Mi 25.03.15 18:13 
Moin!

OK, wie müssten denn die Haken gesetzt werden, um die aktuellen Regeln abzubilden? :lupe:

cu
Narses

PS: Hast du den Fehler mit der Fenstergröße noch behoben? ;)

_________________
There are 10 types of people - those who understand binary and those who don´t.
Nini Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 170
Erhaltene Danke: 12



BeitragVerfasst: Mi 25.03.15 18:52 
ne, weiß nicht was ich da ändern muss :P funktioniert ja so

so mit jetzigen regeln wär's das
Regeländerung
Einloggen, um Attachments anzusehen!
Narses
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10183
Erhaltene Danke: 1256

W10ent
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Mi 25.03.15 23:53 
Moin!

user profile iconNini hat folgendes geschrieben Zum zitierten Posting springen:
:P funktioniert ja so
Hmhm. :| Wenn du also bei N=10 insgesamt 100 mal die Fenstergröße setzt, dann ist das OK? :suspect: :schmoll:

user profile iconNini hat folgendes geschrieben Zum zitierten Posting springen:
ne, weiß nicht was ich da ändern muss
Wozu sind hier die beiden markierten Worte da? :lupe:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
procedure TForm1.FormCreate(Sender: TObject);
var snr,y,x : integer;
    shape : TShape;
begin
  for y := 0 to N-1 do
   for x := 0 to N-1 do begin
    Shape := TShape.Create(Self); // Shape-Objekt erzeugen, als Eigentümer das Formular (=Self) angeben
    ...
    Shape.OnMouseDown := @Shape1MouseDown; // haben wir hier nicht, aber so weist man eine Methode zu
    ClientHeight := N*25+100;
    ClientWidth := N*25+80;
   end;
end;


user profile iconNini hat folgendes geschrieben Zum zitierten Posting springen:
so mit jetzigen regeln wär's das
OK, allerdings würde ich bevorzugen in beiden Spalten das Entstehen einer schwarzen Zelle als Ergebnis zu definieren, also müssten wir von "Tod" auf "Überleben" umstellen. Wie machen wir das? :idea:

Dann hast du mal folgenden Code vorgeschlagen (ganz alleine, das war nicht von mir!):
ausblenden Delphi-Quelltext
1:
if (AnzahlLebenderNachbarn(x, y) in [23]then					

Was bewirkt der markierte Teil? Nutzt uns das was für unser aktuelles Problem? ;)

cu
Narses

_________________
There are 10 types of people - those who understand binary and those who don´t.
Nini Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 170
Erhaltene Danke: 12



BeitragVerfasst: Sa 28.03.15 00:59 
die grenzen die sachen ein die in der schleife passieren, also muss ich das client... aus den schleifen rausnehmen damits nur einmal so groß ist

mit überleben wär's dann wie auf dem bild
Regeländerung2

das macht dass das geschaut wird ob die zelle zwei oder drei lebende zellen hat und man müsste jetzt nur das in der eckigen klammer ändern können, dass da die wahren werte von der überlebenden Zelle reinkommen damit sich die zelle schwarz färbt
Einloggen, um Attachments anzusehen!
Happy_Penguin
Hält's aus hier
Beiträge: 9



BeitragVerfasst: Sa 28.03.15 14:22 
Ein kleiner Tipp von mir...
Wie wäre es denn, wenn du nun zwei Arrays für das Regelwerk anlegst?
Einen Array, wann eine Zelle neu entsteht und dann einen, wann sie überlebt.

ausblenden Delphi-Quelltext
1:
2:
3:
var
  ueberleben:   Array[0..8of Boolean;
  neuEntstehen: Array[0..8of Boolean;


Durch die Checkboxen kannst du ja dann prima darauf zugreifen.
Narses
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10183
Erhaltene Danke: 1256

W10ent
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Sa 28.03.15 16:58 
Moin!

user profile iconNini hat folgendes geschrieben Zum zitierten Posting springen:
die grenzen die sachen ein die in der schleife passieren, also muss ich das client... aus den schleifen rausnehmen damits nur einmal so groß ist
:zustimm: Geht doch.

user profile iconNini hat folgendes geschrieben Zum zitierten Posting springen:
mit überleben wär's dann wie auf dem bild
Jawoll, einfach invertieren. ;)

user profile iconNini hat folgendes geschrieben Zum zitierten Posting springen:
das macht dass das geschaut wird ob die zelle zwei oder drei lebende zellen hat
Jup.

user profile iconNini hat folgendes geschrieben Zum zitierten Posting springen:
und man müsste jetzt nur das in der eckigen klammer ändern können, dass da die wahren werte von der überlebenden Zelle reinkommen damit sich die zelle schwarz färbt
Genau, und das werden wir als nächstes tun. :)

Diese Aufzählungen in eckigen Klammern nennt man eine Menge, und statt das als Konstante zu verwenden, wie in der if-Anweisung kann man das auch als Variable verwenden. :idea: Da wir von verschiedenen Stellen im Code darauf zugreifen können wollen, müssen wir die Variable in der Klasse deklarieren:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
const
  N = 10// Seitenlänge des Feldes

type
  TNachbarn = 1..8; // es gibt 8 Nachbarn einer Zelle

  TRegel = set of TNachbarn; // Auswahl von Nachbaranzahlen

  TFeld = array[0..N-10..N-1of Boolean; // Aufbau des Feldes festlegen (2-dimensionales array)

  TForm1 = class(TForm)
    ...
  public
    Feld: TFeld; // das ist der interne Speicher für die Zellen (=Shapes in der GUI)
    Ueberleben: TRegel;
    Geburt: TRegel;
    function LebtNachbar(x, y: Integer): Boolean;

...

procedure TForm1.FormCreate(Sender: TObject);
  var
    x, y, snr: Integer;
    Shape: TShape;
begin
  Ueberleben := [23]; // Standard-Regeln definieren
  Geburt := [3];
  ClientWidth := 17 +24 *N;
  ...

Das ist die Vorarbeit, um mit den Regel-Mengen arbeiten zu können. Dein Part ist nun den Code in der Rechnen-Methode so anzupassen, dass mit den neuen Regel-Mengen gearbeitet wird. Vorschlag? :les:

@user profile iconHappy_Penguin: Das kann man sicher auch so machen, ich würde aber den Ansatz mit den Mengen empfehlen. ;)

cu
Narses

_________________
There are 10 types of people - those who understand binary and those who don´t.
Happy_Penguin
Hält's aus hier
Beiträge: 9



BeitragVerfasst: Sa 28.03.15 17:09 
Okay das geht natürlich auch :-)

Ich möchte nur noch anmerken, dass auch 0 Nachbarn möglich sind und auch das vom Nutzer einstellbar sein sollte...
Also am Besten TNachbarn entsprechend anpassen
ausblenden Delphi-Quelltext
1:
TNachbarn = 0..8;					
Narses
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10183
Erhaltene Danke: 1256

W10ent
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Sa 28.03.15 17:21 
Moin!

user profile iconHappy_Penguin hat folgendes geschrieben Zum zitierten Posting springen:
Ich möchte nur noch anmerken, dass auch 0 Nachbarn möglich sind und auch das vom Nutzer einstellbar sein sollte...
Und richtig klasse wäre es, wenn Nini das selbst merkt... :zwinker: :roll:

cu
Narses

_________________
There are 10 types of people - those who understand binary and those who don´t.
Nini Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 170
Erhaltene Danke: 12



BeitragVerfasst: Sa 28.03.15 17:34 
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
   for y := 0 to N-1 do
    for x := 0 to N-1 do
      if Feld[x, y] then
         for i := 1 to 8 do
         FeldNeu[x, y] := (AnzahlLebenderNachbarn(x, y) = ueberleben)
      else
        FeldNeu[x, y] := (AnzahlLebenderNachbarn(x, y) = geburt);
  Feld := FeldNeu;


Ich hätte das ja gern einfach so gemacht, aber das geht nicht, weil irgendwie die typen inkompatibel sind :(