C++ Spielproblem (unlogischer Zug)

Online-Skater

Erfahrenes Mitglied
Hi ich bin neu hier und hätte gleich mal eine Frage.
Eines vorweg, ich programmiere gelegentlich mit Borland C++, dieses Projekt ist ein kleines Streichholzspiel auch Nimmspiel genannt, im Rahmen meines Unterrichtskurses. Asl oim Unterricht verwenden wir Delphi und damit habe ich mein Proggi schon geschafft also vollendet nur arbeite ich zuhause lieber mit c++ und wollte es in dieser Sprache nach proggen. Da gibts ein Problem: keine fehlermeldung , kein logisches problem aber wo liegt der Fehler ?
Code:
void __fastcall TForm1::ab1Click(TObject *Sender)
{

   if (zahl == 2)
   {
    ab3->Enabled = false;
   }
   if (zahl == 1)
   {
    ab2->Enabled = false;
    ab3->Enabled = false;
   }
   if (zahl > 0)
   {
    zahl = zahl - 1;
    Hoelzchen->Caption = IntToStr(zahl);
    Shape1->Brush->Color = clRed;
   }
   if (zahl == 0)
   {
    ab1->Visible = false;
    ab2->Visible = false;
    ab3->Visible = false;
    ende->Caption = "You have LOST the match !";
    ende->Visible = true;
   }
   else
   {
    Compzug(zahl);
   }
}

Das ist mein Code und es zeigt eine button klick routin
Erklärung: Man nimmt von vorhandenen Hölzern und die werden abgezogen , d.h. wenn ich auf dem button klicke werden hierin dem fall einer abgezogen , danach soll der computer ziehen siehe Procedure Compzug ....

Das problem ist das der pc nur einen zug macht d.h. wenn ich weider drücke macht er nix und zeigt es nicht an wenn ich öfters drücke passiert wieder was aber unregelmäßig :rolleyes:

Ich hab absolut keine ahnung woran das liegen könnte ...
thx 4 help
 
Das Problem liegt auf der hand:
Durch die haufen ifs hast du ausser acht gelassen dasss der comzug() nur bei der letzten bedingung als else angegeben ist.
Nur wenn zahl = 0 ist zieht der computer. ich weiss jetzt nicht wann die ki ziehen soll, aber ich würde ein else if verwenden.
rya.
Scorcher24
 
na thx für den versuch :)

aber das stimmt net das sind viele um genau zu sein 4 if-Abfragen , und di ki wird IMMER ausgeführt außer wenn zahl = 0 :eek:

wenn ich elseif verwenden würde dann würde er nur eine Abfrage machen z.B. wenn zahl 1 ist macht er die restlichen aus zieht aber keinen mehr ab weil er die bedingung nicht mehr abfragt glaub ich :-) wenn doch kann ich es nehmen stimmt aber daran liegts ja net ..... aber ich werds trotzdem ausprobieren :p
 
Code:
void Compzug(int a)
{
int b;

 switch (a)           // Abfragen Button-Deaktivierung
 {
  case 0: Form1->ab1->Visible = false;
          Form1->ab2->Visible = false;
          Form1->ab3->Visible = false;
          Form1->ende->Caption = "You have LOST the match !";
          Form1->ende->Visible = true;
  case 2: Form1->ab3->Enabled = false;
 }

 if (a > 0)        // KI
   {
    b = a % 4;    // Rest von Zahl

    if (b == 0)
     {
      b = 3;
      }
      else
          {
           b = b - 1;
           if (b == 0)         // egal was er zieht
           {
            randomize();
            do
            {
             b = random(3);
            } while (b > 0);
           }
           Form1->pcnimmt->Caption = IntToStr(b);
          }

     if (a == 1)
     {
      b = 1;
     }
    a = a - b;
    Form1->Hoelzchen->Caption = IntToStr(a);
    Form1->pcnimmt->Caption = IntToStr(b);
    if (a == 0)
    {
     Form1->ende->Caption = "You have WON the match !";
     Form1->ende->Visible = true;
    }
    else
        {
         Form1->Shape1->Brush->Color = clLime;
        }
 }
}

oder könnte es hier liegen ? eh das is abnormal der bug :-(
 
moin


Wie ich das sehe ruft deine ab1Click() Funnkiton die Funktion Compzug nur auf wenn zahl ungleich 0 ist. Und zahl wird dann mit übergeben.

Da die Funktion Compzug aber niemals eine 0 mitbekommen kann, kann es auch niemals zum case 0 in der switch-abfrage (am Anfang von Compzug) kommen!

Und dein if( b == 0 ) kann auch niemals 0 werden, da du bei b = a % 4; nur auf 0 kommst wenn a=4 ist, aber das sieht dein Programm ja garnicht vor.

Ich will jetzt nciht alle Abfragen udn rechnungen durchgehen, is schon spät/früh.

Aber vielleicht hab ich dir ja geholfen.


mfg
umbrasaxum
 
hi umbrasaxum

Jo also ich versuche es umzustrukturieren mals sehn...
zu dein comment:
- Ja das mit der switch abfrage (0) ist überflüssig
- Es ist keine Funktion sondern eine prozedure ^^
- die variable a ist ein zeiger auf zahl und zahl kann belibig groß sein

Ne kleine Frage nebenbei :

Wie kann ich bei Borland c++ ein Fenster aufrufen damit man sein Name eintragen kann z.B sowie Javascript-Fenster ?
das würde ich dann in eine variable speichern und im proggi ausgeben :)
oder geht das nicht ?

thx
 
Zuletzt bearbeitet:
Zurück