dreamsahin
Grünschnabel
Hallo @Forum,
Habe vor 2 Monaten einen Mastermind Klon(Zahlen) mit Delphi angefangen..
fast und mit ein paar Bugs habe ich es geschafft..
Ablauf des Spiels ist..
Programm generiert 5 Zufallszahlen von 0-9 dieser vom Spieler erraten werden müssen...
Spieler gibt seine erratene Zahlen in 5 nebeneinander gesetzte EditFelder ein....
von Spieler eingegebene Zahlen werden in eine Liste (StringGrid1 mit 5 Cells) eingetragen und mit der von Programm generierte Zahlen verglichen..
und zur zweite Liste(StringGrid2 mit 2 Cells) übertragen und als ergebniss weiter gegeben als
R = (Richtige zahl im RICHTIGEN Position) und als F = (richtige Zahl aber in FALSCHEM position)..
bei der ergebniss ausgabe für F kriege ich meistens falsche ergebnisse sobald in Programm generierte 5 CodeFeldern gleiche Zahlen vorkommen.. werden die Zahlen auch mehrmals mitgezählt dadurch erhält man auch unterschiedliche ergebnisse..
Bsp...
Generierte Zahlen.
8 0 0 3 1
erraten vom Spieler
0 8 8 8 0
als ergebniss bekomme ich dann
R = 0 und F = 7
also die 8 wird 3 mal und die 0 wird 4 mal berechnet..
dies möchte ich verhindern..jedes Zahl dieser von Spieler eingegeben ist soll und darf nur eimal gezählt werden....
Das Quellcode des Spiels habe ich unten eingefügt....
würde mich auf eure Tips und hilfe sehr freuen....
bedanke mich schonmal im voraus...
1.Bug
Quellcodezeile 112 bis 119
Habe vor 2 Monaten einen Mastermind Klon(Zahlen) mit Delphi angefangen..
fast und mit ein paar Bugs habe ich es geschafft..
Ablauf des Spiels ist..
Programm generiert 5 Zufallszahlen von 0-9 dieser vom Spieler erraten werden müssen...
Spieler gibt seine erratene Zahlen in 5 nebeneinander gesetzte EditFelder ein....
von Spieler eingegebene Zahlen werden in eine Liste (StringGrid1 mit 5 Cells) eingetragen und mit der von Programm generierte Zahlen verglichen..
und zur zweite Liste(StringGrid2 mit 2 Cells) übertragen und als ergebniss weiter gegeben als
R = (Richtige zahl im RICHTIGEN Position) und als F = (richtige Zahl aber in FALSCHEM position)..
bei der ergebniss ausgabe für F kriege ich meistens falsche ergebnisse sobald in Programm generierte 5 CodeFeldern gleiche Zahlen vorkommen.. werden die Zahlen auch mehrmals mitgezählt dadurch erhält man auch unterschiedliche ergebnisse..
Bsp...
Generierte Zahlen.
8 0 0 3 1
erraten vom Spieler
0 8 8 8 0
als ergebniss bekomme ich dann
R = 0 und F = 7
also die 8 wird 3 mal und die 0 wird 4 mal berechnet..
dies möchte ich verhindern..jedes Zahl dieser von Spieler eingegeben ist soll und darf nur eimal gezählt werden....
Das Quellcode des Spiels habe ich unten eingefügt....
würde mich auf eure Tips und hilfe sehr freuen....
bedanke mich schonmal im voraus...
1.Bug
Quellcodezeile 112 bis 119
Code:
unit Master;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Grids, StdCtrls;
type
TForm1 = class(TForm)
Edit1: TEdit;
Edit2: TEdit;
Edit3: TEdit;
Edit4: TEdit;
Edit5: TEdit;
StringGrid1: TStringGrid;
OK: TLabel;
Neu: TButton;
Abbrechen: TButton;
Beenden: TButton;
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
Label4: TLabel;
Label5: TLabel;
StringGrid2: TStringGrid;
Label6: TLabel;
Label7: TLabel;
Label8: TLabel;
Label9: TLabel;
Counter: TEdit;
Label10: TLabel;
procedure OKClick(Sender: TObject);
procedure OKMouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
procedure OKMouseLeave(Sender: TObject);
procedure NeuClick(Sender: TObject);
procedure BeendenClick(Sender: TObject);
procedure AbbrechenClick(Sender: TObject);
procedure Edit1KeyPress(Sender: TObject; var Key: Char);
procedure Label10Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
uses Masteranleitung;
{$R *.dfm}
var
count: Integer;
procedure TForm1.OKClick(Sender: TObject);
var
code: Array[1..5] of Integer;
geraten: Array[1..5] of Integer;
richtig,falsch: Integer;
i,j,k,c,f,g,h: Integer;
begin
if Edit1.Text='' then ShowMessage('eingabe überprüfen')else
if Edit2.Text='' then ShowMessage('eingabe überprüfen')else
if Edit3.Text='' then ShowMessage('eingabe überprüfen')else
if Edit4.Text='' then ShowMessage('eingabe überprüfen')else
if Edit5.Text='' then ShowMessage('eingabe überprüfen')else
begin
i:=StringGrid1.RowCount-1;
with StringGrid1 do
begin
// Geratene Zahlen werden in die Liste eingefügt....
StringGrid1.Cells[0,i]:=Edit1.Text;
StringGrid1.Cells[1,i]:=Edit2.Text;
StringGrid1.Cells[2,i]:=Edit3.Text;
StringGrid1.Cells[3,i]:=Edit4.Text;
StringGrid1.Cells[4,i]:=Edit5.Text;
StringGrid1.RowCount:=StringGrid1.RowCount+1;
end;
begin
code[1]:=StrToInt(Label1.Caption);
code[2]:=StrToInt(Label2.Caption);
code[3]:=StrToInt(Label3.Caption);
code[4]:=StrToInt(Label4.Caption);
code[5]:=StrToInt(Label5.Caption);
geraten[1]:=StrToInt(Edit1.Text);
geraten[2]:=StrToInt(Edit2.Text);
geraten[3]:=StrToInt(Edit3.Text);
geraten[4]:=StrToInt(Edit4.Text);
geraten[5]:=StrToInt(Edit5.Text);
Edit1.Clear;
Edit2.Clear;
Edit3.Clear;
Edit4.Clear;
Edit5.Clear;
Count:=Count+1;
Counter.Text:=IntToStr(count);
begin
// richtige zahlen werden sortiert....
richtig:=0;
for g:=1 to 5 do
if geraten[g]=code[g] then inc(richtig);
Label8.Caption:=IntToStr(richtig);
end;
begin
// falsche zahlen werden sortiert....
falsch:=0;
for f:=1 to 5 do
for c:=1 to f do
if geraten[ c]<>code[ c] then
if geraten[ c]=code[f] then inc(Falsch);
Label9.Caption:=IntToStr(falsch);
begin
// Ergebniss Liste für richtige und falsche Zahlen...
k:=StringGrid2.RowCount-1;
j:=StringGrid2.RowCount-1;
with StringGrid2 do
begin
StringGrid2.Cells[0,j]:=Label8.Caption;
StringGrid2.Cells[1,k]:=Label9.Caption;
StringGrid2.RowCount:=StringGrid2.RowCount+1;
end;
begin
if richtig=5 then ShowMessage('Sie haben es Geschafft');
if richtig=5 then Neu.Enabled:=True;
if richtig=5 then Abbrechen.Enabled:=False;
if Count=12 then
begin
Counter.Color:=clRed;
if Application.MessageBox('Spiel Verloren','VERLOREN')=5
then
Label1.Visible:=True;
Label1.Visible:=True;
Label2.Visible:=True;
Label3.Visible:=True;
Label4.Visible:=True;
Label5.Visible:=True;
Abbrechen.Enabled:=False;
Neu.Caption:='VERLOREN';
Neu.Enabled:=True;
OK.Enabled:=False;
end;
end;
end;
end;
end;
end;
end;
procedure TForm1.OKMouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
begin
OK.Font.Color:=clGreen;
end;
procedure TForm1.OKMouseLeave(Sender: TObject);
begin
OK.Font.Color:=clBlack;
end;
procedure TForm1.NeuClick(Sender: TObject);
var
Num1, Num2, Num3, Num4, Num5: Byte;
begin
// Zufallszahlen werden generiert....
Randomize;
Num1:=random(10); Num2:=random(10); Num3:=random(10);
Num4:=random(10); Num5:=random(10);
Count:=0;
Label1.Caption:=IntToStr(Num1);
Label2.Caption:=InttoStr(Num2);
Label3.Caption:=IntToStr(Num3);
Label4.Caption:=IntToStr(Num4);
Label5.Caption:=IntToStr(Num5);
Abbrechen.Enabled:=True;
Neu.Caption:='Neu';
Counter.Color:=clWhite;
Counter.Clear;
Ok.Enabled:=True;
Neu.Enabled:=False;
//Liste1 leeren
StringGrid1.RowCount:=StringGrid1.RowCount-12;
StringGrid1.Rows[0].Clear;
//Liste2 leeren
StringGrid2.RowCount:=StringGrid2.RowCount-12;
StringGrid2.Rows[0].Clear;
end;
procedure TForm1.BeendenClick(Sender: TObject);
begin
// Frage ob Beenden? wenn Bestätigt dann Beenden
if Application.MessageBox('Sind Sie sicher','BEENDEN',36)=6
then
close;
end;
procedure TForm1.AbbrechenClick(Sender: TObject);
begin
// Frage ob Abbrechen wenn Bestätigt dann Abbrechen und Zufallszahlen zeigen...
if Application.MessageBox('wollen Sie Aufgeben','AUFGEBEN',36)=6 then
Label1.Visible:=True;
Label2.Visible:=True;
Label3.Visible:=True;
Label4.Visible:=True;
Label5.Visible:=True;
Abbrechen.Enabled:=False;
Neu.Enabled:=True;
end;
procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
if not (Key in ['0'..'9',#8]) then Key:=#0;
end;
procedure TForm1.Label10Click(Sender: TObject);
begin
Masteranleitung.Form2.Show;
end;
end.