rozbudowane wejście z excela

0

Witam serdecznie.
Na tegoroczne ferie postanowiłem napisać Monopol w C++ projekt jednak jest o tyle wymagający, że piszę go obiektowo orientowalnie. Zastanawia mnie import danych z arkusza excelowego.

Teraz dane a niżej wyjaśnienie:

class street {
private:
        string name;
        int position;
        int price;
        int type; //0 - def 1- brown 2- blue 3- pink 4-orange 5-red 6-yellow
        // 7-green 8-purple -9 PKP -10 elektrownia -11 kasa społeczna -12 szansa
        int rent[6]; // 0 - non-house  5- hotel - 11 - one train station 14- quatrostation -20 one electricity -21 for dual
        int state; //0 - niczyja 1 - jest owner 2- zastawioan
}; 
nazwa pozycja cena typ stan rent[0] rent[1]...
konopacka 1 60 1 0 2 10

Jak wy to widzicie.

0

Czy powinienem zrobić do tego jakiś formularz?
tj. funkcje wejścia pętle i tablicę ulic?

street ulica[40];
for (int i = 0; i < 40; i++)
{
[zmienna po zmiennej tutaj]
}

Jeśli tak to mam tylko pytanie jak ściągać dane z tego typu arkusza. Arkusz jeszcze nie powstał dane wezmę z własnego monopolu, głowy, albo internetu (możecie więc zaproponować inną formę pobierania danych).

0

Nie musisz koniecznie pobierać danych z pliku, bo w monopoly wszystkie jest "zafiksowane", czyli możesz sobie to wpisać prosto w kodzie programu. Zamiast arkusza, lepiej przygotuj prostszy plik, np. CSV. Jest do niego dużo darmowych parserów, a i samemu łatwo coś takiego napisać.

0

Możesz również zapisać arkusz do pliku XML i za pomocą np. libxml2 przejechać po pliku co prawda exel zapisuje w tym pliku dużo niepotrzebnych(bynajmniej w twoim projekcie) śmieci które po prostu można zignorować, ale to dużo łatwiejsze rozwiązanie niż operować na natywnym pliku exela.

0

Sam nie wiem co wybrać.

Zostawiam wam swój kod pod ocenę. Przepraszam za polsko-angielski styl pisania - tak już mam. Czy idę w dobrym kierunku? Zastanawia mnie metoda komunikacji pomiędzy obiektami. Jeżeli będą wypluwać co chwila tablice to będzie dobrze? Czy idę w dobrym kierunku? Moim celem jest programowanie OOP. Wrzucam co mam robić dalej będę jutro.

#import <iostream>
#import <ctime>
#import <cstdlib>


using namespace std;

class game {
private:
        int queue;
        int houses;
        int hotels;
};

class dice {
private:
        int num;
public:
       void roll()
       {  num = rand() % 6 + 1; }
       int getNum()
       { return num; }
       void setNum(int n)
       { num = n; }
}; 


class player {
private:
        int ID;
        int money;
        int position;
        string name;
public:
       void setID(int n)
       { ID = n; }
       void setMoney(int n)
       { money = n; }
       void setPosition(int n) { 
       position = n;
       if (position >= 40)
       position -= 40;
       }
       void move(dice d1, dice d2)
       {
       d1.roll(); d2.roll();
       cout << "[ " << d1.getNum() << ", " << d2.getNum() << "]";
       setPosition( d1.getNum() + d2.getNum() + getPosition() );
       cout << "\nPlayer moved.\nCurrent position: " << getPosition();
       }
       int getID()
       { return ID; }
       int getPosition()
       { return position; }
       int getMoney()
       { return money; }      
};

class street {
private:
        string name;
        int position;
        int price;
        int type; //0 - def 1- brown 2- blue 3- pink 4-orange 5-red 6-yellow
        // 7-green 8-purple -9 PKP -10 elektrownia -11 kasa społeczna -12 szansa
        int rent[6]; // 0 - non-house  5- hotel - 11 - one train station 14- quatrostation -20 one electricity -21 for dual
        int state; //0 - niczyja 1 - jest owner 2- zastawioan
};


int main() {
    
    //setting up some basics
    srand(time(NULL));
    int players;
    dice d1, d2;
    char error_1;
    game world;
    
    setting_players:
    
    //choosing number of players
    cout << "Select number of players:\n> ";
    cin >> players;
    
    if (players > 6) {
          cout << "Number of player is not recommended. Do you want to continue? [Y/N]\n";
          cin >> error_1;
          if (error_1 == 89) { cout << "\n\nGoing back... \n\n"; }
          else { cout << "\n\n"; goto setting_players; }
    }
    
    if (players < 1) { goto setting_players; }
          
    player p[players+1]; // 0 player nieznany, od 1 wchodzą gracze
          
          
          // setting up basics of players variables
    for (int n=1; n < players; n++) {
    p[n].setID(0);
    p[n].setMoney(1200);
    p[n].setPosition(0);
    }
    
    //Hello world here serious programming is going
    
    players = 1; // should be world.setQueue(1); instead - to do
    
    cout << "Hello in Monopoly!\n" << "Player position: " << p[players].getPosition() << "\nMovin..\n";
    p[players].move(d1, d2);
    
    cin >> players; // tymczasowy stopper
    
}


    
0

Zapomniałem dopowiedzieć o co mi chodzi w wypluwaniem tablic.

