4-Gewinnt Diagonal nach 4 gleichen Zeichen in einer Reihe Absuchen.



  • Hallo C++ Community,

    Ich habe ein Problem (klar sonst würde ich keine Frage stellen ;D)

    Ich arbeite momentan an einem 4-Gewinnst spiel, was auch soweit funktioniert bis auf den Punkt das ich es nicht schaffe in den Diagonalen nach 4 gleichen Zeichen in einer Reihe zu suchen. Da ich nicht weis was ihr alles von meinem Code braucht lade ich mal den gesamten hoch.

    #include <conio.h>
    #include <iostream.h>
    #include <string.h>
    #include <math.h>
    
    /*4-Gewinnt */
    //------------------------------------------------------------------------------
    //Globale Variablen
    //Initialisieren des Feldes   
    char Feld [6][7];
    int Runde = 0;
    
    //Funktionen
    void FeldAnzeigen();
    void Verarbeiten(int);
    int Kontrolle();
    int Zug();
    
    //Hauptprogramm
    int main ()
    {
    //Sonstige Variablen
        int Zeile, Spalte;
        int ZugSpalte=0;
        int Kontrollwert=0;
    
    cout<<"==============================================================================="<<endl;
    cout<<"================================= 4-Gewinnt ==================================="<<endl;
    cout<<"==============================================================================="<<endl<<endl<<endl;
    
    cout<<"================================== Regeln: ===================================="<<endl;
    cout<<"1. Spieler 1 ist [x] Spieler 2 ist [#]."<<endl;
    cout<<"2. Ziel des Spieles ist es 4 Steine seiner Form in eine Reihe zu bekommen."<<endl;
    cout<<"3. Erlaubt sind Diagonal, Senkrecht und Wagerecht."<<endl;
    cout<<"==============================================================================="<<endl<<endl<<endl;
    
        cout<<"1 - 2 - 3 - 4 - 5 - 6 - 7";
        for (Zeile = 0; Zeile <= 5 ;Zeile++)
            {   
            cout<<endl;
            for (Spalte = 0; Spalte <= 6; Spalte++)
                {
                Feld [Zeile][Spalte]=' ';
                cout<<Feld [Zeile][Spalte]<<" | ";
                }
            }
    do
    {        
    ZugSpalte = Zug ();
    Verarbeiten(ZugSpalte); 
    FeldAnzeigen();
    
    Runde++;
    
    Kontrollwert=Kontrolle();
    }
    while(Kontrollwert == 0);
    
    if(Kontrollwert == 1)
    {
                       cout<<"\nSpieler 1 [x] hat gewonnen!"<<endl;
    }
    else if (Kontrollwert == 2)
    {
                       cout<<"\nSpieler 2 [#] hat gewonnen!"<<endl;
    }
    
    getch();
    }
    
    //--------------------------FUNKTIONEN-----------------------------------------
    //Grafische Ausgabe des Aktuellen Feldes
    void FeldAnzeigen ()
    {
    cout<<"==============================================================================="<<endl;
    cout<<"================================= 4-Gewinnt ==================================="<<endl;
    cout<<"==============================================================================="<<endl;
    
        cout<<"1 - 2 - 3 - 4 - 5 - 6 - 7";
        for (int Zeile = 0; Zeile <= 5; Zeile++)
            {   
            cout<<endl;
            for (int Spalte = 0; Spalte <= 6; Spalte++)
                {
                cout<<Feld [Zeile][Spalte]<<" | ";
                }        
            }
    }
    
    //Zug
    //Eingabe des Zuges
    int Zug ()
    {
        int ZugSpalte=0;
        do
        {
        cout<<endl<<endl<<"In welche Spalte wollen sie setzen?"<<endl;    
        cin>>ZugSpalte;
        ZugSpalte=ZugSpalte-1;
    
    //Kontrolle ob Spalte gültig
        if(ZugSpalte<0 || ZugSpalte>6)
          {
          cout<<"Zahl zwischen 1 und 7 eingeben."<<endl;
          }
        if(Feld[0][ZugSpalte]!=' ' && ZugSpalte<0 || ZugSpalte>6 && Feld[0][ZugSpalte]!=' ')
          {
          cout<<"Spalte ist bereits voll. Bitte andere Spalte ausw\x84hlen."<<endl;
          }
        }
        while(ZugSpalte<0 || ZugSpalte>6 || Feld[0][ZugSpalte]!=' ');
    
    system("cls");
    return ZugSpalte;
    }
    
    //Verarbeiten der Auswahl
    void Verarbeiten (int ZugSpalte)   
    {    
        bool Stopper=1;
        for(int i=6;i>=0;)
        {   
        if(Feld [i][ZugSpalte]==' ' && Stopper==1)
          {
                if (Runde % 2 == 0)
                {
                   Feld [i][ZugSpalte]='x';
                   Stopper=0;
                }
                else
                {
                   Feld [i][ZugSpalte]='#';
                   Stopper=0;                
                }     
          }
        else
          {
          i=i-1;
          }
        }
    } 
    
    //Kontrolle
    int Kontrolle ()
    {
    
    //Kontrolle der Spalten
    //------------------------------------------------------------------------------
        int Zeile = 0, Spalte = 0, Counter = 0;
    
        for (Spalte = 0; Spalte <= 6; Spalte++)
            {   
            for (Zeile = 0; Zeile <= 5 ;Zeile++)
                {
                if(Feld [Zeile][Spalte]=='x')
                        {
                        Counter++;        
                        }
                        else
                            {
                            Counter = 0;
                            }
                if (Counter == 4)
                   {
                   return 1;
                   }
                }
            }            
    Counter = 0;
    
        for (Spalte = 0; Spalte <= 6; Spalte++)
            {   
            for (Zeile = 0; Zeile <= 5 ;Zeile++)
                {
                if(Feld [Zeile][Spalte]=='#')
                        {
                        Counter++;        
                        }
                        else
                            {
                            Counter = 0;
                            }
                if (Counter == 4)
                   {
                   return 2;
                   }
                }
            }
    Counter = 0;
    //------------------------------------------------------------------------------        
    
    //Kontrolle der Zeilen
    //------------------------------------------------------------------------------
        for (Zeile = 0; Zeile <= 5 ;Zeile++)
            {   
            for (Spalte = 0; Spalte <= 6; Spalte++)
                {
                if(Feld [Zeile][Spalte]=='x')
                        {
                        Counter++;        
                        }
                        else
                            {
                            Counter = 0;
                            }
                if (Counter == 4)
                   {
                   return 1;
                   }
                }
            }            
    Counter = 0;
    
        for (Zeile = 0; Zeile <= 5 ;Zeile++)
            {   
            for (Spalte = 0; Spalte <= 6; Spalte++)
                {
                if(Feld [Zeile][Spalte]=='#')
                        {
                        Counter++;        
                        }
                        else
                            {
                            Counter = 0;
                            }
                if (Counter == 4)
                   {
                   return 2;
                   }
                }
            }
    Counter = 0;
    //------------------------------------------------------------------------------
    
    //Kontrolle der Diagonalen
    //------------------------------------------------------------------------------    
    return 0;        
    }
    

    Es tut mir Leid das mein Problem so überhaupt nicht eingegrenzt ist aber ich weis halt echt nicht wie ich das machen soll. hab zwar schon folgendes Probiert:

    for (Spalte = 0, Zeile = 0; Spalte <= 6 && Zeile <= 5; Spalte++, Zeile++)
            {   
            if(Feld [Zeile][Spalte]=='x')//bzw # für den anderen Spieler
                        {
                        Counter++;        
                        }
                        else
                            {
                            Counter = 0;
                            }
                if (Counter == 4)
                   {
                   return 1;
                   }
            }
    

    aber das kontrolliert halt nur von ganz oben rechts an....

    Ich hoffe ihr könnt mir irgendwie helfen.

    MfG.: Jörn G.



  • Ich meinte das geht halt nur von ganz oben Links an....



  • Ohne deinen Code angesehen zu haben ein kleiner Tipp: Du brauchst nicht das gesamte Feld zu durchsuchen sondern nur die Geraden und Diagonalen des letzten gesetzten Steins.



  • int KontrolleDiagonal()
    {
    	for(int Spalte=0; Spalte<=6; Spalte++)
    	{
    		for(int Zeile=0; Zeile<=5; Zeile++)
    		{
    			int Counter=0;
    
    			for(int x=Spalte, y=Zeile; x<=6 && y<=5; x++, y++) //nach rechts unten
    			{
    				if(Feld[y][x]=='x')
    				{
    					Counter++;
    				}
    			}
    			if(Counter>=4)
    				return 1;
    
    			Counter=0;
    			for(int x=Spalte, y=Zeile; x>=0 && y<=5; x--, y++) //nach links unten
    			{
    				if(Feld[y][x]=='x')
    				{
    					Counter++;
    				}
    			}
    			if(Counter>=4)
    				return 1;
    		}
    	}
    
    	return 0;
    }
    

    Sollte so gehen. Du gehts einfach alle Felder durch und prüfst dabei von jedem aus nach links und rechts diagonal. Mag nicht die effizienteste Lösung sein aber es ist eine 😃

    Und nur mal so als Tipp, du solltest den Kontrollcode in eine extra Methode packen und ihr beim Aufrufen sagen welcher Spieler es ist und auf welches Zeichen geprüft wird, dann hast du den ganzen Kontrollcode nicht doppelt 😉


Anmelden zum Antworten