Autor Beitrag
der auenländer
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 25

WIN XP
Delphi 6 PE
BeitragVerfasst: Mi 14.02.07 19:08 
guten abend zusammen!

ich hab mal en kurzes problem. ich muss en lottoprogramm basteln, bei dem der computer erst 6 zufallszahlen als tipp bestimmt, dan 6 zufallszahlen als ziehung nimmt und schliesslich noch die beiden vergleicht, wieviele richtige denn dabei waren. folgendes pronblem stellt sich: zuerst schmesst der beim tippen nur eine zahl aus anstatt 6, und ich kann einfach den punkt nicht finden an dem ich ansetzen muss, um das zu ändern. die probleme die der bei der ziehung angibt hab ich mal im code makiert.
falls einem noch en weiterer fehler auffällt den der mir jetzt noch garnich angesagt hat mitte auch mitmelden!
wär cool, wenn einer von euch mal ebend drüberschauen könnte und vll die fehler finden würde!
bei bedarf knn ich auh gerne dass ganze programm noch hinterher posten, damit ihr es richtig starten könnt.

hier mal erst der code:
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:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
unit Ulotto;

interface

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

type

    TZiehung = array[1..6of integer;
    TKugeln = array[1..49of boolean;
  TForm1 = class(TForm)
    Memo1: TMemo;
    BtTipp: TButton;
    BtZiehung: TButton;
    BtRichtige: TButton;
    procedure BtTippClick(Sender: TObject);
    procedure BtZiehungClick(Sender: TObject);
    procedure BtRichtigeClick(Sender: TObject);

  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  ziehung : TZiehung;
  a, x, i : integer;
implementation

{$R *.dfm}

procedure TForm1.BtTippClick(Sender: TObject);
var Tipp:array[1..6of integer;
begin
  a:=49;
  randomize;
  for i:=0 to 6 do
    begin
      x:=random(a)+1;
    end;
  memo1.Lines.Clear;
  memo1.Lines.Add('Lottotipp:' + IntToStr(x));
end;

procedure TForm1.BtZiehungClick(Sender: TObject);
var 
    Kugel : TKugeln;
    Ausgabe : String;
    Zufallszahl : integer;
begin
  for i:= 1 to 49 do Kugel[i]:=true;
  for i:= 0 to 6 do
    begin
      repeat
        Zufallszahl:=random(49)+1;     //hier meckert er, wenns boolean ist
      until
        [Zufallszahl]:=true;           //hier beschwert er sich, wenn zufallszahl kein boolean ist
        Ziehung[i]:=Zufallszahl;
        Kugel[zufallszahl]:=false;
    end;
  Ausgabe:='';
  for i:=0 to 6 do
    Ausgabe:=Ausgabe + ' ' + IntToStr(Ziehung[i]);
  Memo1.lines.Add('Lottoziehung:' + (Ausgabe));
end;

procedure TForm1.BtRichtigeClick(Sender: TObject);
var richtige : integer;
  begin
    richtige := 0;
      for x := 0 to 6 do
      for i := 0 to 6 do
        if Tipp[x] = Ziehung[i] then
          Inc(richtige);
  end;
  memo1.lines.add('Anzahl der Richtigen:' + IntToStr(richtige));
end;
end.


danke schonmal im vorraus, bisdenne

jannik
Jann1k
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 866
Erhaltene Danke: 43

Win 7
TurboDelphi, Visual Studio 2010
BeitragVerfasst: Mi 14.02.07 20:13 
also dass er dir bei der ziehung nur eine zahl ausgibt ist klar:

memo1.Lines.Add('Lottotipp:' + IntToStr(x));

dieser Teil muss mit in die for-Schleife da er ja sonst nur das letzte x ins memofeld kopiert.

außerdem muss dann

memo1.Lines.Clear;

vor die for schleife sonst fügt er dir erst alle Zahlen ins memofeld und löscht dann den Inhalt des memofeldes - wär ja doof ^^

Bei deinem Programm kann es dann auch passieren, dass er eine Zahl mehrmals "tippt" (random(a)+1 kann ja mehrmals denselben Wert annehmen), such dazu mal bisschen hier im Forum, dürftest relativ schnell was finden.

Außerdem bringt deine variablendeklaration in derselben Prozedur nichts, du deklarierst ein array, dass in der Prozedur nicht auftaucht.

Spielt man Lotto nicht mit 6 aus 49? deine For schleife geht von 0 bis 7 wird also sieben mal durchlaufen, wenn du mit Superzahl spielst isses okay...



[Zufallszahl]:=true; //hier beschwert er sich, wenn zufallszahl kein boolean ist

da müsste denk ich einfach

Kugel[Zufallszahl]=true;

hin.

andere fehler such ich ma gleich kommen dann per edit.
oldmax
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 380


D3 Prof, D4 Prof
BeitragVerfasst: Do 15.02.07 14:07 
Hi
Nun, Lottozahlen sind scheinbar immer wieder interessant und die Frage, wie verhindere ich ohne großen Aufwand eine mögliche Doppelziehung ist auch ganz einfach. Zuerst solte man wissen, ich brauche einen Behälter, in welchen die 49 Kugeln fallen.
Nun ja, Delphi hat ja keine Trommel und auch keine Kugeln, also nehmen wir einen anderen Behälter, eine Listbox zum Beispiel. Und damit wir's nachvollziehen können gleich mal ein klitzekleines Programm, nur mal so zum Üben...
Eine Form darauf ziehen wir eine Listbox und 7 Editfelder (Edit1, Dedit2, Edit3 usw)
Nun die FormCreat mal mit folgenden Code:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
Procedure Form1.FormCreat(Sender: TObject);
Var i : Integer;
    x : Integer;
Begin
  Randomize;  // Zufallszahlengenerator initialisieren
  For i:=1 to 49 do Listbox1.Items.Add(IntToStr(i)); // Die Kugeln in die Ziehung füllen
  For i:=1 to 7 do // und nun die Ziehung
  begin
    x:=Trunc(Random(Listbox1.Items.Count)); // eine Kugel zufällig anfassen
    TEdit(FindComponent('Edit'+IntToStr(i))).Text:=Listbox1.Items[i];// und das Ablagefach
    Listbox1.Items.Delete(x);// so, die Kugel aus dem Ziehungsbehälter ist raus...
  end;
end;

Und nun laßt eure Gedanken schweifen und perfektioniert diese paar Zeilen....

Gruß oldmax

_________________
Zier dich nich so, ich krieg dich schon....
der auenländer Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 25

WIN XP
Delphi 6 PE
BeitragVerfasst: Do 15.02.07 19:11 
hi, danke für die tipps!! hab jetzt nur noch ein problem, das programm funktioniert soweit, aber der erkennt nicht, wenn er nen treffer hat. der zeigt grundsätzlich null richtige an...ausserdem hat mein versuch, das problem des zahlen doppelt-tippen so zu lösen wie beim zahlen ziehen leider auh nicht so ganz geklappt, hab das jetzt mal als kommentar rausgenommen, wär toll, wenn einem von eich da was auffallen würde...

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:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
unit Ulotto;

interface

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

type
    TTipp=array[1..6]of integer;
    TZiehung = array[1..6of integer;
//    TKugeln
  TForm1 = class(TForm)
    Memo1: TMemo;
    BtTipp: TButton;
    BtZiehung: TButton;
    BtRichtige: TButton;
    procedure BtTippClick(Sender: TObject);
    procedure BtZiehungClick(Sender: TObject);
    procedure BtRichtigeClick(Sender: TObject);

  private
   { Private declarations }
  public


  end;

var
  Form1: TForm1;
  ziehung : TZiehung;
  a, x, i : integer;
implementation

{$R *.dfm}

procedure TForm1.BtTippClick(Sender: TObject);
var zahl : array[1..49of boolean;
    i : integer;
    Tipp : TTipp;
begin
  memo1.Lines.Clear;
  a:=49;
  randomize;
  for i:=1 to 6 do
    begin
//      repeat
        x:=random(a)+1;
//      until
//      Zahl[x]=true;
//      Tipp[i]:=x;
//      Zahl[x]:=false;
       memo1.Lines.Add('Lottotipp:' + IntToStr(x));
    end;
end;

procedure TForm1.BtZiehungClick(Sender: TObject);
var
    Kugel :  array[1..49of boolean;
    Ausgabe : String;
    Zufallszahl : integer;
    i : integer;
begin
  for i:= 1 to 49 do Kugel[i]:=true;
  for i:= 0 to 6 do
    begin
      randomize;
      repeat
        Zufallszahl:=random(49)+1;
      until
        Kugel[Zufallszahl]=true;
        Ziehung[i]:=Zufallszahl;
        Kugel[zufallszahl]:=false;
    end;
  Ausgabe:='';
  for i:=0 to 6 do
    Ausgabe:=Ausgabe + ' ' + IntToStr(Ziehung[i]);
  Memo1.lines.Add('Lottoziehung:' + (Ausgabe));
end;

procedure TForm1.BtRichtigeClick(Sender: TObject);
var richtige, j, i : integer;
    Tipp:array[1..6of integer;
  begin
    richtige := 0;
      for i := 1 to 6 do
      for j := 1 to 6 do
        if Tipp[i] = Ziehung[j] then
          Inc(richtige);
          memo1.lines.add('Anzahl der Richtigen:' + IntToStr(richtige));
  end;


end.


schönen abend noch,
jannik
Grenzgaenger
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Do 15.02.07 19:31 
schau dir mal den folgenden code an:

ausblenden ziehungen ohne zurücklegen
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
var
 i : integer;
begin
 randomize; //soll nur einaml im programm ausgeführt werden
 for i := 1 to 49 do lbQuell.Items.Add(inttostr(i)); //Quellstrukutr aufbauen
 while lbZiel.Count < 6 do
 begin
  i := random(lbQuell.Count); //zu selektierendes Item auswählen
  lbZiel.items.Add(lbQuell.Items[i]); //gefundes item aufnehmen
  lbQuell.Items.Delete(i);  //und aus dem topf entfernen
 end;  
end;


der nimmt zuerst alle kugeln in den grossen topf (lbQuell) auf und zieht im anschluss daran, 6 kugeln und legt diese in den kleinen topf (lbziel) ab. <HTH>

PS: lbQuell und lbZiel, sind beides Listboxen.
haeuptling843
Hält's aus hier
Beiträge: 3



BeitragVerfasst: Mo 19.02.07 19:57 
Titel: Lotto ohne Listbox
Hi Auenländer. Falls du dich mit Listboxen nicht auskennst, weil du sie z.B. noch nicht im Unterricht kennengelernt hast, könnte dir dieses Programm weiterhelfen:

Bei den arrays fTipp und fZiehung wird der wert des index(zahl der kugel) auf 0 gesetzt, damit das programm weis, dass die zahl noch nicht gezogen wurde. Wenn also fMoeglicheZahlen[5] := 1, dann heist das, dass die 5 bereits gezogen wurde.
Einloggen, um Attachments anzusehen!
haeuptling843
Hält's aus hier
Beiträge: 3



BeitragVerfasst: Mo 19.02.07 20:29 
Titel: Sry falsche darstellung ;)
sry habe den quelltext unglücklich zur Schau gestellt, jetzt ein bischen übersichtlicher:

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:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
101:
102:
103:
104:
105:
106:
107:
type
  TMain = class(TForm)
    MeAusgabeTipp: TMemo;
    MeAusgabeZiehung: TMemo;
    Label1: TLabel;
    Label2: TLabel;
    BtTippen: TButton;
    BTZiehen: TButton;
    LbAusgabe: TLabel;
    BtVergleichen: TButton;
    procedure BtTippenClick(Sender: TObject);
    procedure BTZiehenClick(Sender: TObject);
    procedure BtVergleichenClick(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Main: TMain;
  fTipp : array[1..6of integer;
  fZiehung : array[1..6of integer;

implementation

{$R *.dfm}

procedure TMain.BtTippenClick(Sender: TObject);
var
  fMoeglicheZahlen : array[1..49of integer;
  i, a: Integer;
begin
  MeAusgabeTipp.Text := '';

  randomize;

  for i := 1 to 49 do
    fMoeglicheZahlen[i] := 0;   //wenn der wert des arrays 0 ist, ist die zahl noch in der auswahl

  i := 1;

  repeat
    a := random(48)+1;
    if fMoeglicheZahlen[a] <> 1   //gucken, ob die zahl noch zur auswahl steht
      then begin
        fZiehung[i] := a;
        i := i + 1;
        fMoeglicheZahlen[a] := 1;   //wenn der wert des arrays 1 ist, wurde die zahl  bereits gezogen
       end;
   until i = 7;

   for i:=1 to 6 do
     MeAusgabeTipp.Lines.Add(IntToStr(fZiehung[i])); //Ausgabe der gezogenen Zahlen

end;

procedure TMain.BTZiehenClick(Sender: TObject);
var
  fMoeglicheZahlen : array[1..49of integer;
  i, a: Integer;
begin
  MeAusgabeZiehung.Text := '';

  randomize;

  for i := 1 to 49 do
    fMoeglicheZahlen[i] := 0;  //wenn der wert des arrays 0 ist, ist die zahl noch in der auswahl

  i := 1;

  repeat
    a := random(48)+1;
    if fMoeglicheZahlen[a] <> 1  //gucken, ob die zahl noch zur auswahl steht
      then begin
        fTipp[i] := a;
        i := i + 1;
        fMoeglicheZahlen[a] := 1//wenn der wert des arrays 1 ist, wurde die zahl bereits gezogen
       end;
   until i = 7;

   for i:=1 to 6 do
     MeAusgabeZiehung.Lines.Add(IntToStr(fTipp[i])); //Ausgabe der getippten Zahlen


end;

procedure TMain.BtVergleichenClick(Sender: TObject);
var
  i,j, Zaehler : Integer;
begin
  Zaehler := 0;

  for i:= 1 to 6 do
    for j:= 1 to 6 do
      If fTipp[i] = fZiehung[j]
        then Zaehler := Zaehler+1;  //Herauslesen der richtigen Treffer

  if Zaehler = 0
    then LbAusgabe.Caption := 'Der PC hat keinen richtigen Treffer';
  if Zaehler = 1
    then LbAusgabe.Caption := 'Der PC hat ' + IntToStr(Zaehler) + ' richtigen Treffer';
  if Zaehler > 1
     then LbAusgabe.Caption := 'Der PC hat ' + IntToStr(Zaehler) + ' richtige  Treffer';  //Ausgabe der richtigen Treffer  
end;

end.


Also wie schon gesagt : Wenn der wert des index von fMoeglicheZahlen auf 1 gesetzt wird, heist das, dass die Zahl bereits gezogen wurde und nicht zur Auswahl steht.

Z.B. :
fMoeglicheZahlen[9] = 1 => Die Zahl 9 wurde bereits gezogen und ist nicht mehr verfügbar
fMoeglicheZahlen[46] = 0 => die Zahl 46 wurde noch nicht gezogen und ist somit noch verfügbar und kann aus dem "Topf" oder "Wahlpott" gezogen werden
der auenländer Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 25

WIN XP
Delphi 6 PE
BeitragVerfasst: Di 20.02.07 19:07 
hi, solangsam wirds zwar schon fast peinlich :( , aber es klappt immer noch was nich... :roll:

das tippen und ziehen is kein problem, das macht der, aber wenn man dann den vergleichsbutton anklickt reagiert der garnicht...keine fehlermeldung, kein abbruchh, nichts. ausser das der buttan ganznormal angeklickt bleibt, bis man einen anderen anklickt. :?

danke nochmal und schonmal im vorraus,
jannik
Einloggen, um Attachments anzusehen!
Benjie
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 55

Win 98 SE / Win XP / xubuntu Linux / Mac OS 9.2
D6 Enterprise
BeitragVerfasst: Di 20.02.07 19:27 
Hey auenländer!

nimm in der richtigen-funktion einfach die deklaration von TIP raus, dann klappts:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
procedure TForm1.BtRichtigeClick(Sender: TObject);
var richtige, j, i : integer;
begin
    richtige := 0;
       for i := 1 to 6 do
       for j := 1 to 6 do
         if Tipp[i] = Ziehung[j]
         then richtige:=richtige+1;
//         memo1.lines.add('Anzahl der Richtigen:' + IntToStr(richtige));
 if richtige = 0
    then Memo1.lines.add('Der PC hat keinen richtigen Treffer')
  else if richtige = 1
    then Memo1.lines.add('Der PC hat ' + IntToStr(richtige) + ' richtigen Treffer')
  else if richtige > 1
     then Memo1.lines.add('Der PC hat ' + IntToStr(richtige) + ' richtige  Treffer');

  end;


(Das ist so, weil ansonsten der compiler 'nen neuen array macht, der einfach leer ist und du den dann schlecht zum vergleichen nehmen kannst!)
SiC
Hält's aus hier
Beiträge: 1



BeitragVerfasst: Mo 12.03.07 09:20 
Titel: Lottoziehung mit doppelten zahlen :(
Halli Hallo

ich brauch mal schnell eure hilfe.
wir müssen in informatik einen quelltext für eine lottoziehung schreiben, aber wir brauchen noch Hilfe, da manche Zahlen doppelt ausgegeben werden. Der quelltext sollte kein BOOLEAN enthalten.

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:
unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    StringGrid1: TStringGrid;
    Button1: TButton;
    Button2: TButton;
    procedure Button2Click(Sender: TObject);
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}
VAR i,z:integer;

procedure TForm1.Button2Click(Sender: TObject);
begin
Close
end;

procedure TForm1.Button1Click(Sender: TObject);
var i:integer; Zahlen: Array [1..49of Integer;
begin
        Randomize;
        for i:=1 to 49 do Zahlen[i]:=i;
        For i:=1 to 6 do  begin
        repeat
         z:=random(49)+1;
        until

         StringGrid1.Cells[i,1]:=IntToStr(z);
        end;



end;

end.




DANKE!

Moderiert von user profile iconjasocul: Delphi-Tags hinzugefügt
oldmax
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 380


D3 Prof, D4 Prof
BeitragVerfasst: Mo 12.03.07 18:08 
Hi
Also, wenn du glaubst, wir schreiben das Ganze noch einmal für dich in einer anderen Sprache.... (wahrscheinlich kannst du unsere Sprache nicht lesen) Es ist alles beschrieben, also lern lesen.
Gruß oldmax

_________________
Zier dich nich so, ich krieg dich schon....