Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

31.05.2013, 21:28

c++ Tic Tac Toe problem "Feld ist schon besetzt"

hallo,
bin neu hier im forum.
habe einmal ein problem mit meinem c++ konsolen Tic tac toe und zwar weiß ich nicht wie ich das machen soll dass eine error nachricht kommt und der spieler nochmal wählen darf wenn ein feld bereits besetzt ist...
Mein code:

C-/C++-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
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
/*Tic Tac Toe © */

#include <iostream>
#include <string>

using namespace std;

//Prototypenliste
void drawSpaces();
void drawField();
void Error (string msg);
void checkForWinner();
void checkBusyFields();
//Globale Variablen
char cNumb[10] = {'0','1','2','3','4','5','6','7','8','9'};
int playerTurn = 1;
bool gameOver = false;
bool busyFields =false;
int Winner = 0;
int select = 0;

//Hauptprogramm
int main()
{   
     
     //lokale Variablen 
     char nochmal;

     do 
     {      
           system("cls");
        cout << "\n\n\n\n\n";
           //Feld zeichnen
        drawField();
        cout << "\n\n\n\n\n";
            
        
        cout << "Spieler " << playerTurn << " ist am Zug! Bitte Zahl eingeben. ";
        cin >> select;

        //Error
        if(select < 0 || select > 9)
        {
               cout << endl;
            Error("Falsche Eingabe, erneut eingeben");
        }
          //Felder setzen
          if(playerTurn == 1)
          {
            cNumb[select] = 'X';
          }
          else if(playerTurn == 2)
          {
            cNumb[select] = 'O';
          }

          checkBusyFields();
        checkForWinner();
          if(playerTurn == 1)
        {
            playerTurn = 2;
          }
          else 
          {
            playerTurn = 1;   
          }
            
     } while(gameOver != true && busyFields != true);

     drawSpaces();
     cout << "Spieler " << Winner << " hat gewonnen!!";
     cout << endl;
     cout << "moechten sie erneut spielen ? (j/n) ";
     cin >> nochmal;
    if(nochmal == 'j')
     {
        exit(0);
     }
     else if(nochmal == 'n')
     {
        exit(0);
     }

     system("pause");
     return 0;
}
/*Funktionen */

//Feld zeichnen
void drawField()
{
    drawSpaces();
    cout << cNumb[1] << " | " << cNumb[2] << " | " << cNumb[3] << endl; 
    cout << endl;
    drawSpaces();
    cout << "- + - + - " << endl;
    cout << endl;
    drawSpaces();
    cout << cNumb[4] << " | " << cNumb[5] << " | " << cNumb[6] << endl;
    cout << endl;
    drawSpaces();
    cout << "- + - + - "<< endl;
    cout << endl;
    drawSpaces();
    cout << cNumb[7] << " | " << cNumb[8] << " | " << cNumb[9] << endl;

}
// Überprüfung, ob Feld besetzt ist
void checkBusyFields()
{
    if(cNumb[select] == 'X' || cNumb[select] == 'O')
    {
      
       cout << "----------------------------------------------" << endl;
       cout << " spielfeld ist besetzt. bitte anderes waehlen!" << endl;
       cout << "----------------------------------------------" << endl;

       system("pause");

    }
    
}   
//Leerzeichen zur Zentrierung des Spielfeldes
void drawSpaces()
{
    cout << "                           "; 

}
//Errormessage
void Error (string msg)
{
    cout << msg << endl;

}
//Gewinner Check
void checkForWinner()
{
    if(cNumb[1] == 'X' && cNumb[2] == 'X' && cNumb[3] == 'X' ||
       cNumb[1] == 'O' && cNumb[2] == 'O' && cNumb[3] == 'O')
       {
       Winner = playerTurn;
       gameOver = true;
       }
    if(cNumb[4] == 'X' && cNumb[5] == 'X' && cNumb[6] == 'X' ||
       cNumb[4] == 'O' && cNumb[5] == 'O' && cNumb[6] == 'O')
       {
       Winner = playerTurn;
       gameOver = true;
       }
    if(cNumb[7] == 'X' && cNumb[8] == 'X' && cNumb[9] == 'X' ||
       cNumb[7] == 'O' && cNumb[8] == 'O' && cNumb[9] == 'O')
       {
       Winner = playerTurn;
       gameOver = true;
       }
    if(cNumb[1] == 'X' && cNumb[4] == 'X' && cNumb[7] == 'X' ||
       cNumb[1] == 'O' && cNumb[4] == 'O' && cNumb[7] == 'O')
       {
       Winner = playerTurn;
       gameOver = true;
       }
    if(cNumb[3] == 'X' && cNumb[5] == 'X' && cNumb[7] == 'X' ||
       cNumb[3] == 'O' && cNumb[5] == 'O' && cNumb[7] == 'O')
       {
       Winner = playerTurn;
       gameOver = true;
       }
    if(cNumb[1] == 'X' && cNumb[5] == 'X' && cNumb[9] == 'X' ||
       cNumb[1] == 'O' && cNumb[5] == 'O' && cNumb[9] == 'O')
       {
       Winner = playerTurn;
       gameOver = true;
    }
    if(cNumb[2] == 'X' && cNumb[5] == 'X' && cNumb[8] == 'X' ||
       cNumb[2] == 'O' && cNumb[5] == 'O' && cNumb[8] == 'O')
       {
       Winner = playerTurn;
       gameOver = true;
    }
    if(cNumb[3] == 'X' && cNumb[6] == 'X' && cNumb[9] == 'X' ||
       cNumb[3] == 'O' && cNumb[6] == 'O' && cNumb[9] == 'O')
       {
       Winner = playerTurn;
       gameOver = true;
       }
    
}

