Monopol - wyciek pamięci?

0

Witam, mam taki oto kod i nie wiem czym spowodowane błędy są przy kompilacji. Podsunie ktoś pomysł, ew. sam naprawi i powie o co chodziło?

// monopolyMonopol.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <iostream>
#include <ctime>
#include <Windows.h>
#include <string.h>

enum Color{ red,yellow,blue,green,Specjal,Jail,GetCard,none};

class Card
{
    public:
        int money;
        char* opis;
    Card(int money,char* opis)
    {
        this->money = money;
        this->opis = opis;
    }
    Card()
    {
        this->money = -200;
        this->opis = "izba skarbowa jest nie ub³agana bulisz 100";
    }
};

    static Card cList[20];

class Gracz;



class Pole
{
    public:
        Color color;
        char* opis;
       void PayDay(Gracz *gracz);
};

class EmptySpace:Pole
{
    public:
    void PayDay(Gracz *gracz)
    {
        printf("Nic nie robisz");
    }
};
class Gracz
{
public:
    int money;
    int pos;
    int jailDay;
    char name[10];
    bool play;

    Gracz()
    {
        this->money = 1000;
        this->pos = 0;
        this->jailDay=0;
        play=true;
    }
    void poruszGraczem(int cpola)
    {
        if(pos+cpola<39)
        {
            pos+=cpola;
        }
        else
        {
            pos=(pos+cpola)-40;
        }
    }

    


};

class BuyAble:public Pole
{
    public:
        int koszt;
        int domki;
        Gracz* wlasciciel;
        char* nazwa;
        
    BuyAble(char* nazwa,int koszt2,Color k)
    {
        this->nazwa = nazwa;
        this->koszt = koszt2;
        this->domki = 0;
        Pole::color = k;
    }



    bool BuyPole(Gracz &gracz)
    {
        if(gracz.money>koszt&&wlasciciel==NULL)
        {
            wlasciciel=&gracz;
            wlasciciel->money-=koszt;
            return true;
        }
        return false;
    }
    
    void buyHouse(BuyAble* wsk)
    {
        if(color!= Color::Specjal)
        {
        bool czymzoebudowac=false;
        int pXout=0;
        for(int i=0;i<40;i++)
        {
            if(wsk[i].color==color)
            {
                pXout++;
            }
        }
        int thisKeeper=0;
        for(int i=0;i<40;i++)
        {
            if(wsk[i].color==color)
            {
                thisKeeper++;
            }
        }

        if(    wlasciciel->money>koszt*1.5 && thisKeeper == pXout)
            {
                domki++;
            }
        }
    }

     void PayDay(Gracz *gracz)
    {
            if(wlasciciel != gracz)
            {
                if(wlasciciel!=NULL)
                {
                    gracz->money-=koszt+100*domki;
                    wlasciciel->money+=this->koszt+100*domki;
                    printf("W³¹œcicielem jest gracz %s\n",wlasciciel->name);
                    printf("zap³aci³eœ myto w wysokosci %d\n",koszt+100*domki);
                    system("pause");
                
                }
                else
                {
                    printf("Chcesz kupiæ %s za %d 1-tak;0-nie",this->nazwa,this->koszt);
                    int k;
                    std::cin>>k;
                    if(k==1)
                    {
                        gracz->money-=koszt;
                        wlasciciel = gracz;
                    }
                }
            }
            else
            {
                bool w=true;
                while(w)
                {
                    printf("1.chcesz kupic domek\n");
                    printf("2.nic nie chcesz robiæ\n");
                    int opc;
                    std::cin>>opc;
                    if(opc==1)
                    {
                        buyHouse(this);
                    }
                    else
                    {
                        w=false;
                    }
                }
            
        }
    }
};


class JailPole:Pole
{
    public:
    JailPole()
    {
        Pole::color = Color::Jail;
    }
    void PayDay(Gracz *gracz)
    {
        if(gracz->jailDay==0)
        gracz->jailDay=2;
        else
            gracz->jailDay--;
    }
};

class CardCarry:public Pole
{
    public:
    CardCarry()
    {
        Pole::color = Color::GetCard;
    }

     void PayDay(Gracz *gracz)
    {
        srand(time(NULL));
        int r = rand()%19;
        gracz->money+=cList[r].money;
        printf("%s",cList[r].opis);
        system("pause");
    }
};


class Game
{
    public:
        bool Work;
        void* pole[40];
    

    Game()
    {
        Work=true;
    }

