Entwickler-Ecke
Delphi Language (Object-Pascal) / CLX - Probleme mit Doppelte Zufallszahlen?
jackie05 - Do 22.01.09 11:12
Titel: Probleme mit Doppelte Zufallszahlen?
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 :D
Ich bedanke mich schonmal für die Hilfe.
MfG
hazard999 - 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?
spawn89 - Do 22.01.09 12:53
Titel: Re: Probleme mit Doppelte Zufallszahlen?
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 - 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
Xentar - Do 22.01.09 14:14
jackie05 hat folgendes geschrieben : |
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 | |
Das heißt auch nicht do, sondern repeat...until.
Hätte man auch selber drauf kommen können ;)
jackie05 - 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 - Sa 24.01.09 18:37
Hat keiner ne ahnung wie ich das machen kann?
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!