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

11

04.07.2011, 21:48

/

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »E333« (02.09.2021, 04:08)


12

04.07.2011, 22:01

So, nochmal alles verbessert eingerückt, puh :D

Zitat

Game over mit false initialisieren sollte helfen ;)
Hilft leider auch nicht :(

E: Sehe jetzt erst den Edit von Harry222, naja dann hab ich noch einiges zu tun :whistling:

Harry222

Alter Hase

Beiträge: 864

Beruf: Student

  • Private Nachricht senden

13

04.07.2011, 22:05

Hab gerade deinen Quelltext mal selbst kompiliert! Hab da oben auch noch ein paar Fehler drin!
Ich schicken den funktionierenden Quelltext in 2 min.! ;)

Mfg Harry222

Harry222

Alter Hase

Beiträge: 864

Beruf: Student

  • Private Nachricht senden

14

04.07.2011, 22:11

So hats bei mir funktioniert:

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
#include <iostream>
using namespace std;


int GameTurn();

void ZeichneSpielfeld(char Spielfeld[]);

int main() {
    char Spielfeld[] = {'0','1','2','3','4','5','6','7','8'};  
    
    ZeichneSpielfeld(Spielfeld);
    
    GameTurn();
}

int GameTurn() 
{
    char Spielfeld[] = {'0','1','2','3','4','5','6','7','8'};
    char Index = '0';
    bool GameOver = false;
    char PlayerMark = 'O';

    for (int Turn = 1; Turn < 10 && GameOver == false; ++Turn)// allgemener Spielzug,zählt den aktuellen Zug
    {
         
        if ( Turn % 2 == 0 ) 
        { 
            PlayerMark = 'O';
        } 
        else {
            PlayerMark = 'X';//bestimmt welcher Spieler an der Reihe ist
        }

        bool Wiederhole = true;
        while(Wiederhole != false){
            cin >> Index; // nimmt die Eingabe des Spielers an; Spieler X beginnt, dann folgt Spieler O

            if (Spielfeld[(int)(Index - 48)] != 'O' && Spielfeld[(int)(Index - 48)] != 'X')
            {
                Spielfeld[(int)(Index - 48)] = PlayerMark; //prüft ob das Feld noch frei ist wenn ja wird es besetzt
                Wiederhole = false;
            }
        }

        if (Spielfeld[0] == Spielfeld[1] && Spielfeld[1] == Spielfeld[2]
        ||  Spielfeld[0] == Spielfeld[3] && Spielfeld[3] == Spielfeld[6]
        ||  Spielfeld[8] == Spielfeld[7] && Spielfeld[7] == Spielfeld[6]
        ||  Spielfeld[8] == Spielfeld[5] && Spielfeld[5] == Spielfeld[2]
        ||  Spielfeld[4] == Spielfeld[0] && Spielfeld[0] == Spielfeld[8]
        ||  Spielfeld[4] == Spielfeld[2] && Spielfeld[2] == Spielfeld[6]
        ||  Spielfeld[4] == Spielfeld[3] && Spielfeld[3] == Spielfeld[5]
        ||  Spielfeld[4] == Spielfeld[1] && Spielfeld[1] == Spielfeld[7])//prüft ob eine Gewinnbedingung erfüllt wurde
        { 
            GameOver = true;
        }

        ZeichneSpielfeld(Spielfeld);
    }   
    
    if (GameOver == true) {
        cout << "Player " << PlayerMark << "wins" << endl; // zeigt den Spieler am Zug als Gewinner an
    }

    return 0;
}

void ZeichneSpielfeld(char Spielfeld[]){
    char s1 = '|';
    char s2 = '-';
    char p  = '+';

    // Aufbau des Spielfeldes
    cout << "\n" << Spielfeld[0] << s1 << Spielfeld[1] << s1 << Spielfeld[2] << endl;
    cout << s2 << p << s2 << p << s2 << endl;
    cout << Spielfeld[3] << s1 << Spielfeld[4] << s1 << Spielfeld[5] << endl;
    cout << s2 << p << s2 << p << s2 << endl;
    cout << Spielfeld[6] << s1 << Spielfeld[7] << s1 << Spielfeld[8] << endl;
}


Falls du Fragen hast, dann frag! ;)

EDIT:
Ich glaube, du solltest dich auch noch mal ein bisschen mit den C++-Grundlagen beschäftigen!
Das waren einfach viele logische und "unnötige" Fehler!
In Zeile 47 und 49 deines Aktualisierten Codes hättest du die beiden if-Abfragen einfach zusammennehmen können! sin eben auch teilweise so Schönheitsfehler! ;)

