Hilfe bei Vier Gewinnt



  • Hallo

    was soll ich da noch erklären? Wenn ich mir dein Code aus dem vorletzten Post anschaue, denk ich doch, du weißt was es mit der Schleife auf sich hat.
    Vielleicht hilft die diese Aufdröselung, es zu verstehen:

    int help;
    for (int Lv = 0; Lv < 4; Lv++)
    {
      Help = cy -Lv; // aktuellen um 1 verringerten Spaltenindex berechnen
      if(feldwerte[Help][cx] == pcolor) return(true);
      }
    
    // oder auch
    for (int Lv = cy; Lv > cy -4; Lv--)
      if(feldwerte[Lv][cx] == pcolor) return(true);
    

    Ich glaube, du solltest dir noch mal den Alogithmus an sich durch den Kopf gehen lassen. Ich blicke da nämlich nicht durch.

    bis bald
    akari



  • was des macht habsch schon verstanden...

    nur mein problem ist es damit weiterzuarbeiten...

    weil der gibt ja nun immer true zurück...

    und sobald ich ein stein setze hat der gleich gewonnen... es hapert wohl eher daran das ich nicht mit dem true oder false weiterkomme...

    //gewinnfestellung
    bool TVierGewinnt::viergewinnt(int cx, int pcolor)
    {
      for(int cy=MAXY; cy>=0; cy--)
      {
        for (int cv = 0; cv < 4; cv++){
        if(feldwerte[cy -cv][cx] == pcolor)return(true);
        }
      }//ende for schleife
    }
    
    void __fastcall TVierGewinnt::btn_zweiClick(TObject *Sender)
    {
        fuellen(counter2, xwert+1);
        counter2--;
        weristdran();
        if(viergewinnt(xwert+1, start) == True)
          ShowMessage(start); // wer gewónnen hat...
    
    }
    

    hast du ne mailadresse? da kannsch dir das ja mal schicken 🙂

    greetz
    morphY



  • Hallo

    du mußt noch die richtigen Steine zählen

    //gewinnfestellung
    bool TVierGewinnt::viergewinnt(int cx, int pcolor)
    {
      int count = 0;
      for(int cy=MAXY; cy>=0; cy--)
      {
        count = 0;
        for (int cv = 0; cv < 4; cv++){
          if(feldwerte[cy -cv][cx] == pcolor) count++;
          } 
        if (count == 4) return(true); 
        count = 0;
        // nächste Überprüfung
        }//ende for schleife
    
      return(true);
    }
    

    bis bald
    akari



  • ich weiss echt net was da net stimmt... der macht es immernochnet richitg...

    hab des so gemacht

    //gewinnfestellung
    bool TVierGewinnt::viergewinnt(int cx, int pcolor)
    {
      int count = 0;
      for(int cy=MAXY; cy>=0; cy--)
      {
        count = 0;
        for (int cv = 0; cv < 4; cv++){
          if(feldwerte[cy -cv][cx] == pcolor) count++;
          }
        if (count == 4) return(true);
        count = 0;
        // nächste Überprüfung
        }//ende for schleife
      return(false);
    }
    

    und unten frag ich des dann so ab!

    void __fastcall TVierGewinnt::Bbtn_einsClick(TObject *Sender)
    {
       fuellen(counter1, xwert);
       counter1--;
       weristdran();
       if(viergewinnt(xwert, start) == true);
       ShowMessage(start);
    }
    

    und der sagt immer sobald ich ein stein setze das die farbe die grade gesetzt gat gewonnen hat !

    was mach ich nur falsch

    greetz
    morphY



  • Hallo

    if(viergewinnt(xwert, start) == true); // << Semikolon weg!
       ShowMessage(start);
    

    bis bald
    akari



  • hmm danke geht soweit 🙂

    hab noch nen fehler bei mir gefunden... ist aber behoben ^^
    veränder den start wert ( also wer grade dran ist) zu früh)
    also fragt der mit dem falschen wert ab...

    jetzt habsch nurnoch ein problem ^^ der sagt schon bei 3 das vier gewinnt ist ^^ aber ich debugge mal schnell und dann werd ich den fehler schon finden

    greetz
    morphY

    fettes merci nochmal 🙂

    //edit

    habs

    bool TVierGewinnt::viergewinnt(int cx, int scolor)
    {
      int count = 0;
      for(int cy=MAXY-1; cy>=0; cy--)//MAX=8 muss aber 7 sein ^^ array geht ja nur von 0-7 ^^ also minus 1 und es geht :)
      {
        count = 0;
        for (int cv = 0; cv <= 4; cv++){
          if(feldwerte[cy -cv][cx] == scolor)
          count++;
          }
        if (count == 4) return(true);
        count = 0;
        // nächste Überprüfung
        }//ende for schleife
      return(false);
    }
    

    hmm ich mach jetzt noch auf jeden fall die waagerechte und dann ist erstemal schluss für heute 🙂

    ich meld mich ncohmal wenn es probleme gibt 😃



  • So meine gewinnprüfung läuft nun fehlerfrei...
    das visuelle fallen der steine habsch nun auch gelöst und die ganzen kleinigkeiten sind nun auch erledigt...

    hat jemand ne idee wie ich es am besten löse das er sich die letzten 5 züge speichert, damit man später zuge zurücknehmen kann???

    greetz

    morphY



  • Hallo

    indem ein weiteres Array über ints aufmachst, in dem beim Setzen eines neuen Steines in die erste Position der Wert der neueste Spalten kommt, während alle anderen Positionen um eins nach hinten rutschen und der letzte wegfällt.
    Eventuell bietet die STL einen passenden Container, ansonsten ist sowas auch leicht selbst gemacht.

    bis bald
    akari



  • //züge zurücknehmen
    ja das mit dem array habsch mir auch schon überlegt...
    aber ich brauch ja nen y und nen x wert... und die beiden werte kannsch ja nicht in einen speicher tun...
    will das man 5 züge zurückgehen kann...
    ich könnte entweder 2 arrays nehmen einmal für x und einmal für y oder
    oder des array doppelt so groß machen...
    aber da es da leichter zu fehlern kommen kann wär es doch angebrachter 2 zu nehmen oder??

    //Exe erstellung
    und noch ne frage... wenn ich des spiel über f9 starte... dann erstellt er mir ja auch eine exe das ist ja aber nur ne kleine... wenn ich die auf anderen computern ausführe geht die ja nicht...
    wie mach cih das das es eine "richtige" ist die alle erforderlichen infos enthält???

    was ist STL???



  • Du brauchst nur einen Wert, den der Spalte. Du kannst immer nur den obersten in der Spalte wieder rausnehmen.

    EXE: Sieh mal in die FAQ unter Standalone EXE.

    STL: Schau mal in die Hilfe Deines BCB.



  • so nun wieder zeit für cpp 🙂

    ich brauch trotzdem 2 werte.. weil ich muss ja wissen welche spalte er ist und in welcher reihe er ist.

    weil wie soll ich herrausfinde welches der oberste ist ???

    was soll mir STL bringen???
    also die hilfe hat mir net wirklich was Gebracht....

    //nochwas nebenbei...
    kann man den code zur gewinnabfrage so lassen?

    wenn er so ok ist mach ich des struktogramm dafür

    //Gewinnfeststellung---------------------------------------------------------
    bool TVierGewinnt::viergewinnt(int countx, int scolor)
    {
      int count=0, count2=0, count3=0, count4=0;
      for(int cy=MAXY-1; cy>=3; cy--)//beginn der diagonalen von rechts
      {
        for (int cx = MAXX-1; cx >= 3; cx--)
        {
          count4 = 0;
          for(int cv = 0; cv<=3; cv++)
          {
            if(feldwerte[cy-cv][cx-cv] == scolor)
            count4++;
          }
          if(count4 == 4) return(true);
          count4 = 0;
        }
      }//ende for schleife   //ende der diagonalen von rechts
      for(int cy=MAXY-1; cy>=3; cy--)//beginn der diagonalen von links   und der senkrechten
      {
        for (int cx = 0; cx<=4; cx++)
        {
          count3 = 0;
          count2 = 0;
          for(int cv = 0; cv<=3; cv++)
          {
            if(feldwerte[cy-cv][cx+cv] == scolor)
              count3++;
            if(feldwerte[cy][cx+cv] == scolor)
              count2++;
          }
          if(count2==4 || count3==4) return(true);
          count3 = 0;
          count2 = 0;
        }
      }//ende for schleife   //ende der diagonalen von links
      for(int cy=MAXY-1; cy>=0; cy--)//beginn der senkrechten
      {
        count = 0;
        for (int cv = 0; cv <=3; cv++){
          if(feldwerte[cy -cv][countx] == scolor)
          count++;
          }
        if (count == 4) return(true);
        count = 0;  //ende der senkrechten
      }//ende for schleife
    
      if(start==0)
        start++;
      else
        start--;
      return(false);
    }
    


  • Hallo

    ich brauch trotzdem 2 werte.. weil ich muss ja wissen welche spalte er ist und in welcher reihe er ist.

    weil wie soll ich herrausfinde welches der oberste ist ???

    In dem besagten Array brauchst du nur einen Wert, den der Spalte (also den Wert, auf den du die Gewinnüberprüfung machst). Denn genau so wie du immer nur von oben einen neuen Stein setzen kannst, kannst du auch immer nur einen Stein von oben wieder wegnehmen.
    Um jetzt den obersten Stein einer Spalte zu finden, gehst du nur die betreffende Spalte von unten nach oben durch und suchst den letzten Stein der Spalte, das heißt das nächste Feld der Spalte ist leer.

    nochwas nebenbei...
    kann man den code zur gewinnabfrage so lassen?

    wenn er so ok ist mach ich des struktogramm dafür

    Funktioniert denn der Code, so wie du willst? Es geht erstmal nicht darum, das der Code perfekt ist, sondern das du weißt wie er funktioniert.

    bis bald
    akari



  • In dem besagten Array brauchst du nur einen Wert, den der Spalte (also den Wert, auf den du die Gewinnüberprüfung machst). Denn genau so wie du immer nur von oben einen neuen Stein setzen kannst, kannst du auch immer nur einen Stein von oben wieder wegnehmen.
    Um jetzt den obersten Stein einer Spalte zu finden, gehst du nur die betreffende Spalte von unten nach oben durch und suchst den letzten Stein der Spalte, das heißt das nächste Feld der Spalte ist leer.

    also speicher ich im prinzip die xachse von mienem array und suche von unten ab die erste 2 (2 = leer) und lösche ein feld darunter und mach dies auch gleich weiss...

    hmm muss ich mal gucken wie ich des mache... setz mich gleich mal ran

    //------------------------------------------------------------------

    Funktioniert denn der Code, so wie du willst? Es geht erstmal nicht darum, das der Code perfekt ist, sondern das du weißt wie er funktioniert.

    der code funktioniert genauso wie ich will könnte net besser laufen 🙂
    und verstehen tu icH IHn auch 🙂
    hab ja jetzt mittlerweile die anwendung von bool drauf 😉

    greetz
    morphY



  • wow morphY, dann bist duanscheinend schon fertig 👍
    wird wohl ne 1 beim master-g ^^



  • @apfelsaft
    jo bestimmt 🙂

    @all
    hab jetzt auch den button zum zurücksetzen drinne 🙂 ud er funzt optimal 🙂

    @akari
    hast du icq? oder email? email haste bestimmt ^^ willste mir die mal geben?
    will dir nen code schicken... soll aber halt net jeder sehen da es einige gibt die des gleiche game programmieren ^^ net das die dann den gleichen code haben ^^


Anmelden zum Antworten