habe bereits eine funktion checkBusyFields erstellt allerdings weiß ich nicht wie ich die !wirkungsvoll! einsetze wenn ich sie einfach in die main reinschreib ploppt die nachricht einfach immer kurz auf und verschwindet dann wieder
hoffe mir kann da einer helfen, stehe bei dieser sache irgendwie total auf dem schlauch ..
thx

2

31.05.2013, 22:05

Du hast da einen Logik-Fehler :D
Ich hab mir das jetzt nicht ganz genau angeguckt, aber so wie's aussieht wird zuerst 'X' oder '0' gesetzt und DANN geprüft, ob das Feld vergeben ist...

FSA

Community-Fossil

  • Private Nachricht senden

3

31.05.2013, 22:53

Als erste solltest du

C-/C++-Quelltext

1
2
3
4
5
6
 //Error
        if(select < 0 || select > 9)
        {
               cout << endl;
            Error("Falsche Eingabe, erneut eingeben");
        }

durch

C-/C++-Quelltext

1
2
3
4
5
6
7
 //Error
        if(select < 0 || select > 9)
        {
               cout << endl;
            Error("Falsche Eingabe, erneut eingeben");
            continue;
        }

ersetzen.

Und wie schon gesagt die Abfrage vor dem Setzen des "Steins" schreiben. Du solltest außerdem prüfen, ob das Feld schon besetzt war, und wenn ja die Schleife von vorne beginnen.

Zitat

Der RCCSWU (RandomCamelCaseSomtimesWithUndersquare) Stil bricht auch mal mit den veraltet strukturierten Denkmustern und erlaubt dem Entwickler seine Kreativität zu entfalten.

patrick246

Treue Seele

Beiträge: 328

Wohnort: nahe Heilbronn/BW

Beruf: TG Profil Informatik-Schüler

  • Private Nachricht senden

4

31.05.2013, 22:57

1. Wie schon oben geschrieben sollte man VOR dem setzen überprüfen, ob das Feld schon besetzt ist.
2. Man muss entsprechend darauf reagieren. Deine Funktion gibt einfach eine Meldung aus und macht dann einfach weiter. Du könntest die Funktion einen Wert zurückgeben lassen, abhängig davon setzt du dann das Feld oder eben nicht.

Ungefähr so:

C-/C++-Quelltext

1
2
3
4
bool isFieldAlreadySet(int selection)
{
    return (cNumb[selection] == 'X' || cNumb[selection] == 'O');
}


C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
/* ... */

if(isFieldAlreadySet(select))
{
    cNumb[select] = (select == 1) ? 'X' : 'O';
    checkForWinner();
    playerTurn = (playerTurn == 1) ? 2 : 1;

} else {
    std::cout << "Feld bereits belegt" << std::endl;
}

/* ... */

Swoerm

Alter Hase

Beiträge: 451

Wohnort: 127.0.0.1

  • Private Nachricht senden

5

31.05.2013, 23:42

Kann es sein das dein Quellcode aus einem YouTueb Tutorial stammt?
Ich hab vor grob einem 3/4 Jahr mir eins über TicTacToe angeschaut und es war so ziemlich der gleiche Quellcode wie der von dir.

