Autor Beitrag
Poerslasher
Hält's aus hier
Beiträge: 6



BeitragVerfasst: Mi 29.04.09 17:49 
Ich brauche für ein Spiel (Mastermind) 4 verschiedene zufällige Variablen im Bereich von 0-7. Ist es irgendwie möglich sicherzustellen, dass die Zahl jedes mal eine andere ist?

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
Randomize;
VorgabeA := Random(8);
VorgabeB := Random(8);
VorgabeC := Random(8);
VorgabeD := Random(8);


Es soll gelten: VorgabeA = VorgabeB = VorgabeC = VorgabeD

Gruß Poerslasher
jakobwenzel
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1889
Erhaltene Danke: 1

XP home, ubuntu
BDS 2006 Prof
BeitragVerfasst: Mi 29.04.09 17:50 
Man könnte jetzt solang neue Zahlen würfeln bis es eine is die noch nich dabei war, den richtigen Weg gibts aber hier:
www.delphi-library.d...t+shuffle_71713.html

_________________
I thought what I'd do was, I'd pretend I was one of those deaf-mutes.
Poerslasher Threadstarter
Hält's aus hier
Beiträge: 6



BeitragVerfasst: Mi 29.04.09 18:21 
Dankeschön, ich verstehs nur irgendwie nicht so ganz^^
wie kann ich denn jetzt in dem bestimmten Fall meine 4 Variablen die gewürfelten Werte zuweisen?
Dude566
ontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic starofftopic star
Beiträge: 1592
Erhaltene Danke: 79

W8, W7 (Chrome, FF, IE)
Delphi XE2 Pro, Eclipse Juno, VS2012
BeitragVerfasst: Mi 29.04.09 18:25 
Du weist jeder der Zahlen eine Farbe zu, und wenn die Zahl noch nicht gewürfelt wurde kannst du sie verwenden.
Du musst eine Abfrage machen, ob die Zahl schon einmal gefallen ist, wenn ja dann den Vorgang wiederholen, solange bis eine Zahl kommt die noch nicht gefallen ist.

_________________
Es gibt 10 Gruppen von Menschen: diejenigen, die das Binärsystem verstehen, und die anderen.
jakobwenzel
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1889
Erhaltene Danke: 1

XP home, ubuntu
BDS 2006 Prof
BeitragVerfasst: Mi 29.04.09 18:35 
Genau das ist der falsche Weg, Dude566
Du schmeißt die Zahlen in ein Array, durchmischst das nach dem Mischalgorithmus den ich vorhin gepostet hab und nimmst dir dann die ersten vier Zahlen raus. Die Begründung warum das besser ist steht auch bei dem Link. ;)

_________________
I thought what I'd do was, I'd pretend I was one of those deaf-mutes.
Dude566
ontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic starofftopic star
Beiträge: 1592
Erhaltene Danke: 79

W8, W7 (Chrome, FF, IE)
Delphi XE2 Pro, Eclipse Juno, VS2012
BeitragVerfasst: Mi 29.04.09 18:50 
Ja, aber es ginge doch auch so wie ich geschrieben habe oder?

_________________
Es gibt 10 Gruppen von Menschen: diejenigen, die das Binärsystem verstehen, und die anderen.
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19346
Erhaltene Danke: 1754

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Mi 29.04.09 19:09 
Gehen tut es schon, aber es kann ggf. sehr lange dauern, wenn du Pech hast. Gerade bei so wenigen möglichen Zahlen kann das passieren, wenn zufällig immer schon benutzte getroffen werden (was ja nicht unwahrscheinlich ist einige Male).

Und nebenbei ist es von der Programmierung her auch aufwendiger und schwieriger. ;-)
Poerslasher Threadstarter
Hält's aus hier
Beiträge: 6



BeitragVerfasst: Mi 29.04.09 19:19 
Ich schaffs irgendwie nicht das zum laufen zu bringen^^
Wie muss ich denn das array deklarieren? Ich habs jetzt als globale variable deklariert:
ausblenden Delphi-Quelltext
1:
2:
var
  TArray: array [1..8of integer;


passt das so? Wo muss ich das TarrayElement deklarieren?
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19346
Erhaltene Danke: 1754

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Mi 29.04.09 19:27 
Das Element im Array ist bei dir ja einfach nur ein Integer, und diese Deklaration steht doch exakt als Beispiel ganz oben im Beitrag drin. ;-)
Poerslasher Threadstarter
Hält's aus hier
Beiträge: 6



