• 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

Object Storage Arubacloud
0 głosów
417 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 484 wizyt
–1 głos
1 odpowiedź 499 wizyt
–1 głos
1 odpowiedź 3,133 wizyt

92,568 zapytań

141,420 odpowiedzi

319,618 komentarzy

61,954 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.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...