C++ Drei Gewinnt programmieren.

Jennifer_x

Newbie
Registriert
März 2020
Beiträge
6
Hei, liebes Forum!

Ich habe mir vorgenommen programmieren zu lernen. Ich habe mir als Aufgabe gestellt, einfach mal "Drei gewinnt" zu programmieren. Irgendwie läuft das nicht so wie ich das möchte. Wenn ich z.B. zwei mache, dann packt er nur ein Kreis in ein Feld.
Und ich weiß, wie ich das mache, dass die Spieler abwechselnd eingeben.






C++:
#include <iostream>
#include <stdlib.h>
#include <time.h>

using namespace std;

char dasFeld[12];

void field()
{
    cout << "\n\n\n"
        << "   |" << dasFeld[1] << "  |" << dasFeld[2] << "  |" << dasFeld[3] << "  |" << endl
        << "   |---|---|---|" << endl
        << "   |" << dasFeld[4] << "  |" << dasFeld[5] << "  |" << dasFeld[6] << "  |" << endl
        << "   |---|---|---|" << endl
        << "   |" << dasFeld[7] << "  |" << dasFeld[8] << "  |" << dasFeld[9] << "  |" << endl
        << "   |---|---|---|" << endl
        << "   |" << dasFeld[10] << "  |" << dasFeld[11] << "  |" << dasFeld[12] << "  |" << endl
        << "   |---|---|---|" << endl;
    
}

void resetField()
{
    for (int i = 1; i < 12; i++)
        dasFeld[i] = ' ';
}

void checkWin();

void multiplayer()
{
    
    while (true) {
        field();
        char input = ' ';
        cout << "Gebe eine Zahl zwischen 1 und 3 an!";
        cin >> input;

        if (input = '1')
        {
            dasFeld[10] = 'O';
        }
        else if (input = '2')
        {
            dasFeld[11] = 'O';
        }
        else if (input = '3')
        {
            dasFeld[12] = 'O';
        }
    
    } checkWin();

    
}

char inputKeypad();


void checkWin()
{
    if (dasFeld[1] && dasFeld[2] && dasFeld[3] == 'O' || dasFeld[4] && dasFeld[5] && dasFeld[6] == 'O' || dasFeld[7] && dasFeld[8] && dasFeld[9] == 'O' || dasFeld[10] && dasFeld[11] && dasFeld[12] == 'O' || dasFeld[1] && dasFeld[4] && dasFeld[7] == 'O' || dasFeld[4] && dasFeld[7] && dasFeld[10] == 'O' || dasFeld[11] && dasFeld[8] && dasFeld[5] == 'O' || dasFeld[8] && dasFeld[5] && dasFeld[2] == 'O' || dasFeld[12] && dasFeld[9] && dasFeld[6] == 'O' || dasFeld[3] && dasFeld[6] && dasFeld[9] == 'O')
    {
        cout << "\nPlayer1 hat das Spiel gewonnen.";
    }
    else if (dasFeld[1] && dasFeld[2] && dasFeld[3] == 'X' || dasFeld[4] && dasFeld[5] && dasFeld[6] == 'X' || dasFeld[7] && dasFeld[8] && dasFeld[9] == 'X' || dasFeld[10] && dasFeld[11] && dasFeld[12] == 'X' || dasFeld[1] && dasFeld[4] && dasFeld[7] == 'O' || dasFeld[4] && dasFeld[7] && dasFeld[10] == 'X' || dasFeld[11] && dasFeld[8] && dasFeld[5] == 'X' || dasFeld[8] && dasFeld[5] && dasFeld[2] == 'X' || dasFeld[12] && dasFeld[9] && dasFeld[6] == 'X' || dasFeld[3] && dasFeld[6] && dasFeld[9] == 'X')
    {
        cout << "\nPlayer2 hat das Spiel gewonnen.";
    }
    
}

void singleplayer()
{

}

void RunMenu()
{
    
        char input;
        cout << "\n\n"
            << "WILLKOMMEN IM MENU VON DREI GEWINNT!" << endl
            << "Waehle bitte aus, welchen Modus du spielen moechtest!" << endl
            << "1. Singleplayer" << endl
            << "2. Multiplayer" << endl
            << "3. Quit" << endl
            << "Input: ";
        cin >> input;
        if (input == '1') {
            singleplayer();
        }
        else if (input == '2') {
            multiplayer();
        }
        else
            return;  
}

int main()
{
    RunMenu();
    cout << endl << endl;
    system("PAUSE");

    return 0;

}
 
Ein Fehler der mir so ins Auge sticht ist der Folgende:

Zeile: 40 multiplayer() Function:
if (input == '1')

und die anderen if abfragen natürlich auch
 
Ahh ja, stimmt danke dir. Hast du vielleicht eine Idee, wie ich das machen kann, dass zuerst der erste Spieler eingibt, dann der zweite Spieler, also das ist immer abwechselnd ist.

Und dann muss ich irgendwie noch reinbekommen, dass wenn etwas in feld[11] ist, das er es automatisch ins obige Feld macht. (das gleiche dann auch für die anderen Felder)
 
Jennifer_x schrieb:
Ahh ja, stimmt danke dir. Hast du vielleicht eine Idee, wie ich das machen kann, dass zuerst der erste Spieler eingibt, dann der zweite Spieler, also das ist immer abwechselnd ist.

