Autor |
Beitrag |
jackie05
      
Beiträge: 357
|
Verfasst: 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:
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
Ich bedanke mich schonmal für die Hilfe.
MfG
|
|
hazard999
      
Beiträge: 162
Win XP SP2
VS 2010 Ultimate, CC.Net, Unity, Pex, Moles, DevExpress eXpress App
|
Verfasst: 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
      
Beiträge: 82
Erhaltene Danke: 7
Linux
CodeTyphon
|
Verfasst: Do 22.01.09 12:53
Prüfe jede Zahl, ob sie schon benutzt wurde.
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 
      
Beiträge: 357
|
Verfasst: Do 22.01.09 13:23
Vielen Dank.
Irgendwie bekomme ich vom Kompiler fehlermeldung:
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 Narses: 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:
Delphi-Quelltext 1: 2:
| Feld[x,y].Typ := 'M'; Feld[x,y].Typ := 'S'; |
Vielen Dank schonmal.
MfG
Einloggen, um Attachments anzusehen!
|
|
Xentar
      
Beiträge: 2077
Erhaltene Danke: 2
Win XP
Delphi 5 Ent., Delphi 2007 Prof
|
Verfasst: Do 22.01.09 14:14
_________________ PROGRAMMER: A device for converting coffee into software.
|
|
jackie05 
      
Beiträge: 357
|
Verfasst: 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 
      
Beiträge: 357
|
Verfasst: Sa 24.01.09 18:37
Hat keiner ne ahnung wie ich das machen kann?
|
|
|