Autor Beitrag
ttauch
Hält's aus hier
Beiträge: 14



BeitragVerfasst: Sa 19.03.05 22:59 
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

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:
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;
  //Sternchen auszählen und Ergebnis in "a"speichern
  for i:=1 to level do
  if e[i]=z[i] then begin z[i]:='a'; a:=a+'*';end;
  //Ausrufezeichen auszählen und Ergebnis in "b" speichern
  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);
  //Ergebnisse Ausgeben
  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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 52

Win 98, XP
D4 prof.
BeitragVerfasst: So 20.03.05 01:14 
hallo,
ändere mal deine schleife für die ausrufezeichen wie folgt, dann sollte es gehen.

ausblenden Delphi-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

Moderiert von user profile iconAXMD: Code- durch Delphi-Tags ersetzt.
ttauch Threadstarter
Hält's aus hier
Beiträge: 14



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2684
Erhaltene Danke: 32



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
EE-Regisseur
Beiträge: 5248
Erhaltene Danke: 2

WIN XP, IE 7, FF 2.0
Delphi 7, Lazarus
BeitragVerfasst: So 20.03.05 19:53 
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:
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
    //Sternchen auszählen und Ergebnis in "a" speichern
    for i := 1 to level do
    begin
      if e[i] = z[i] then 
      begin
        z[i] := 'a';
        a := a + '*';
      end;
    end;

    //Ausrufezeichen auszählen und Ergebnis in "b" speichern
    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);

    //Ergebnisse Ausgeben
    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!

_________________
"Wer Ego-Shooter Killerspiele nennt, muss konsequenterweise jeden Horrorstreifen als Killerfilm bezeichnen." (Zeit.de)
delfiphan
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2684
Erhaltene Danke: 32



BeitragVerfasst: So 20.03.05 20:03 
Das Problem liegt hier (hab die Schleife re-formatiert):
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 52

Win 98, XP
D4 prof.
BeitragVerfasst: 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]...

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2684
Erhaltene Danke: 32



BeitragVerfasst: 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 Threadstarter
Hält's aus hier
Beiträge: 14



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2684
Erhaltene Danke: 32



BeitragVerfasst: Mo 21.03.05 01:14 
Vielleicht ist das Mastermind, vielleicht auch nicht. So hab ich das jetzt auf jeden Fall verstanden.
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:
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 Threadstarter
Hält's aus hier
Beiträge: 14



BeitragVerfasst: 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