BeitragVerfasst: Mi 29.04.09 19:33 
Und wo muss ich das deklarieren?
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19346
Erhaltene Danke: 1754

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Mi 29.04.09 19:51 
Schau oben einmal hin, da steht schon eine Typdeklaration, nämlich die deines Formulars. Du schreibst jetzt einfach oberhalb von TForm1 = ... die weitere Definition hin.
Poerslasher Threadstarter
Hält's aus hier
Beiträge: 6



BeitragVerfasst: Mi 29.04.09 20:12 
Jo gut, ich habs unter TForm1 deklariert, das hat nicht funktioniert.
ausblenden volle Höhe 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:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
unit MastermindUnit;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
    TArrayElement = Integer;
    TArray = array of TArrayElement;
  TForm1 = class(TForm)
    VorgabeAEdit: TEdit;
    A1: TEdit;
    NeuesSpiel: TButton;
    VorgabeBEdit: TEdit;
    VorgabeCEdit: TEdit;
    VorgabeDEdit: TEdit;
    Test: TLabel;
    Fertig: TButton;
    B1: TEdit;
    C1: TEdit;
    D1: TEdit;
    procedure FertigClick(Sender: TObject);
    procedure NeuesSpielClick(Sender: TObject);

  private
    { Private-Deklarationen}

  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;
  VorgabeA, VorgabeB, VorgabeC, VorgabeD :Integer;



implementation

{$R *.dfm}


procedure TForm1.NeuesSpielClick(Sender: TObject);
 var  i,j: Integer;
      tmp: TArrayElement;
      aArray : Tarray;
begin
   Randomize;

     // alle Elemente des Feldes durchlaufen
  for i := Low(aArray) to High(aArray) do begin
    // neue, zufällig Position bestimmen
    j := i +Random(Length(aArray) -i);
    // Element Nr. i mit Nr. j vertauschen (3ecks-Tausch)
    tmp := aArray[j];
    aArray[j] := aArray[i];
    aArray[i] := tmp;
  end;

     VorgabeA := aArray[1];
     VorgabeB := aArray[2];
     VorgabeC := aArray[3];
     VorgabeD := aArray[4];

end;

end.


Wo muss ich denn nun die Länge des Arrays also [1..8] angeben?
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19346
Erhaltene Danke: 1754

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Mi 29.04.09 20:15 
Du musst vor der Verwendung diese mit SetLength setzen.
ausblenden Delphi-Quelltext
1:
SetLength(aArray, ...);					
So musst du die Größe des Arrays nicht bereits im Quelltext ganz festlegen, sondern die Größe auch zur Laufzeit setzen.
Poerslasher Threadstarter
Hält's aus hier
Beiträge: 6



BeitragVerfasst: Sa 02.05.09 10:33 
Ok, jetzt hats geklappt ;-)
Das Problem war dass ich vergessen hatte meinem Array Werte zuzuweisen.
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
// perfektes Mischen nach Fisher-Yates (angelehnt an einen Vorschlag von alzaimar)
procedure ShuffleFisherYates(var aArray: TArray);
  var
    i,j: Integer;
    tmp: TArrayElement;
begin
   aArray[1]:=1;
   aArray[2]:=2;
       .
       .
       .
  // alle Elemente des Feldes durchlaufen
  for i := Low(aArray) to High(aArray) do begin
    // neue, zufällig Position bestimmen
    j := i +Random(Length(aArray) -i);
    // Element Nr. i mit Nr. j vertauschen (3ecks-Tausch)
    tmp := aArray[j];
    aArray[j] := aArray[i];
    aArray[i] := tmp;
  end;
end;


Danke für alle antworten! ;-)
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19346
Erhaltene Danke: 1754

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Sa 02.05.09 14:53 
Das solltest du aber machen bevor du es an ShuffleFisherYates übergibst, schließlich heißt das ja Shuffle und nicht Wertzuweisung und Shuffle. ;-)