Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Anfänger probiert kniffel und kommt nicht weiter (https://www.delphipraxis.net/131293-anfaenger-probiert-kniffel-und-kommt-nicht-weiter.html)

jesus.or.christ 22. Mär 2009 15:54


Anfänger probiert kniffel und kommt nicht weiter
 
ich probiere kniffel und habe ein problem.
hier mein quelltext
Delphi-Quellcode:
unit unit_spiel;

interface

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

type
  TFormSpiel = class(TForm)
    ImageWEins: TImage;
    ImageWZwei: TImage;
    ImageWDrei: TImage;
    ImageWVier: TImage;
    ImageWFuenf: TImage;
    ButtonWuerfel: TButton;
    Label1: TLabel;
    procedure FormCreate(Sender: TObject);
    procedure ButtonWuerfelClick(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

const
  Bild1 = 'eins.bmp';
  Bild2 = 'zwei.bmp';
  Bild3 = 'drei.bmp';
  Bild4 = 'vier.bmp';
  Bild5 = 'fuenf.bmp';
  Bild6 = 'sechs.bmp';

var
  FormSpiel: TFormSpiel;
  w: array[1..5] of integer;
  i, j, k, l, m: integer;

implementation

{$R *.dfm}

procedure TFormSpiel.FormCreate(Sender: TObject);
begin
randomize;
end;

procedure TFormSpiel.ButtonWuerfelClick(Sender: TObject);
begin
w[1] := random(5) + 1;
w[2] := random(5) + 1;
w[3] := random(5) + 1;
w[4] := random(5) + 1;
w[5] := random(5) + 1;
//Bilder zuweisen ANFANG
case w[1] of
1: ImageWEins.Picture.LoadFromFile(Bild1);
2: ImageWEins.Picture.LoadFromFile(Bild2);
3: ImageWEins.Picture.LoadFromFile(Bild3);
4: ImageWEins.Picture.LoadFromFile(Bild4);
5: ImageWEins.Picture.LoadFromFile(Bild5);
6: ImageWEins.Picture.LoadFromFile(Bild6);
end;
case W[2] of
1: ImageWZwei.Picture.LoadFromFile(Bild1);
2: ImageWZwei.Picture.LoadFromFile(Bild2);
3: ImageWZwei.Picture.LoadFromFile(Bild3);
4: ImageWZwei.Picture.LoadFromFile(Bild4);
5: ImageWZwei.Picture.LoadFromFile(Bild5);
6: ImageWZwei.Picture.LoadFromFile(Bild6);
end;
case W[3] of
1: ImageWDrei.Picture.LoadFromFile(Bild1);
2: ImageWDrei.Picture.LoadFromFile(Bild2);
3: ImageWDrei.Picture.LoadFromFile(Bild3);
4: ImageWDrei.Picture.LoadFromFile(Bild4);
5: ImageWDrei.Picture.LoadFromFile(Bild5);
6: ImageWDrei.Picture.LoadFromFile(Bild6);
end;
case W[4] of
1: ImageWFuenf.Picture.LoadFromFile(Bild1);
2: ImageWFuenf.Picture.LoadFromFile(Bild2);
3: ImageWFuenf.Picture.LoadFromFile(Bild3);
4: ImageWFuenf.Picture.LoadFromFile(Bild4);
5: ImageWFuenf.Picture.LoadFromFile(Bild5);
6: ImageWFuenf.Picture.LoadFromFile(Bild6);
end;
case W[5] of
1: ImageWVier.Picture.LoadFromFile(Bild1);
2: ImageWVier.Picture.LoadFromFile(Bild2);
3: ImageWVier.Picture.LoadFromFile(Bild3);
4: ImageWVier.Picture.LoadFromFile(Bild4);
5: ImageWVier.Picture.LoadFromFile(Bild5);
6: ImageWVier.Picture.LoadFromFile(Bild6);
end;
//Bilder zuweisen ENDE
end;

end.
wie ihr sehen könnt habe ich 5 würfel (logisch bei kniffel...), w: array[1..5] of integer,
lade über case-Abfragen die entsprechenden bilder.
im späteren verlauf (noch nicht programmiert) soll man über radiobuttons, z.b. 4er pasch oder ähnliches auswählen können.
dazu müsste ich die 5 variablen nach größe sortieren.

erster anlauf:
online recherchieren...
wie gesagt, ich bin anfänger und werde aus bubblesort u.ä. nicht schlau.

nun meine bitte:
könnte mir einer die nötigen programmzeilen schreiben, die auf meinen quelltext zugeschnitten sind und mir unter umständen auch noch möglichst einfach erklären?
ich wäre für eine solche hilfestellung sehr dankbar, da ich das restliche programm im kopf schon genau überdacht habe und es nur bei dieser kleinigkeit hängt.

in dankbarer vorraussicht
matze

Texas 22. Mär 2009 18:57

Re: Anfänger probiert kniffel und kommt nicht weiter
 
Hallo Matze,
ich würde neben jeden Würfel eine CHECKBOX platzieren mit der ich festlege ob der Würfel so liegen bleiben soll oder ob mit Ihm neu gewürfelt wird. Wenn man dann noch ein StrinGrid mit den möglichen Punkten 1er 2er …Full House .. kl.Strasse etc anlegt kann man durch auswahl der Cell gleich die Werte eintragen lassen

Eine andere Möglichkeit: das ganze in eine Stringlist einzutragen. Diese führt dann mit der Methode sort eine Sortierung durch

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);

var
  MyList: Tstrings; //!!!!
begin
  MyList := TStringList.Create;
  try
    MyList.Add(inttostr(w[1])); // Würfel 1
    MyList.Add(inttostr(w[2])); // Würfel 2
    MyList.Add(inttostr(w[3])); // Würfel 3
    MyList.Add(inttostr(w[4])); // Würfel 4
    MyList.Add(inttostr(w[5])); // Würfel 5
    MyList.Sort; werte werden sortieert  

  finally
    MyList.Free;
  end;
end;

Satty67 22. Mär 2009 19:18

Re: Anfänger probiert kniffel und kommt nicht weiter
 
oder halt BubbleSort.

Füge die Procedure nach {$R *.dfm} ein:
(oder besser vor der Methode, die Bubblesort nutzt oder noch besser in eine eigene Tools-Unit)
Delphi-Quellcode:
{$R *.dfm}  (* Die Zeile in Deinem Code suchen *)

procedure BubbleSortWuerfel(var A : array of Integer);
var
  i,j,t : Integer;
begin
  for i := Low(A) to High(A) do
    for j := Low(A) to High(A) - 1 do
      if A[j] > A[j + 1] then begin
        t := A[j];
        A[j] := A[j+1];
        A[j+1] := t;
      end;
end;
Sortieren kannst Du dann, nachdem Du die Random-Werte zugewiesen hast:
Delphi-Quellcode:
BubbleSortWuerfel(w);
btw: Ein Würfel hat 6 Seiten ;)

