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

Gra w statki okienkowo-plansza [C++]

VMware Cloud PRO - przenieś swoją infrastrukturę IT do chmury
0 głosów
2,098 wizyt
pytanie zadane 20 maja 2016 w C i C++ przez mat07 Nowicjusz (160 p.)
Hej,

od 2 lat programuję w c++ w konsoli, jednak teraz zaczynam swoją przygodę z okienkami i wzoruję się na grze w kółko i krzyżyk wykonanej przez Pana Zelenta w 7 odcinku kursu. Mam jednak pytanie. Ze względu na to że mam planszę 16x16 co oznacza 256 pól nie widzę możliwości pisania osobnych instrukcji dla każdego pola. W związku z tym czy istnieje możliwość, żeby połączyć wszystkie pola w jedną klasę plansza, coś na zasadzie kompozycji, żeby można było wpisać np. tak jak w konsoli:

CPole* Plansza[256] albo [16][16]

i potem

for(int i=0;i<256;i++)

{

Plansza [i]=new CPole;

}

Jak mogę zrealizować coś takiego w okienku?

3 odpowiedzi

0 głosów
odpowiedź 20 maja 2016 przez Avernis Nałogowiec (27,400 p.)
A nie możesz użyć pętli w pętli?
0 głosów
odpowiedź 21 maja 2016 przez draghan VIP (106,230 p.)

Nie rozumiem, co chcesz realizować. Konsola czy okno - to nie jest ważne. Reguły programowania się nie zmieniają.

Napisz sobie klasę pola, metody do obsługi pola, może jakąś klasę planszy i tyle. Mogłoby to wyglądać tak:

enum class FieldType
{
    some,
    other
    // ...
};

class Field
{
public:
    Field(int x, int y, FieldType type);
    void draw();
    void update();
    void change( /* jakieś argumenty do jakichś operacji na polu */);

private:
    int x, y;
    FieldType type;
    // (...)
};

class Board
{
public:
    Board(int how_many_fields)
    {
        int x = 1, y = 1;
        for(int i = 0; i < how_many_fields; ++i)
        {
            fields.push_back(Field(x, y, FieldType::some));
            x += 10; // jakaś zmiana właściwości każdego pola
        }
    }
    ~Board()
    {
        fields.clear();
    }
    void draw()
    {
        for(const auto &field : fields)
            field.draw();
    }
    void update()
    {
        // (...) jakieś operacje na polach...

        for(const auto &field : fields)
            field.update();
    }

private:
    std::vector <Field> fields;
};

int main()
{
    Board board(10);
    while(true)
    {
        // (...)
        board.update();
        board.draw();
    }
}

Zastanawiam się tylko, po co Ci dynamiczna alokacja. Jeśli nie będziesz zmieniać rozmiaru planszy, to tworzysz tablicę statyczną. Jeśli nie znasz rozmiaru z góry - użyj któregoś z kontenerów biblioteki standardowej. Chyba że w grę wchodzi dziedziczenie, wtedy dynamiczna alokacja jest w porządku.

komentarz 28 maja 2016 przez mat07 Nowicjusz (160 p.)

Chyba nie do końca o to mi chodziło...

Już znalazłem rozwiązanie jak zrobić tablicę obiektów TImage, jednak wciąż te obiekty nie pojawiają mi się na ekranie :/ Co robię źle?

komentarz 28 maja 2016 przez mat07 Nowicjusz (160 p.)
Skopiuje kod, bo ze zrzutu widzę nic nie widać

#include <vcl.h>
#pragma hdrstop

#include "grawstatki.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
}
//---------------------------------------------------------------------------

class Pole
{
public:
Pole();
~Pole();
char p[64];
};

Pole::Pole()
{
       // p='n';
}

class Plansza
{
public:
Plansza();
~Plansza();
TImage * plansza[8][8];
//void RozstawStatki(int pozycja);
};

Plansza::Plansza()
{
        for (int i=0;i<8;i++)
        {
                for (int j=0;j<8;j++)
                {
                        plansza[i][j]=new (TImage)(Form1);
                        plansza[i][j]->Parent=Form1;
                        plansza[i][j]->Height=50;
                        plansza[i][j]->Width=50;
                        plansza[i][j]->Picture->LoadFromFile("img/puste.bmp");
                        plansza[i][j]->Left=144+10j;
                        plansza[i][j]->Top=96+10i;
                        plansza[i][j]->Visible=true;
                        plansza[i][j]->Cursor=crHandPoint;
                }
        }
}
0 głosów
odpowiedź 28 maja 2016 przez mat07 Nowicjusz (160 p.)
Jest ktoś w stanie mi pomóc? :(
komentarz 28 maja 2016 przez mat07 Nowicjusz (160 p.)
Problem rozwiązany, po prostu nigdzie nie tworzyłem obiektu Plansza :P

Podobne pytania

0 głosów
2 odpowiedzi 1,676 wizyt
pytanie zadane 16 stycznia 2019 w Nasze projekty przez Mavannkas Bywalec (2,290 p.)
+7 głosów
5 odpowiedzi 8,134 wizyt
pytanie zadane 14 października 2015 w Nasze projekty przez emSon Stary wyjadacz (10,480 p.)
0 głosów
2 odpowiedzi 722 wizyt
pytanie zadane 13 listopada 2018 w C i C++ przez Mariusz Maik Nowicjusz (220 p.)

93,441 zapytań

142,434 odpowiedzi

322,681 komentarzy

62,802 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

...