Entwickler-Ecke
Sonstiges (Delphi) - Mastermind
ttauch - Sa 19.03.05 22:59
Titel: Mastermind
HI!
Bitte helft mir ich sitze nun schon stunden- und tagelang an diesem Problem. Bitte erwartet nicht zuviel von mir, da man in der 11.Klasse bei uns net wirklich viel im Unterricht lernt:-(
Viele von euch kennen bestimmt das Spiel "Mastermind". Der Spieler Versucht eine ihm nicht bekannte,mehrstellige Zahl zu zu bestimmen, indem er mehrmals Zahlen rät oder kombiniert, die jeweils vom Moderator bewertet werden. Ziel ist es so wenig wie möglich Versuche dafür zu benötigen.
Ich habe versucht dieses Spiel zu proggen. Leider mit mäßigem Erfolg. Hier mein Code für die Prozedur die die eingegebene Zahl bewertet.
Kleine Erklärung zur Funktion:
z=vom PC generierte Zahl, die es zu erraten gilt
a und b sind die Bewertungen(ein * für jede richtige Zahl an der richtigen Stelle und ein ! für eine richtige Zahl an der falschen Stelle
level=Anzahl der Stellen, die die zu erratene Zahl haben soll
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:
| procedure TForm1.Button1Click(Sender: TObject); var e,a,b,z:string; i,f:integer; begin z:=x; a:=''; b:=''; e:=edit1.Text; if length(e)<>level then showmessage ('Bitte Eingabe Korrigieren')else begin; for i:=1 to level do if e[i]=z[i] then begin z[i]:='a'; a:=a+'*';end; for i:=1 to level do if (z[i]<>'a') then begin for f:=1 to level do begin if (z[f]<>'a') then begin if e[f]=z[i] then begin z[f]:='a'; z[i]:='a'; b:=b+'!';end; end; end; end; inc(versuche); if length(a+b)=0 then a:=' -- '; listbox1.Items.add(e+' '+a+b); panel1.Caption:=IntToStr(versuche)+'. Versuch'; if e=x then showmessage('Sie haben die Zufallszahl nach '+IntToStr(versuche)+ ' Versuchen erraten'); end; end; |
Mein Problem ist am besten in einem Beispiel formuliert:
generierte Zahl: 1234
vom user eingegebene Zahl: 4321
Bewertung: !! <-- Es müsste allerdings !!!! erscheinen
:-(
nilsener1 - So 20.03.05 01:14
hallo,
ändere mal deine schleife für die ausrufezeichen wie folgt, dann sollte es gehen.
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14:
| for i:=1 to 4 do if (z[i]<>'a') then begin for f:=1 to 4 do begin if (z[i]<>'a') then begin if e[f]=z[i] then begin z[i]:='a'; b:=b+'!'; end; end; end; |
gruss nilsener
Moderiert von
AXMD: Code- durch Delphi-Tags ersetzt.
ttauch - So 20.03.05 12:25
Nein das bringt nichts! Das hatte ich schon ausprobiert. Die Ausgabe bleibt in deinem Beispiel die gleiche wie in meinem:-(
delfiphan - So 20.03.05 19:37
Du kannst das Programm Schritt für Schritt ausführen lassen und kannst so jeden Schritt einzeln verfolgen. Dann wirst du genau sehen, wie diese zwei Ausrufezeichen zu stande kommen.
Tipp: Du solltest deinen Code schöner formatieren und deine Variablen sinnvoller benennen, dann wär das Problem schon längst gelöst...
GTA-Place - So 20.03.05 19:53
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:
| procedure TForm1.Button1Click(Sender: TObject); var e, a, b, z: String; i, f: Integer; begin z := x; a := ''; b := ''; e := Edit1.Text;
if Length(e) <> level then Showmessage('Bitte Eingabe Korrigieren') else begin for i := 1 to level do begin if e[i] = z[i] then begin z[i] := 'a'; a := a + '*'; end; end;
for i := 1 to level do begin if z[i] <> 'a' then begin for f := 1 to level do begin if z[f] <> 'a' then begin if e[f]=z[i] then begin z[f] := 'a'; z[i] := 'a'; b := b + '!'; end; end; end; end; end;
inc(versuche);
if Length(a + b) = 0 then a := ' -- ';
Listbox1.Items.Add(e + ' ' + a + b); Panel1.Caption := IntToStr(Versuche) + '. Versuch';
if e = x then ShowMessage('Sie haben die Zufallszahl nach ' + IntToStr(Versuche) + ' Versuchen erraten'); end; end; |
1. Ich hab den Source nur richtig formatiert, weil ich unformatieren Source einfach nicht sehen kann.
Nächstes mal mach ich das nicht mehr für dich. Du weißt ja jetzt wie's geht.
2. Wie schon gesagt, gib deinen Variablen (und Komponenten) einen gescheiten Namen!
delfiphan - So 20.03.05 20:03
Das Problem liegt hier (hab die Schleife re-formatiert):
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9:
| for i := 1 to level do if z[i] <> 'a' then for f := 1 to level do if (z[f] <> 'a') and (e[f] = z[i]) then begin z[f] := 'a'; z[i] := 'a'; b := b + '!'; end; |
Wieso veränderst du dort "z" in der Schleife? Auf z wird bei späteren Durchläufen der Schleife zugegriffen... Das muss fast schief gehn.
nilsener1 - So 20.03.05 20:09
dann hast du vielleicht den code nicht vollständig übernommen, hab mir mal die mühe gemacht und den code ausprobiert, bei mir klappt es. kopier den code mal 1:1 in dein programm. du musst nicht nur das z[f]='a'; enfernen sondern auch in der zweiten if abfrage das if z[f]... ändern in if z[i]...
Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14:
| //Ausrufezeichen auszählen und Ergebnis in "b" speichern for i:=1 to 4 do if (z[i]<>'a') then begin for f:=1 to 4 do begin if (z[i]<>'a') then begin if e[f]=z[i] then begin z[i]:='a'; b:=b+'!'; end; end; end; |
gruss nilsener
delfiphan - So 20.03.05 20:16
Ich hab überhaupt nichts ausprobiert. Ich kenne Mastermind zu wenig, ich weiss nicht, ob eine Zahl z.B. doppelt vorkommen kann, was dann genau passiert, etc.. Vor allem aber finde ich den Code sehr unleserlich (immer noch).
Edit: Achso, du sprichst ja mit ttauch.
ttauch - Mo 21.03.05 00:44
@delfiphan
einige Stellen müssen markiert werden da es sonst möglich ist die gleiche Ziffer doppelt zu bewerten
@nilsener1
deinen code habe ich wirklich nicht genau übernommen
siehe
Zitat: |
auch in der zweiten if abfrage das if z[f]... ändern in if z[i]... |
Allerdings löst das das Problem nur in meinem gegebenen Beispiel. Wenn der user 1253 eingibt und die zu erratende Zahl 1232 ist, dann erfolgt als Bewertung **!!. Es müsste aber eigentlich **! sein.:-(
Zur Formatierung des Codes kann ich nichts weiter sagen. Am besten ihr gebt mir mal ein Beispiel wie man das machen sollte.
Ich hoffe wir können noch eine Lösung für das Progi finden:-/
delfiphan - Mo 21.03.05 01:14
Vielleicht ist das Mastermind, vielleicht auch nicht. So hab ich das jetzt auf jeden Fall verstanden.
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:
| var Eingabe, Loesung, Output: String; i, Index: Integer; List1, List2: TStringList; begin Eingabe := Edit1.Text; Loesung := '1232'; if length(Eingabe) <> length(Loesung) then begin ShowMessage('Bitte Eingabe korrigieren.'); exit; end; inc(Versuch); Output := ''; List1 := TStringList.Create; List2 := TStringList.Create; for i := 1 to length(Eingabe) do if Eingabe[i] = Loesung[i] then Output := Output + '*' else begin List1.Add(Eingabe[i]); List2.Add(Loesung[i]); end; for i := 0 to List1.Count-1 do begin Index := List2.IndexOf(List1.Strings[i]); if Index >= 0 then begin List2.Delete(Index); Output := Output + '!' end; end; List1.Free; List2.Free; ListBox1.Items.Add(IntToStr(Versuch)+' -- '+Eingabe+' '+Output); end; |
ttauch - Di 22.03.05 21:29
ja vom Prinzip her ist das Mastermind.
Scheint auch alles so zu funzen wie es sollte.
Vielen Dank für deine Hilfe
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!