mamy takie zagranie:

p[world.getQueue()].move(world, d1, d2);

po co world d1 i d2?

d1 i d2 to moje kości world to nazwa gry, gra kontroluje stan kolejki chociażby. i w przypadku gdy wypadnie dublet (mam nadzieję że wszyscy znają zasady monopoly) musi paść:

world.setQueue() = world.getQueue() - 1

czy da się to jakoś zrobić inaczej? bo jak się zrobi zamiast 4 obiektów powiedzmy koło 10 to będzie coraz ciężej.

Pozdrawiam i dziękuję za wszelaką pomoc ;)

0

Przy takiej gierce współczesne kompy wszystko łykną. Ważniejsze, żeby Tobie było wygodnie to zaprogramować.

Komunikacja między obiektami może odbywać się na wszelaki sposób, adekwatnie do zadania, np. przez klasę rodzica z polami statycznymi, albo jakiś singleton.

0

Czemu nikt mi nie powiedział, że żeby edytować zmienną klasy wystarczy wrzucić ją pod public :((

Po co ja w takim razie pisałem te wszystkie gettery i settery ? :(

Skasować je czy zostawić skoro już napisane? Przerzucać zmienne na public czy nie?

0

To zależy. Ogólnie jeśli dasz pole jako publiczne, to nie masz kontroli nad tym co tam się znajdzie. Dając settera i gettera mozesz najpierw wykonać walidację czy coś ma prawo się tam znaleźć czy nie, i dopiero potem to przypisać albo rzucić wyjatkiem.

0
UnicoRush napisał(a):

Czemu nikt mi nie powiedział, że żeby edytować zmienną klasy wystarczy wrzucić ją pod public :((

Przy takim opisie problemu ciesz się, że ktokolwiek odpowiedział ;)

0

Wiem. Dziękuję za odpowiedzi :)

Jak uważacie czy powinienem klasę street potraktować jako klasę rodzica, i stworzyć nowe klasy dla:
ulic, dworców, więzienia, elektrowni, parkingu i startu, kasy społecznej i szansy?

Bo teraz to ja to widzę tak:
zaczynamy od sprawdzenia ownera
później sprawdzamy typ, tylko że wtedy z naszego wymarzonego OOP robi się OOD albo coś jeszcze gorszego ;(

class street {
private:
        string name;
        int position;

        int price;
        int type; //0 - def 1- brown 2- blue 3- pink 4-orange 5-red 6-yellow
        // 7-green 8-purple -9 PKP -10 elektrownia -11 kasa społeczna -12 szansa
        int rent[6]; // 0 - non-house  5- hotel - 11 - one train station 14- quatrostation -20 one electricity -21 for dual
        int state; //0 - niczyja 1 - jest owner 2- zastawioan
};
0

zapomniałem w klasie dodać int owner. już dodaję przepraszam :(

0

Dobra buduję wejście i teraz.. znów problem.

    getline(plik, s[i].name,';'); //wczytujemy name
    cout << "\nName: " << s[i].name ;
    getline(plik, s[i].position, ';');

s[i].name to jest nasz string on chwyta
s[i].position to już int i nie pyknie. dlaczego?

Jakieś wyjście z takiej sytuacji?

0

Coś mi nie pyka niestety. Wciąż nie mogę znaleźć przyczyny.

To jest mój csv:

Start;0;15;-1;0;0;0;0;0;0;0
Ulica Konopacka;1;1;0;60;2;10;30;90;160;250
Kasa Spoeczna;2;11;-1;0;0;0;0;0;0;0
Ulica Stalowa;3;1;0;60;4;20;60;180;320;450

(ciągnie się dalej oczywiście)
po kolei to:
nazwa;id_pola;typ;owner(0 pusty -1 nie do kupienia);i dalej-bez domków;z 1; z 2; z 3; z 4; z hotelem

teraz jak pobieram dane:

    street s[40];
    string parser;
    fstream plik;    

    plik.open( "street.csv", ios::in );
    
    if ( plik.good() )  //test poprawnosci pliku
    { cout << "\nStreet data opened!"; }
    else { cout << "\nOpening street data failure! :("; }
    
    
    //loop
    for (int i = 0; i < 10; i++)
    { 
    //wczytujemy name   
    getline(plik, s[i].name,';');
    cout << "\nName: " << s[i].name ; //to comment
    
    //wczytujemy position
    getline(plik, parser, ';');
    s[i].strPosition(parser);
    cout << "\nPosition: " << s[i].position;  //to comment
    
    //wczytujemy typ
    getline(plik, parser, ';');
    s[i].strType(parser);
    cout << "\nType: " << s[i].type; //to comma
    
    //wczytujemy owner
    getline(plik, parser, ';');
    s[i].strOwner(parser);
    cout << "\nOwner: " << s[i].owner;  //to comma
    
    //wczytujemy price
    getline(plik, parser, ';');
    s[i].strPrice(parser);
    cout << "\nPrice: " << s[i].price;
    
        for (int m = 0; m <= 5; m++ )
        {
        getline(plik, parser, ';');
        s[i].strRent( m, parser);
        cout << "\nRent level: " << m <<"  Price size: " << s[i].rent[m];
        } 
    }

i nie udaje się w ogóle

0

Rozwiązałem problem. Excel eh excel.. no właśnie nie robił średników na końcu wiersza. Stąd błędy.

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