Niechciane nadanie wartości elementów tablicy

0

Problem: podczas każdej rundy po pierwszej, w ostatnim elemencie tablicy odpowiedzialnej za przechowywanie stanu planszy kółko-krzyżyk raz wpisuje się kolko, a raz krzyżyk (jednocześnie ze zmieniającym się polem wg. wyboru gracza).
Co mam w kodzie źle?

klasa.h


#ifndef KLASA_H_INCLUDED
#define KLASA_H_INCLUDED
#include <string>
#include <iostream>

enum RUCH {KOLKO=10, KRZYZYK=1, PUSTE=0};
enum GRACZE{GKOLKO, GKRZYZYK};
//class CGra;

class CGra
{
private:
    RUCH Rplansza[9];
    GRACZE aktualny;
public:
    void pokaz_plansze();
    void pokaz_tablice();
    void czysc_plansze();
    char zamien(int r);
    void zmiana_gracza();
    void wybor_pola();
    void popros_o_ruch();
    void losowanie_gracza();
};

class CGracz
{
private:
std::string nazwa;
public:
void podaj_nazwe();
void wyswietl_nazwe();
};

#endif // KLASA_H_INCLUDED

klasa.cpp

#include "klasa.h"

char CGra::zamien(int r)
{
    if (Rplansza[r]==PUSTE)
        return ' ';
    if (Rplansza[r]==KRZYZYK)
        return 'X';
    if (Rplansza[r]==KOLKO)
        return 'O';
    else
        return 'u';
};

void CGra::pokaz_plansze()
{
    std::cout<<std::endl;
    std::cout<<"  "<<Rplansza[1]<<" | "<<Rplansza[2]<<" | "<<Rplansza[3]<<std::endl;
    std::cout<<"  "<<"--+---+--"<<std::endl;
    std::cout<<"  "<<Rplansza[4]<<" | "<<Rplansza[5]<<" | "<<Rplansza[6]<<std::endl;
    std::cout<<"  "<<"--+---+--"<<std::endl;
    std::cout<<"  "<<Rplansza[7]<<" | "<<Rplansza[8]<<" | "<<Rplansza[9]<<std::endl;
};

void CGra::pokaz_tablice()
{
    std::cout<<std::endl;
    std::cout<<"  "<<zamien(1)<<" | "<<zamien(2)<<" | "<<zamien(3)<<std::endl;
    std::cout<<"  "<<"--+---+--"<<std::endl;
    std::cout<<"  "<<zamien(4)<<" | "<<zamien(5)<<" | "<<zamien(6)<<std::endl;
    std::cout<<"  "<<"--+---+--"<<std::endl;
    std::cout<<"  "<<zamien(7)<<" | "<<zamien(8)<<" | "<<zamien(9)<<std::endl;
};

void CGracz::podaj_nazwe()
{
    std::cin>>nazwa;
};

void CGracz::wyswietl_nazwe()
{
    std::cout<<nazwa;
};

void CGra::czysc_plansze()
{
    for(int q=0; q<=9; q++)
        Rplansza[q]=PUSTE;
}

void CGra::zmiana_gracza()
{
    if (aktualny==GKRZYZYK)
        aktualny=GKOLKO;
    else
        aktualny=GKRZYZYK;
    std::cout<<"aktualny gracz: "<<aktualny<<std::endl;
};

void CGra::wybor_pola()
{
    int numer=0;
    std::cin>>numer;
    if (aktualny==GKRZYZYK)
        Rplansza[numer]=KRZYZYK;
    if (aktualny==GKOLKO)
        Rplansza[numer]=KOLKO;
    std::cout<<"numer: "<<numer<<std::endl;
};

void CGra::losowanie_gracza()
{
    aktualny=GKOLKO;
};
void CGra::popros_o_ruch()
{
    std::cout<<aktualny<<": Podaj numer pola"<<std::endl;
};

main.cpp


#include "klasa.h"
#include <iostream>

int main()
{
    std::cout<<"Kolko i krzyzyk v1"<<std::endl;
    std::cout<<"Menu:"<<std::endl;
    std::cout<<"1. Czlowiek vs czlowiek "<<std::endl;
    std::cout<<"2. Czlowiek vs komputer"<<std::endl;
    std::cout<<"3. Wyjscie"<<std::endl;
    int start_odpowiedz;
    std::cin>>start_odpowiedz;
    switch(start_odpowiedz)
    {
        case 1:
            {
            CGra CPgra;
            CGracz gracz1;
            CGracz gracz2;

            std::cout<<"Podaj nazwe dla gracza 1:"<<std::endl;
            gracz1.podaj_nazwe();
            std::cout<<"Podaj nazwe dla gracza 2:"<<std::endl;
            gracz2.podaj_nazwe();
            CPgra.czysc_plansze();
            CPgra.pokaz_plansze();
            CPgra.losowanie_gracza();
            while(true)
            {
                CPgra.popros_o_ruch();
                CPgra.wybor_pola();
                CPgra.pokaz_plansze();
                CPgra.pokaz_tablice();
                CPgra.zmiana_gracza();
            };
            break;
            }
        case 2:
            std::cout<<"Jeszcze nie obslugiwane."<<std::endl;
            break;
        case 3:
            std::cout<<"Jeszcze nie obslugiwane."<<std::endl;
            break;

    }

}
1
phob0s napisał(a)
void CGra::czysc_plansze()
{
for(int q=0; q<=9; q++)
Rplansza[q]=PUSTE;
}

Wyjeżdżasz poza zakres, Rplansza ma 9 elementów, a Ty podstawiasz do elementu 10 (Rplansza[9] = PUSTE).

Tak samo tutaj:

phob0s napisał(a)
void CGra::pokaz_plansze()
{
std::cout<<std::endl;
std::cout<<"  "<<Rplansza[1]<<" | "<<Rplansza[2]<<" | "<<Rplansza[3]<<std::endl;
std::cout<<"  "<<"--+---+--"<<std::endl;
std::cout<<"  "<<Rplansza[4]<<" | "<<Rplansza[5]<<" | "<<Rplansza[6]<<std::endl;
std::cout<<"  "<<"--+---+--"<<std::endl;
std::cout<<"  "<<Rplansza[7]<<" | "<<Rplansza[8]<<" | "<<Rplansza[9]<<std::endl;
};

Powinieneś dostawać się do elementów [0] - [8], element [9] nie jest już Twoją tablicą.

0

Dzięki wielkie za pomoc.
Taki podręcznikowy błąd, a jednak popełniony.
Temat wyczerpany, wszystko działa.

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0