C-/C++-Quelltext

1
2
    /* Keep the compiler happy */
    return(0);

6

01.06.2013, 00:24

Als erste solltest du

C-/C++-Quelltext

1
2
3
4
5
6
 //Error
if(select < 0 || select > 9)
{
cout << endl;
Error("Falsche Eingabe, erneut eingeben");
}

durch

C-/C++-Quelltext

1
2
3
4
5
6
7
 //Error
if(select < 0 || select > 9)
{
cout << endl;
Error("Falsche Eingabe, erneut eingeben");
continue;
}

ersetzen.

Und wie schon gesagt die Abfrage vor dem Setzen des "Steins" schreiben. Du solltest außerdem prüfen, ob das Feld schon besetzt war, und wenn ja die Schleife von vorne beginnen.
Ja sorry ist mir auch vorher aufgefallen das war natürlich nicht beabsichtigt, dass nach dem feld setzen geprüft wird ob ein feld besetzt ist .. völliger schwachsinn natürlich sorry war nicht beabsichtigt

Kann es sein das dein Quellcode aus einem YouTueb Tutorial stammt?
Ich hab vor grob einem 3/4 Jahr mir eins über TicTacToe angeschaut und es war so ziemlich der gleiche Quellcode wie der von dir.
Nö, habe mir mehrere Youtube tutorials angeschaut (meist auch nur code angeschaut) und ein paar quellcodes zu c++ tic Tac Teo gelesen, einfach mal um ein "bild" von diesem tice tac toe-programm zu bekommen.
Dachtest wahrscheinlich weil ich ein paar funktionsnamen aus nem Youtube tut genommen hab, ja weil ich sie passend fand und wieso sollte ich mir dann nen andren ausdenken wenn mir der gefällt ? ich machs gern einfach
Den Code den ich hier gepostet hab habe ich 100% selbständig aufgesetzt ohne videovorlage oder sowas. Programmiere erst seit ca 2 wochen c++ daher bin ich auch neu in dem forum und verzeiht mir wenn sich noch der ein oder andere fehler bei mir einschleicht mache das auch eher hobbymässig.

LG

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Ferox« (01.06.2013, 00:34)


FSA

Community-Fossil

  • Private Nachricht senden

7

01.06.2013, 00:44

Zitat von »Ferox«


Ja sorry ist mir auch vorher aufgefallen das war natürlich nicht beabsichtigt, dass nach dem feld setzen geprüft wird ob ein feld besetzt ist .. völliger schwachsinn natürlich sorry war nicht beabsichtigt

Mein Post war keinesfalls böse gemeint ;) Solange du die Fehler erkennst und bereit bist zu lernen, wird hier keiner böse.

Zum Thema YouTube: Ein TicTacToe Programm kann ja vom Kern her nicht komplett verschieden sein. Also ein wenig Ähnlichkeit ist immer vorhanden. ;)

Zitat

Der RCCSWU (RandomCamelCaseSomtimesWithUndersquare) Stil bricht auch mal mit den veraltet strukturierten Denkmustern und erlaubt dem Entwickler seine Kreativität zu entfalten.

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »FSA« (01.06.2013, 15:20)


8

01.06.2013, 14:42

Zitat von »Ferox«


Ja sorry ist mir auch vorher aufgefallen das war natürlich nicht beabsichtigt, dass nach dem feld setzen geprüft wird ob ein feld besetzt ist .. völliger schwachsinn natürlich sorry war nicht beabsichtigt

Mein Post war keinesfalls böse gemeint ;) Solange du die Fehler erkennst und bereit bist zu lernen, wird hier keiner Böse.

Zum Thema YouTube: Ein TicTacToe Programm kann ja vom Kern her nicht komplett verschieden sein. Also ein wenig Ähnlichkeit ist immer vorhanden. ;)
Ja weiß dass du das nicht böse gemeint hast, ich war über meinen eigenen fehler ein wenig erzürnt und nicht über deinen post^^
youtube videos sind ja da um angeschaut zu werden und wie du schon sagtest ist immer ein wenig ähnlichkeit bei tic tac toe spielen ist fast immer vorhanden und wie in meinem vorigen post gesagt habe ich den code hier selbst geschrieben ohne irgendeine vorlage.
btw habs hinbekommen mit dem besetzten feld.
LG

Werbeanzeige