Autor Beitrag
jackie05
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 357



BeitragVerfasst: Do 22.01.09 11:12 
Hallo,
ich bin gerade an einem Spiel und möchte Zufallszahlen in meine Felder eintragen.
Das ist kein Problem für mich, nur wie bekomme ich es hin, das sich in meine Felder keine Doppelte Zahlen in einer Reihe befindet?
Also so wie bei Sudoku Spiel, es dürfen keine Doppelte Zahlen nach rechts und nach unten sein.

Hier mal mein Code:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
randomize;
for y:=0 to High(Feld) do begin
  for x:=0 to High(Feld) do begin
    if Feld[x,y].Typ = 'N' then
    begin
      Feld[x,y].Wert := random(9)+1;
    end;
    if Feld[x,y].Wert > 0 then
    begin
      Form1.Canvas.Brush.Style := bsClear;
      Form1.Canvas.Font.Size := 16;
      Form1.Canvas.TextOut(-1+36 div 2-Form1.Canvas.TextWidth(IntToStr(Feld[x,y].Wert)) div 2+x*36-x,36 div 2-Form1.Canvas.TextHeight(IntToStr(Feld[x,y].Wert)) div 2+y*36-y,IntToStr(Feld[x,y].Wert));
    end;
  end;
end;


Damit erzeuge ich Zufallszahlen, nur da wo Feld[x,y].Typ = 'N' ist.

Ich könnte es zwar Prüfen auf Doppelte Zahlen und diese löschen, dann wieder neu Generieren, aber so könnte ich manchmal eine endlos Schleife bekommen, was mir bei einem sehr grossen Spielfeld passiert ist und mein PC fast in absturz gebracht hat :D

Ich bedanke mich schonmal für die Hilfe.

MfG
hazard999
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 162

Win XP SP2
VS 2010 Ultimate, CC.Net, Unity, Pex, Moles, DevExpress eXpress App
BeitragVerfasst: Do 22.01.09 12:29 
Ehm.

random(9)+1

Ergibt 9 Zahlen.

ab Feld > 3 geht das doch nicht mehr. Oder hab falsch verstanden was du machen willst?

_________________
MOV EAX, Result;MOV BYTE PTR [EAX], $B9;MOV ECX, M.Data;MOV DWORD PTR [EAX+$1], ECX;MOV BYTE PTR [EAX+$5], $5A;MOV BYTE PTR [EAX+$6], $51;MOV BYTE PTR [EAX+$7], $52;MOV BYTE PTR [EAX+$8], $B9;MOV ECX, M.Code;MOV DWORD PTR [EAX+$9], ECX
spawn89
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 82
Erhaltene Danke: 7

Linux
CodeTyphon
BeitragVerfasst: Do 22.01.09 12:53 
Prüfe jede Zahl, ob sie schon benutzt wurde.
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:
randomize;
for y:=0 to High(Feld) do 
begin
  for x:=0 to High(Feld) do 
  begin

    if Feld[x,y].Typ = 'N' then
    begin
      do
        Feld[x,y].Wert := random(9)+1;
      until not isValueUsedBefore(x, y);
    end;

    if Feld[x,y].Wert > 0 then
    begin
      Form1.Canvas.Brush.Style := bsClear;
      Form1.Canvas.Font.Size := 16;
      Form1.Canvas.TextOut(-1+36 div 2-Form1.Canvas.TextWidth(IntToStr(Feld[x,y].Wert)) div 2+x*36-x,36 div 2-Form1.Canvas.TextHeight(IntToStr(Feld[x,y].Wert)) div 2+y*36-y,IntToStr(Feld[x,y].Wert));
    end;
  end;
end;

function isValueUsedBefore(x, y: Integer): Boolean;


In isValueUsedBefore prüfst du dann, ob sich in den Feldern [0]-[x-1] und [0]-[y-1] schon der Wert in [x][y] befindet.
Die Antwort ist dann das Result.

Aber Vorsicht, evtl, wenn dein Feld groß genug ist, solltest du noch prüfen, ob überhaupt noch ein Wert zulässig ist.
(Bei einem Feld von 3*3 brauchst du das zB nicht)

spawn
jackie05 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 357



BeitragVerfasst: Do 22.01.09 13:23 
Vielen Dank.

Irgendwie bekomme ich vom Kompiler fehlermeldung:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
[Fehler] Unit1.pas(79): Anweisung erwartet, aber 'DO' gefunden
[Fehler] Unit1.pas(81): 'END' erwartet, aber 'UNTIL' gefunden
[Fehler] Unit1.pas(95): '.' erwartet, aber ';' gefunden
[Fataler Fehler] Project1.dpr(5): Verwendete Unit 'Unit1.pas' kann nicht compiliert werden


Ich bin ja gerade an einem Kakuro Spiel, wie könnte ich die Zufallszahlen so darstellen, das von Sumex bis ein weitere Block oder Sume Feld kommt, Zufallszahlen eintragen?
Also, ich meinte das so, ich Prüfe das erste Feld, das nach SumeX kommt und trage Zufallszahlen ein bis ein Block oder ein weitere Sume Feld kommt, auch auf Doppelte Zahlen achten, nach dem nächsten Sume Feld darf wieder die gleiche Zahl vorkommen wie von dem davor eingetragene Felder.

Ich hab mal ein Bild erstellt um es einfach mal zu zeigen:
Moderiert von user profile iconNarses: Bild als Anhang hochgeladen

Gibt es vieleicht eine einfache und schnellere Methode das hinzubekommen?

Den rest schaffe ich alleine, ich muss nur wissen, wie ich dort Zufallszahlen ohne Doppelte bis jeweils zu einem Block erstellen kann.

Edit: Also hier mal die 2 Blöcke, auf diese geachtet werden müssen:
ausblenden Delphi-Quelltext
1:
2:
Feld[x,y].Typ := 'M'//= normale Block
Feld[x,y].Typ := 'S'//= Sume Block


Vielen Dank schonmal.

MfG
Einloggen, um Attachments anzusehen!
Xentar
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2077
Erhaltene Danke: 2

Win XP
Delphi 5 Ent., Delphi 2007 Prof
BeitragVerfasst: Do 22.01.09 14:14 
user profile iconjackie05 hat folgendes geschrieben Zum zitierten Posting springen:
Vielen Dank.

Irgendwie bekomme ich vom Kompiler fehlermeldung:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
[Fehler] Unit1.pas(79): Anweisung erwartet, aber 'DO' gefunden
[Fehler] Unit1.pas(81): 'END' erwartet, aber 'UNTIL' gefunden
[Fehler] Unit1.pas(95): '.' erwartet, aber ';' gefunden
[Fataler Fehler] Project1.dpr(5): Verwendete Unit 'Unit1.pas' kann nicht compiliert werden


Das heißt auch nicht do, sondern repeat...until.
Hätte man auch selber drauf kommen können ;)

_________________
PROGRAMMER: A device for converting coffee into software.
jackie05 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 357



BeitragVerfasst: Do 22.01.09 14:17 
Achso, danke Dir.

Ich habe vor diesem Post noch etwas gefragt, könnte mir vieleicht einer erklären, wie ich das bewerkstelligen könnte?

Ich wäre euch sehr dankbar dafür.

MfG
jackie05 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 357



BeitragVerfasst: Sa 24.01.09 18:37 
Hat keiner ne ahnung wie ich das machen kann?