    void initCards()
{
      cList[0] =  Card(100,"Oplacajac zakupy w kasie wydano Ci wiecej reszty. Zyskujesz 100$.");
    cList[1] =  Card(-150,"Tekst1");
    cList[2] =  Card(50,"Tekst2");
    cList[3] =  Card(-50,"Tekst3");
    cList[4] =  Card(-100,"Tekst4");
    cList[5] =  Card(100,"Tekst5");
    cList[6] =  Card(75,"Tekst6");
    cList[7] =  Card(-75,"Tekst7");
    cList[8] =  Card(125,"Tekst8");
    cList[9] =  Card(125,"Tekst9");
    cList[10] =  Card(100,"Tekst10");
    cList[11] =  Card(-150,"Tekst11");
    cList[12] =  Card(-50,"Tekst12");
    cList[13] =  Card(25,"Tekst13");
    cList[14] =  Card(-50,"Tekst14");
    cList[15] =  Card(100,"Tekst15");
    cList[16] =  Card(50,"Tekst16");
    cList[17] =  Card(-150,"Tekst17");
    cList[18] =  Card(50,"Tekst18");
    cList[19] =  Card(50,"Tekst19");

}

    void SetPlayerCount(int p)
    {
        playerCout=p;
        gracze = new Gracz[p];
        for(int i=0;i<p;i++)
        {
            printf("wprowadz nazwe gracza %d",i);
            std::cin>>gracze[i].name;
        }
        ec=0;
        initCards();
        this->SetMap();
        kolejka=0;
    }
    void Draw()
    {
        
        Update();
        
    }
    private:
        int playerCout;
        Gracz* gracze;
        int ec;
        int kolejka;
    void Update()
    {
        if(kolejka<playerCout)
        {
            printf("Gracz:%s\nPortfel:%d zl\n",gracze[kolejka].name,gracze[kolejka].money);
            if(gracze[kolejka].jailDay==0)
            {
                kostka = rand()%5;
                kostka+=1;
                gracze[kolejka].poruszGraczem(kostka);
                switch(((Pole*)pole[gracze[kolejka].pos])->color)
                {
                case Color::blue:
                        {
                            ((BuyAble*)pole[gracze[kolejka].pos])->PayDay(&gracze[kolejka]);
                            break;
                        }
                        
                case Color::green:
                        {
                            ((BuyAble*)pole[gracze[kolejka].pos])->PayDay(&gracze[kolejka]);
                            break;
                        }
                case Color::red:
                        {
                            ((BuyAble*)pole[gracze[kolejka].pos])->PayDay(&gracze[kolejka]);
                            break;
                        }
                case Color::yellow:
                        {
                            ((BuyAble*)pole[gracze[kolejka].pos])->PayDay(&gracze[kolejka]);
                            break;
                        }
                    case Color::GetCard:
                        {
                            ((CardCarry*)pole[gracze[kolejka].pos])->PayDay(&gracze[kolejka]);
                            break;
                        }
                    case Color::Specjal:
                        {
                            ((BuyAble*)pole[gracze[kolejka].pos])->PayDay(&gracze[kolejka]);
                            break;
                        }
                    case Color::Jail:
                        {
                            ((JailPole*)pole[gracze[kolejka].pos])->PayDay(&gracze[kolejka]);
                            break;
                        }
                    case Color::none:
                        {
                            ((EmptySpace*)pole[gracze[kolejka].pos])->PayDay(&gracze[kolejka]);
                            break;
                        }
                }
            }else
            {
                printf("\nJestes w pierdlu\n");
                system("pause");
                gracze[kolejka].jailDay--;
            }
            kolejka++;
        }
        else
        {
            if(ec==playerCout-1)
            {
                Work = false;
                for(int i=0;i<playerCout;i++)
                {
                    if(gracze[i].play==true)
                        printf("Win :%s\n",gracze[i]);
                    system("pause");
                    break;
                }
                
            }
            for(int i=0;i<playerCout;i++)
            {
                if(gracze[i].money<0 && gracze[i].play==true)
                {
                    ec++;
                    printf("Gracz %s zostal wyeliminowany",gracze[i].name);
                    gracze[i].play=false;
                }
            }
            kolejka=0;
        }
        Sleep(500);
        system("cls");
    }

    int kostka;
    
