Autor Beitrag
Ottchen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 43



BeitragVerfasst: Mi 01.03.06 00:22 
Ich habe jetzt erst das Spiel entdeckt, habe schon im Delphi-Forum gestöbert und konnte aber mit den Hinweisen noch nicht so viel anfangen.

Ich möchte in einer Tabelle (StringGrid) jede Zelle mit einer zufälligen Zahl beschreiben und dann auf Knopfdruck bzw. über ein PullDown-Menü einige Zahlen wegblenden, wenn das denn geht.

Also das Beschreiben habe ich ja noch hinbekommen:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
procedure TForm1.BitBtn1Click(Sender: TObject);
const cMax=9;
var vi,vj:integer;   //Laufvariablen für die Zellen der Tabelle
    vz1: Array[1..cMax] of Integer; //vz1 soll die Zufallszahl Nr. 1 sein
begin
  with StringGrid1 do
    begin
      for vi:=1 to cMax do
        for vj:=1 to cMax do
        Cells[vi-1,vj-1]:=IntToStr(random(9)+1);

    end;

end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  Randomize;
end;


Aber das erste Problem ist, dass manche Zufallszahlen doppelt vorkommen. Wie kann man das ändern?

Und wie kann man zufällig eine vorher bestimmte Zahl von Feldern ausblenden?

Wer kann mir helfen? Vielleicht gehe ich das Problem ja völlig falsch an...?

Ottchen

PS: Wie kann ich denn hier Quelltext als "Code" einfügen,, so dass er wie in anderen Beiträgen grün und eingerückt dargestellt wird?

Moderiert von user profile iconChristian S.: Delphi-Tags hinzugefügt
Moderiert von user profile iconTino: Title geändert.
Moderiert von user profile iconraziel: Topic aus Multimedia / Grafik verschoben am Fr 03.03.2006 um 18:52

_________________
See you.
JayEff
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2971

Windows Vista Ultimate
D7 Enterprise
BeitragVerfasst: Mi 01.03.06 02:14 
benutze [*delphi] *code* [/delphi] tags (ohne stern). das sieht dann so aus: procedure hallo(du:String);

Zu deinem Problem: wenn du Zufallszahlen willst, bei denen keine doppelt vorkommt, musst du die benutzten in ein array speichern. beispiel:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
var zahlen:array of integer;

function gibmirneneueZufallszahl:integer;
begin
  Result:=random(80)+1;
  while Result in zahlen do //weis nich obs crasht, wenn zahlen komplett leer ist... :/
     Result:=random(80)+1;
  
  SetLength(zahlen,length(zahlen));
  zahlen[length(zahlen]-1]:=Result;
end;
so sollte das klappen...

_________________
>+++[>+++[>++++++++<-]<-]<++++[>++++[>>>+++++++<<<-]<-]<<++
[>++[>++[>>++++<<-]<-]<-]>>>>>++++++++++++++++++.+++++++.>++.-.<<.>>--.<+++++..<+.
Ottchen Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 43



BeitragVerfasst: Do 02.03.06 22:32 
user profile iconJayEff hat folgendes geschrieben:
benutze [*delphi] *code* [/delphi] tags (ohne stern). das sieht dann so aus: procedure hallo(du:String);

Zu deinem Problem: wenn du Zufallszahlen willst, bei denen keine doppelt vorkommt, musst du die benutzten in ein array speichern. beispiel:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
var zahlen:array of integer;

function gibmirneneueZufallszahl:integer;
begin
  Result:=random(80)+1;
  while Result in zahlen do //weis nich obs crasht, wenn zahlen komplett leer ist... :/
     Result:=random(80)+1;
  
  SetLength(zahlen,length(zahlen));
  zahlen[length(zahlen]-1]:=Result;
end;
so sollte das klappen...




Danke erst einmal für die Antwort!

Wo und wie rufe ich die Funktion denn auf? Bewirkst du also mit deiner Funktion, dass man die Zahlen im Array abspeichert und schaut, ob eine Zahl in der Zelle schon vorhanden ist?

_________________
See you.
JayEff
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2971

Windows Vista Ultimate
D7 Enterprise
BeitragVerfasst: Fr 03.03.06 03:28 
Die Funktion macht nichts weiter als jede neue Zufallszahl ins Array speichern und sich so lange eine neue generieren lassen, bis eine raus kommt, die noch nicht im array ist. ACHTUNG sobald das array alle zahlen im Bereich 1-80 enthält, CRASHT DEIN PROGRAMM beim nächsten aufruf. Es läuft dann auf eine endlosschleife hinaus! das musst du beachten, und dem entsprechend verändern. z.B. muss natürlich das Array ab und zu geleert werden. etwa so:
SetLength(zahlen, 0); Dabei wird die Anzahl der Einträge im Array auf 0 gesetzt. Der rest sollte mit der Delphi OH und der Forumssuche lösbar sein.