SimStar001 23. Mär 2009 10:18

Re: Anfänger probiert kniffel und kommt nicht weiter
 
Kleine Frage am Rande...

Das Array für die Würfel wurde so deklariert:

Delphi-Quellcode:
w: array[1..5] of integer;
Wenn man aber drauf zugreifen will, geht das doch nur über die Indizes [0..4], oder irre ich mich da gewalitg? :gruebel:

EDIT : Alles klar! Danke für den Hinweis. (Arbeite selbst nur mit dynamischen Arrays)

PS. schreib doch die zuweisung der Werte als Schleife... Erspart dir Arbeit... 8)

Delphi-Quellcode:
// für diesen fall ausreichend;
var i : byte;
.
.
.
for i := low(w) to high(w) do
  w[i] := random(5) + 1;
LG Marco

DeddyH 23. Mär 2009 10:22

Re: Anfänger probiert kniffel und kommt nicht weiter
 
Da irrst Du Dich, bei statischen Arrays können die Indizes selbst vergeben werden. Aus Sicherheitsgründen könnte man aber über Low(Array) und High(Array) zugreifen und muss sich dann keine weiteren Gedanken machen.

mkinzler 23. Mär 2009 11:30

Re: Anfänger probiert kniffel und kommt nicht weiter
 
Zitat:

Aus Sicherheitsgründen könnte man aber über Low(Array) und High(Array) zugreifen und muss sich dann keine weiteren Gedanken machen.
Z.B. wenn man später doch auf einen dynamischen Array umsteigt

DeddyH 23. Mär 2009 12:19

Re: Anfänger probiert kniffel und kommt nicht weiter
 
Zitat:

Zitat von mkinzler
Zitat:

Aus Sicherheitsgründen könnte man aber über Low(Array) und High(Array) zugreifen und muss sich dann keine weiteren Gedanken machen.
Z.B. wenn man später doch auf einen dynamischen Array umsteigt

... oder die Array-Größe ändert (wie bereits erwähnt wurde hat ein Würfel 6 Seiten).

Sherlock 23. Mär 2009 13:11

Re: Anfänger probiert kniffel und kommt nicht weiter
 
Zitat:

Zitat von DeddyH
Zitat:

Zitat von mkinzler
Zitat:

Aus Sicherheitsgründen könnte man aber über Low(Array) und High(Array) zugreifen und muss sich dann keine weiteren Gedanken machen.
Z.B. wenn man später doch auf einen dynamischen Array umsteigt

... oder die Array-Größe ändert (wie bereits erwähnt wurde hat ein Würfel 6 Seiten).

Aber das Array ist ein Array für fünf Würfel. Muss also vorerst nicht geändert werden, es sei denn es gibt eine Regeländerung.

;)

Sherlock

BAMatze 23. Mär 2009 13:22

Re: Anfänger probiert kniffel und kommt nicht weiter
 
[quote="jesus.or.christ"]
Delphi-Quellcode:
...
procedure TFormSpiel.ButtonWuerfelClick(Sender: TObject);
begin
w[1] := random(5) + 1;
w[2] := random(5) + 1;
w[3] := random(5) + 1;
w[4] := random(5) + 1;
w[5] := random(5) + 1;
...
end;

end.
Ich denke hier kommt der Einwand her, den einige formuliert haben. Ich hab mal ein kleines Programm geschrieben und diese Zeilen getestet. Hatte ebenso wie einige Vorredner das Gefühlt, dass niemals eine 6 gewürfelt wird und dies ist auch wirklich der Fall.

Hier der Code den ich genommen hab:

Delphi-Quellcode:
unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    Memo1: TMemo;
    procedure FormCreate(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
var i: integer;
begin
  randomize;
  Memo1.Clear;
  for i:= 1 to 100 do Memo1.Lines.Add(inttostr(random(5)+1));
end;

end.
Ich weiß, ist ziemlich simpel aber es wurde bei den 100 Testwürfen nicht ein mal eine 6 gewürfelt. So wie einige und ich richtig vermutet haben. Um auch 6 zu wirfeln muss das wie folgt heißen:

Delphi-Quellcode:
w[2] := random(6) + 1;
MfG
BAMatze

Satty67 23. Mär 2009 13:34

Re: Anfänger probiert kniffel und kommt nicht weiter
 
Genau, erst Random(6) gibt 6 Zahlen aus (allerdings beginnend bei 0), weshalb das +1 weiterhin korrekt ist.


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:49 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz