• 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++]

Object Storage Arubacloud
0 głosów
1,791 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,274 wizyt
pytanie zadane 16 stycznia 2019 w Nasze projekty przez Mavannkas Bywalec (2,290 p.)
+7 głosów
5 odpowiedzi 7,467 wizyt
pytanie zadane 14 października 2015 w Nasze projekty przez emSon Stary wyjadacz (10,480 p.)
0 głosów
2 odpowiedzi 468 wizyt
pytanie zadane 13 listopada 2018 w C i C++ przez Mariusz Maik Nowicjusz (220 p.)

92,539 zapytań

141,382 odpowiedzi

319,477 komentarzy

61,928 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!

...