_________________
>+++[>+++[>++++++++<-]<-]<++++[>++++[>>>+++++++<<<-]<-]<<++
[>++[>++[>>++++<<-]<-]<-]>>>>>++++++++++++++++++.+++++++.>++.-.<<.>>--.<+++++..<+.
alzaimar
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2889
Erhaltene Danke: 13

W2000, XP
D6E, BDS2006A, DevExpress
BeitragVerfasst: Fr 03.03.06 09:13 
Neee! Eine zufällige Folge von Zahlen 1..N macht man so: Erzeuge ein Array mit den Zahlen 1..N und mische es (am Besten nach Miller-Yates):
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
Procedure ShuffleMillerYates (Var A :TArray);
Var  
 I, J, T : Integer;  

begin  
  For I := Low (A) to High (A) do begin  
    J := I + Random (Length(A) - I);  
    T := A[J];  
    A[J] := A[I];  
    A[I] := T;  
  end;  
end;


In einem Sudoku-Spiel darf in jeder Reihe, jeder Spalte und jedem 3x3 Quadranten die Zahl nur 1x vorkommen. Da kommt man mit dem Mischen aber nicht weit.
Du musst anders vorgehen: Ich habe es mit Mengen gemacht:
Sei
Z[i] die Menge der zur Verfügung stehenden Zahlen der Zeile #i,
S[j] die Menge der zur Verfugung stehenden Zahlen der spalte #j und
Q[x] die Menge der zur Verfügung stehenden Zahlen des Quadranten x.

Die Nr. des Quadranten an Zelle x,y wird so berechnet : q(x,y) = 3*(x div 3) + y div 3;

Zelle i,j kann dann nur Zahlen annehmen, die in Z[i], S[j] und Q[q(i,j)] enthalten sind, also in der Schnittmenge der drei Mengen. Damit ist die Lösung ganz einfach.

_________________
Na denn, dann. Bis dann, denn.
JayEff
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2971

Windows Vista Ultimate
D7 Enterprise
BeitragVerfasst: Fr 03.03.06 15:38 
user profile iconalzaimar hat folgendes geschrieben:
Neee! Eine zufällige Folge von Zahlen 1..N macht man so:[...]

Ööööhm ja. Aber meine klappt genauso. Oder in deinen Worten: "NE! Deine is falsch! Nur meine is richtig!" Verstehst du worauf ich hinaus will? ;>
Also ich hab nur auf seine Frage geantwortet ^^

_________________
>+++[>+++[>++++++++<-]<-]<++++[>++++[>>>+++++++<<<-]<-]<<++
[>++[>++[>>++++<<-]<-]<-]>>>>>++++++++++++++++++.+++++++.>++.-.<<.>>--.<+++++..<+.
alzaimar
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2889
Erhaltene Danke: 13

W2000, XP
D6E, BDS2006A, DevExpress
BeitragVerfasst: Fr 03.03.06 16:31 
user profile iconJayEff hat folgendes geschrieben:

Ööööhm ja. Aber meine klappt genauso. ...

Ööööhm nö:
ausblenden Delphi-Quelltext
1:
For i:=1 to 82 do gibmirneneueZufallszahl;					

hängt, weil Du nur 80 (N) Zahlen erzeugen kannst, bei Frage nach der N+1. Zufallszahl ballert es eben,.

Und trotzdem macht man das so nicht, weil die Performance in den Keller geht...

Manchmal ist meine Ausdrucksweise aber wohl 'zu persönlich'. War nicht so gemeint.

_________________
Na denn, dann. Bis dann, denn.
JayEff
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2971

Windows Vista Ultimate
D7 Enterprise
BeitragVerfasst: Sa 04.03.06 01:27 
user profile iconalzaimar hat folgendes geschrieben:

hängt, weil Du nur 80 (N) Zahlen erzeugen kannst, bei Frage nach der N+1. Zufallszahl ballert es eben,.[*1]

Und trotzdem macht man das so nicht, weil die Performance in den Keller geht...[*2]


1: Das hatte ich bereits erwähnt und bin davon ausgegangen, dass er das selbst abfangen kann ;>
user profile iconJayEff hat folgendes geschrieben:
ACHTUNG sobald das array alle zahlen im Bereich 1-80 enthält, CRASHT DEIN PROGRAMM beim nächsten aufruf. Es läuft dann auf eine endlosschleife hinaus! das musst du beachten, und dem entsprechend verändern. z.B. muss natürlich das Array ab und zu geleert werden. etwa so:
ausblenden Delphi-Quelltext
1:
SetLength(zahlen, 0);					


2: bei n=9 zahlen? Öööhm nö. ^^ *auch nich bei n=9*9 zahlen, wies in nem Sudoku üblich is. Auch erst bei n=10^4 oder so ^^

Einigen wir uns drauf: beides geht prima in diesem Beispiel.

_________________
>+++[>+++[>++++++++<-]<-]<++++[>++++[>>>+++++++<<<-]<-]<<++
[>++[>++[>>++++<<-]<-]<-]>>>>>++++++++++++++++++.+++++++.>++.-.<<.>>--.<+++++..<+.