Autor |
Beitrag |
der auenländer
      
Beiträge: 25
WIN XP
Delphi 6 PE
|
Verfasst: 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: 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..6] of integer; TKugeln = array[1..49] of 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 public end;
var Form1: TForm1; ziehung : TZiehung; a, x, i : integer; implementation
{$R *.dfm}
procedure TForm1.BtTippClick(Sender: TObject); var Tipp:array[1..6] of 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; until [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 : 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
      
Beiträge: 866
Erhaltene Danke: 43
Win 7
TurboDelphi, Visual Studio 2010
|
Verfasst: 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
      
Beiträge: 380
D3 Prof, D4 Prof
|
Verfasst: 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:
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; For i:=1 to 49 do Listbox1.Items.Add(IntToStr(i)); For i:=1 to 7 do begin x:=Trunc(Random(Listbox1.Items.Count)); TEdit(FindComponent('Edit'+IntToStr(i))).Text:=Listbox1.Items[i]; Listbox1.Items.Delete(x); 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 
      
Beiträge: 25
WIN XP
Delphi 6 PE
|
Verfasst: 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...
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..6] of integer; TForm1 = class(TForm) Memo1: TMemo; BtTipp: TButton; BtZiehung: TButton; BtRichtige: TButton; procedure BtTippClick(Sender: TObject); procedure BtZiehungClick(Sender: TObject); procedure BtRichtigeClick(Sender: TObject);
private public
end;
var Form1: TForm1; ziehung : TZiehung; a, x, i : integer; implementation
{$R *.dfm}
procedure TForm1.BtTippClick(Sender: TObject); var zahl : array[1..49] of boolean; i : integer; Tipp : TTipp; begin memo1.Lines.Clear; a:=49; randomize; for i:=1 to 6 do begin x:=random(a)+1; memo1.Lines.Add('Lottotipp:' + IntToStr(x)); end; end;
procedure TForm1.BtZiehungClick(Sender: TObject); var Kugel : array[1..49] of 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..6] of 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
|
Verfasst: Do 15.02.07 19:31
schau dir mal den folgenden code an: ziehungen ohne zurücklegen 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12:
| var i : integer; begin randomize; for i := 1 to 49 do lbQuell.Items.Add(inttostr(i)); while lbZiel.Count < 6 do begin i := random(lbQuell.Count); lbZiel.items.Add(lbQuell.Items[i]); lbQuell.Items.Delete(i); 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
|
Verfasst: 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
|
Verfasst: Mo 19.02.07 20:29
Titel: Sry falsche darstellung ;)
sry habe den quelltext unglücklich zur Schau gestellt, jetzt ein bischen übersichtlicher:
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 public end;
var Main: TMain; fTipp : array[1..6] of integer; fZiehung : array[1..6] of integer;
implementation
{$R *.dfm}
procedure TMain.BtTippenClick(Sender: TObject); var fMoeglicheZahlen : array[1..49] of integer; i, a: Integer; begin MeAusgabeTipp.Text := '';
randomize;
for i := 1 to 49 do fMoeglicheZahlen[i] := 0; i := 1;
repeat a := random(48)+1; if fMoeglicheZahlen[a] <> 1 then begin fZiehung[i] := a; i := i + 1; fMoeglicheZahlen[a] := 1; end; until i = 7;
for i:=1 to 6 do MeAusgabeTipp.Lines.Add(IntToStr(fZiehung[i])); end;
procedure TMain.BTZiehenClick(Sender: TObject); var fMoeglicheZahlen : array[1..49] of integer; i, a: Integer; begin MeAusgabeZiehung.Text := '';
randomize;
for i := 1 to 49 do fMoeglicheZahlen[i] := 0; i := 1;
repeat a := random(48)+1; if fMoeglicheZahlen[a] <> 1 then begin fTipp[i] := a; i := i + 1; fMoeglicheZahlen[a] := 1; end; until i = 7;
for i:=1 to 6 do MeAusgabeZiehung.Lines.Add(IntToStr(fTipp[i]));
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; 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'; 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 
      
Beiträge: 25
WIN XP
Delphi 6 PE
|
Verfasst: Di 20.02.07 19:07
hi, solangsam wirds zwar schon fast peinlich  , aber es klappt immer noch was nich...
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
      
Beiträge: 55
Win 98 SE / Win XP / xubuntu Linux / Mac OS 9.2
D6 Enterprise
|
Verfasst: Di 20.02.07 19:27
Hey auenländer!
nimm in der richtigen-funktion einfach die deklaration von TIP raus, dann klappts:
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; 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
|
Verfasst: 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. 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 public 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..49] of 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 jasocul: Delphi-Tags hinzugefügt
|
|
oldmax
      
Beiträge: 380
D3 Prof, D4 Prof
|
Verfasst: 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....
|
|
|