Mfg Harry222

Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »Harry222« (05.07.2011, 07:23)


15

04.07.2011, 22:18

Puh,vielen dank erstmal :)

Ich versuch erstmal das ganze zu verstehen und umzusetzen :D .

Harry222

Alter Hase

Beiträge: 864

Beruf: Student

  • Private Nachricht senden

16

04.07.2011, 22:20

Funktioniert es denn jetzt?

Ich versuch erstmal das ganze zu verstehen und umzusetzen
Wie gesagt: Wenn du Fragen hast, frag!

Mfg Harry222

17

04.07.2011, 22:49

Eine hätt ich da auf jeden Fall :D

Und zwar:
Spielfeld[(int)(Index - 48)

(int) formt den Char in eine Integer Zahl um, richtig?
Was aber bedeuten die 48?

Ansonsten kommen da bis morgen abend bestimmt noch ein paar dazu :P

NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

Beruf: (Nachhilfe)Lehrer (Mathematik, C++, Java, C#)

  • Private Nachricht senden

18

04.07.2011, 22:57

C-/C++-Quelltext

1
char Index = 'O';

ist falsch und Index sollte erst zwischen Zeile 36 und 37 Definiert und muss nicht initialisiert werden.

C-/C++-Quelltext

1
Spielfeld[Index - '0']

das wäre etwas schöner und verständlicher.
'0' ist in der Ascii Tabelle die 48 ;)
Lies dir vielleicht nochmal das Kapitel mit den Strings durch und lass dir mal 'X' und static_cast<int>('X') ausgeben.

Ausserdem solltest du für Playermark 'O' benutzen.

Die Gewinnbedingung funktioniert so ganz ohne Klammern? oO
"Der erste Trunk aus dem Becher der Erkenntnis macht einem zum Atheist, doch auf dem Grund des Bechers wartet Gott." - Werner Heisenberg
Biete Privatunterricht in Berlin und Online.
Kommt jemand mit Nach oMan?

Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »NachoMan« (05.07.2011, 02:05)


Harry222

Alter Hase

Beiträge: 864

Beruf: Student

  • Private Nachricht senden

19

05.07.2011, 07:20

muss nicht initialisiert werden.
ich habe mir angewöhntalle Variablen mit irgendeinem Standardwert zu initalisieren!
Du hast doch bestimmt gesehen, dass das nicht Initalisieren bei der GameOver-Variable einer der großen Fehler war, weil GameOver so nach dem 1. Durchlauf eventuell noch keinen Wert hatte. :P
Ich mach das eigentlich immer und kann so solche Fehler ausschließen! :D

Und stimmt...
Index sollte vllt. mit '0' oder '1' oder so initalisiert werden! :whistling:
Habs oben korrigiert!

Mfg Harry222

NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

Beruf: (Nachhilfe)Lehrer (Mathematik, C++, Java, C#)

  • Private Nachricht senden

20

05.07.2011, 14:16

Index sollte vllt. mit '0' oder '1' oder so initalisiert werden! :whistling:

nein, mit 0 ! XD
Aber mal ehrlich. Wo liegt der unterschied (abgesehen von der Performance) zwischen "irgendeinem (nicht Sinnvollen) Wert" den du bestimmst und einem quasi zufälligen Wert, der vom Speicher bestimmt wird und deshalb auch nicht sinnvoll ist?
Die Variable einfach so spät wie möglich Definieren, dann sieht man die fehlende Initialisierung wenn man die Variable benutzt und kann den Fehler einfacher beheben, wenn es nötig ist. Vorallem denkt man bei einer fehlenden Initialisierung eher daran, dass dort der Fehler liegen könnte. Wenn du mit einem nicht sinnvollen Wert initialisierst könnte man eher denken, das damit alles in Ordnung ist. ;)
In dem Fall wäre der richtige Ort für die Definition der Variable, wie schon erwähnt, zwischen Zeile 36 und 37.

Der unterschied zur GameOver-Variable ist, dass der Index direkt nach dem Definieren beschrieben und erst danach Gelesen wird, GameOver wurde hingegen erst gelesen.
"Der erste Trunk aus dem Becher der Erkenntnis macht einem zum Atheist, doch auf dem Grund des Bechers wartet Gott." - Werner Heisenberg
Biete Privatunterricht in Berlin und Online.
Kommt jemand mit Nach oMan?

Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von »NachoMan« (05.07.2011, 14:31)


Werbeanzeige