Ist jetzt keine schöne Lösung aber für deinen vorhanden Code könntest du es ungefähr so machen:

C++:
while (true) {
        field();
        char input = ' ';
        cout << "Gebe eine Zahl zwischen 1 und 3 an!";
        cin >> input;

        if (input = '1')
        {
            dasFeld[10] = 'O';
        }

        else if (input = '2')
        {
            dasFeld[11] = 'O';
        }

        else if (input = '3')
        {
            dasFeld[12] = 'O';
        }

        if(checkWin() == true){
            break;
        }    

        field();
        input = ' ';
        cout << "Gebe eine Zahl zwischen 1 und 3 an!";
        cin >> input;

        if (input = '1')
        {
            dasFeld[10] = 'X';
        }

        else if (input = '2')
        {
            dasFeld[11] = 'X';
        }

        else if (input = '3')
        {
            dasFeld[12] = 'X';
        }

        if(checkWin() == true){
            break;
        }
    }

Den part dann noch in eine externe Funktion auslagern der überprüft welche Felder schon belegt sind und die entsprechend belegt.
Code:
        if (input = '1')
        {
            dasFeld[10] = 'O';
        }

        else if (input = '2')
        {
            dasFeld[11] = 'O';
        }

        else if (input = '3')
        {
            dasFeld[12] = 'O';
        }
 
Übrigens hat C++ 0-basierte Indizes, auf den ersten Eintrag in einem Array greift man also mit
Code:
Feld[0]
zu, auf den 12. mit
Code:
Feld[11]
Es würde sich anbieten, für das Spielfeld ein zweidimensionales Array zu verwenden, macht die Sache evtl. etwas übersichtlicher. Du solltest dir außerdem nochmal abseits vom Code die Programmlogik durchdenken. Z.B. würdest du dann nicht ein bestimmtes Feld füllen, sondern den nächsten freien Platz in einer Spalte füllen. Vielleicht hilft es auch, wenn du vorher nochmal ein paar grundlegendere Programmierbeispiele anhand eines Buchs durcharbeitest.
Im Netz dürfte es wahrscheinlich bereits genügend Beispiele zu 4 gewinnt geben. Als Übung ist es aber vermutlich nicht verkehrt, sich das zunächst selbst zu überlegen.
 
Das Ding ist einfach, ich habe immer so die Idee, wie ich das mache. Aber es umzusetzen, ist bei mir das schwere. ^^

Kannst du mir ein Buch empfehlen?
 
Ne, hab da jetzt keines speziell im Kopf. Letztlich hat jeder auch andere Vorlieben. Vielleicht ist ja hier der ein oder andere nützliche Link dabei.
Ansonsten kannst du konkrete Fragen natürlich immer auch posten. Der Thread hier ist ja ziemlich allgemein gehalten. Da könnte man dir jetzt natürlich eine fertige Lösung präsentieren, aber das wird dir vermutlich wenig bringen, zumal es das ja, wie gesagt, sowieso schon im Netz gibt.
 
Jennifer_x schrieb:
Und dann muss ich irgendwie noch reinbekommen, dass wenn etwas in feld[11] ist, das er es automatisch ins obige Feld macht. (das gleiche dann auch für die anderen Felder)

Wenn deine Felder so angeordnet sind:
Code:
0  1  2
3  4  5
6  7  8
9  10 11
dann ist eine Reihe 3 lang, dementsprechend kannst du z.B. so ein freies Feld finden
C++:
int freeFieldInColumn(int currentField)
{
    // Eine Reihe ist 3 lang.
    const int ONE_ROW = 3;
 
    // Solange das aktuelle Feld nicht "frei" ist...
    while (dasFeld[currentField] != ' ')
    {
        // ...gehe eine Reihe nach oben.
        currentField -= ONE_ROW;

        // Wenn Feld nun außerhalb ist gebe -1 zurück (Kein freies Feld in dieser Spalte)
        if (currentField < 0)
            return -1;
    }

    // currentField ist jetzt freies Feld in Spalte
    return currentField;
}

multiplayer() könnte dann etwa so aussehen:
C++:
void multiplayer()
{
    // Das hat bei dir auch gefehlt
    resetField();

    while (true) {
        field();
        char input = ' ';
        cout << "Gebe eine Zahl zwischen 1 und 3 an!";
        cin >> input;

        int choiceField = 0;
        if (input == '1')
        {
            choiceField = 9;
        }
        else if (input == '2')
        {
            choiceField = 10;
        }
        else if (input == '3')
        {
            choiceField = 11;
        }

        // Ungültige Auswahl!
        if (choiceField == 0)
        {
            cout << "Nur 1, 2 oder 3 erlaubt!";
            continue;
        }

        choiceField = freeFieldInColumn(choiceField);

        // Fehlerfall behandeln
        if (choiceField == -1)
        {
            cout << "Kein freies Feld in Spalte!";
            continue;
        }

        dasFeld[choiceField] = 'O';

        checkWin();
    }
}
Edit: Das ist natürlich weiterhin ohne Wechsel der Spieler, und soll nur zeigen wie das mit dem Finden von freien Feldern funktionieren kann, und es ignoriert auch, dass resetField() und checkWin() ohne Anpassungen nicht richtig funktionieren (Arrayindices und fehlende Tests mit ==) :)
 
Zuletzt bearbeitet:
Zurück
Oben