• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Kółko i krzyżyk OBIEKTOWO

0 głosów
634 wizyt
pytanie zadane 19 stycznia 2017 w Nasze projekty przez karol928 Początkujący (320 p.)

Kiedyś miałem taki o to kod, dawno nie siedziałem w C++, jeżeli mógłby ktoś podpowiedzieć jak zmienić kod tak aby :

1 .wyświetlał kółko i krzyżyk a nie 1 i -1 .

2 dlaczego przy pierwszym uruchomieniu wali błąd,. że "To miejsce jest juz wykorzystane, wp....."

Będą bardzo wdzięczny za porady, sugesite, wiem że chwilowo main może się nie podobać ale chodzi o to żeby odpalił do testu.

 

//main.cpp


#include <iostream>
#include <windows.h>
#include "gra.h"

using namespace std;


int main()
 {
Gra g;

g.wczytaj(1,1,1);
g.wyswietl();
g.rozgrywka();
g.sprawdz();

}


//gra.cpp


#include <iostream>
#include <windows.h>

#include "gra.h"

using namespace std;

void Gra::sprawdz(){
    //Poziom
    for(int i=0;i<3;i++){
        if(tablica[i][0]+tablica[i][1]+tablica[i][2]==3) wygral="x";
        else if(tablica[i][0]+tablica[i][1]+tablica[i][2]==-3) wygral="y";
    }
    //Pion
    for(int i=0;i<3;i++){
        if(tablica[0][i]+tablica[1][i]+tablica[2][i]==3) wygral="x";
        else if(tablica[0][i]+tablica[1][i]+tablica[2][i]==-3) wygral="y";
    }
    //na ukos
    if(tablica[0][0]+tablica[1][1]+tablica[2][2]==3) wygral="x";
    else if(tablica[0][0]+tablica[1][1]+tablica[2][2]==-3) wygral="y";

    if(tablica[0][2]+tablica[1][1]+tablica[2][0]==3) wygral="x";
    else if(tablica[0][2]+tablica[1][1]+tablica[2][0]==-3) wygral="y";

}

void Gra::wczytaj (int x, int y, int gracz)
{
     x--;
    y--;
    tablica[x][y] = gracz;
}

void Gra::wyswietl()
{
    cout<<"X    1    2    3"<<endl;
    cout<<"     -------------"<<endl;
    cout<<"1   | "<<tablica[0][0]<<" | "<<tablica[0][1]<<" | "<<tablica[0][2]<<" |"<<endl;
    cout<<"    -------------"<<endl;
    cout<<"2   | "<<tablica[1][0]<<" | "<<tablica[1][1]<<" | "<<tablica[1][2]<<" |"<<endl;
    cout<<"   -------------"<<endl;
    cout<<"3   | "<<tablica[2][0]<<" | "<<tablica[2][1]<<" | "<<tablica[2][2]<<" |"<<endl;
    cout<<"    -------------\n\n"<<endl;
}

void Gra::rozgrywka()
{
while(wygral==""){
        system("cls");
        wyswietl();
        czy=1;
        if(gracz==1) g="kolko";
        else g="krzyzyk";
        while(czy==1){
            cout<<"Runda gracza "<<g<<endl;
            cin>>x;
            cin>>y;
            if(x<1||x>3||y>3||y<1){
                cout<<"Bledne dane, wprowadz jeszcze raz."<<endl;
            } else{
                if(tablica[x-1][y-1]!=0) cout<<"To miejsce jest juz wykorzystane, wprowadz dane jeszcze raz."<<endl;
                else czy=0;
            }
        }
        wczytaj(x,y,gracz);
        sprawdz();

 a=0;
        for(int i=0;i<3;i++){
            if(i==2){
                i=0;
                a++;
                if(a==3) {
                if(a==3) {
                    wygral="remis";
                    break;
                }
            }
            if(tablica[a][i]==0)break;
        }
    gracz = gracz*(-1);
    }
    system("cls");
    wyswietl();
    if(wygral!="remis") cout<<"Wygral gracz "<<wygral<<endl;
    else cout<<wygral<<endl;

    system("pause");
}


//gra.h


#include <iostream>

using namespace std;

class Gra{

public:
int tablica[3][3] = {{0,0,0},{0,0,0},{0,0,0}};
string wygral="";
    int x=0;
    int y=0;
    int a;
    int czy;
    int gracz=1;
    string g;

void sprawdz();
void wczytaj(int x, int y, int gracz);
void wyswietl();
void rozgrywka();

};

 

1 odpowiedź

+1 głos
odpowiedź 19 stycznia 2017 przez Boshi VIP (100,240 p.)
Raczej mało ma to wspólnego z obiektowością.. chyba tylko w nazewnictwie
komentarz 19 stycznia 2017 przez karol928 Początkujący (320 p.)
Obiektowe dopiero bedzie,najpierw musi dzialac.
3
komentarz 19 stycznia 2017 przez event15 Szeryf (93,790 p.)
Spaczone myślenie. Najpierw trzeba przemyśleć i użyć szarych komórek, żeby mogło cokolwiek działać.
komentarz 19 stycznia 2017 przez karol928 Początkujący (320 p.)
Spaczone to Ty masz myślenie. Tacy członkowie to i forum mało pomocne
komentarz 19 stycznia 2017 przez event15 Szeryf (93,790 p.)
Jeśli chcesz napisać program obiektowo to nie powinieneś w ogóle myśleć w kontekście "najpierw niech zadziała" - tak stworzysz wyłącznie program strukturalny, nawet, jeśli będzie miało w sobie klasę/klasy.

Jeśli chcesz pisać obiektowo, zacznij myśleć obiektowo - wszystko co Cię otacza jest obiektem a pewne zachowania są kontraktami między obiektami. Istnieją wzorce projektowe, które nakreślają pewien standard i styl tworzenia różnych zachowań otaczających te obiekty.

Meritum problemu zawiera się w tym, że przy programowaniu obiektowym wynik działania aplikacji jest dostrzegalny bardzo późno, gdy ma się już wszystko przemyślane.

Używając słów kluczowych odnoszących się do obiektów czy obiektowości w ogóle nie świadczy o tym, że program może być obiektowy.

W tej chwili Twój program łamie zasady enkapsulacji, DRY, SOLID, ma wysoki poziom złożoności cyklometrycznej i nie przestrzega zasad czystego kodu. Wszystko jest publiczne. Brak jakiegokolwiek kontraktu i warstwy abstrakcji która chowałaby istotne rzeczy.

Twoje błędy wynikają właśnie z braku przemyślenia - pierwszy to zapewne efekt wiersza "gracz = gracz * (-1);"  a drugie może wynikać z nieumiejętnego operowania ifami w programie, co dziwić nie może w przy tak dużej liczbie warunków.

Podobne pytania

0 głosów
0 odpowiedzi 649 wizyt
–1 głos
1 odpowiedź 931 wizyt
–1 głos
1 odpowiedź 5,017 wizyt

93,741 zapytań

142,676 odpowiedzi

323,294 komentarzy

63,323 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

Twierdza Linux. Bezpieczeństwo dla dociekliwych

Aby uzyskać rabat -10%, użyjcie kodu pasja-linux, wpisując go w specjalne pole w koszyku.

...