    void SetMap()
    {

    pole[1] = new BuyAble("Pole1",60,Color::red);
    pole[2] = new CardCarry();
    pole[3] = new BuyAble("Pole2",60,Color::red);
    pole[4] = new BuyAble("Pole po podatku",80,Color::red);
    pole[5] = new BuyAble("PoleSpecjal1",200,Color::Specjal);
    pole[6] = new BuyAble("Pole3",100,Color::red);
    pole[7] = new CardCarry();
    pole[8] = new BuyAble("Pole4",100,Color::red);
    pole[9] = new BuyAble("Pole5",120,Color::red);
    pole[10] = new JailPole();
    pole[11] = new BuyAble("Pole6",140,Color::yellow);
    pole[12] = new BuyAble("PoleSpecjal2",150,Color::Specjal);
    pole[13] = new BuyAble("Pole7",140,Color::yellow);
    pole[14] = new BuyAble("Pole8",160,Color::yellow);
    pole[15] = new BuyAble("PoleSpecjal3",200,Color::Specjal);
    pole[16] = new BuyAble("Pole9",180,Color::yellow);
    pole[17] = new CardCarry();
    pole[18] = new BuyAble("Pole10",180,Color::yellow);
    pole[19] = new BuyAble("Pole11",200,Color::yellow);
    pole[20] = new BuyAble("Pole20",180,Color::red);
    pole[21] = new BuyAble("Pole12",220,Color::blue);
    pole[22] = new CardCarry();
    pole[23] = new BuyAble("Pole13",220,Color::blue);
    pole[24] = new BuyAble("Pole14",240,Color::blue);
    pole[25] = new BuyAble("PoleSpecjal4",200,Color::Specjal);
    pole[26] = new BuyAble("Pole15",260,Color::blue);
    pole[27] = new BuyAble("Pole16",260,Color::blue);
    pole[28] = new BuyAble("PoleSpecjal5",150,Color::Specjal);
    pole[29] = new BuyAble("Pole17",280,Color::blue);
    pole[30] = new JailPole();
    pole[31] = new BuyAble("Pole18",300,Color::green);
    pole[32] = new BuyAble("Pole19",300,Color::green);
    pole[33] = new CardCarry();
    pole[34] = new BuyAble("Pole20",320,Color::green);
    pole[35] = new BuyAble("PoleSpecjal6",200,Color::Specjal);
    pole[36] = new CardCarry();
    pole[37] = new BuyAble("Pole21",350,Color::green);
    pole[38] = new BuyAble("Pole22",400,Color::green);
    pole[39] = new BuyAble("Pole23",400,Color::green);
    }


};


int _tmain(int argc, _TCHAR* argv[])
{
    Game game;
    std::cout<<"Podaj liczbe graczy:";
    int l;
    std::cin>>l;
    game.SetPlayerCount(l);
    while(game.Work)
    {
        game.Draw();
    }
    return 0;
}

zmniejszenie wcięć w kodzie - fp

0

Jakie błędy przy kompilacji?

0

robisz new nie robisz delete stąd masz wyciek pamięci.

nie każdy ma visuala, więc wklej fragment który Ci się nie kompiluję z komunikatem błędu

0
cList[1] =  Card(-150,"Tekst1");
cList[2] =  Card(50,"Tekst2");
cList[3] =  Card(-50,"Tekst3");
((BuyAble*)pole[gracze[kolejka].pos])->PayDay(&gracze[kolejka]);
...
((BuyAble*)pole[gracze[kolejka].pos])->PayDay(&gracze[kolejka]);
...
((BuyAble*)pole[gracze[kolejka].pos])->PayDay(&gracze[kolejka]);
    pole[37] = new BuyAble("Pole21",350,Color::green);
    pole[38] = new BuyAble("Pole22",400,Color::green);
    pole[39] = new BuyAble("Pole23",400,Color::green);

Za każdym razem, gdy piszesz więcej niż dwa razy taką samą lub bardzo podobną linijkę pod rząd, powinna ci się zapalać czerwona lampka z przerywanym sygnałem dzwiękowym, która gaśnie dopiero po poprawieniu kodu.

Inicjalizację tablic jeszcze można wybaczyć, ale zrób coś z tym switchem.

0

Mój błąd, napisałem, że jest przy kompilacji, ale tak na prawdę po wpisaniu liczby graczy oraz nadaniu im imion oraz kliknięciu dowolnego przycisku ( moment kiedy to gracz jest na jednym z pól cList - Card) klawiatury program wywala błąd:
Unhandled exception at 0x0ff214cf (msvcr100d.dll) in monopoly.exe: 0xC0000005: Access violation reading location 0x0000044c.

Dziękuje za rady, postaram się to poprawić.

0

błąd mówi o tym że piszesz po nie swojej pamięci. Innymi słowami mówiąc używasz nie zainicjalizowanego wskaźnika.

0
 
Game game;	
std::cout<<"Podaj liczbe graczy:";
int l;
std::cin>>l;
game.SetPlayerCount(l);

Nie tworzysz instancji klasy Game. Brakuje Ci new.

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