Gra w Życie Johna Conwaya C++

0

Witam!

Pomóżcie mi zaprogramować Grę w Życie Johna Conwaya w C++ Windows Forms. Wykorzystuje do tego Buildera 6.

Jak na razie to jest mój kod:

 //---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
        tab = new TShape*[625];
        life = new bool[625];
        for( int i = 0 ; i < 625 ; i++)
        {
                tab[i] = new TShape( NULL );
                // tab[i] = new TShape( this );  dla formatki
                //this -> InsertComponent(tab[i]); dla formatki

                tab[i] ->Parent = this;
                //this -> InsertControl(tab[i]);

                tab[i] -> Width = 20;
                tab[i] -> Height = 20;

                /// Siatka --------------------- ///
                //i -> ( szerokosc*(1*n) , wysokosc * (i/n) )

                tab[i] -> Left = tab[i] -> Width * (i%25) + 202;
                tab[i] -> Top = tab[i] -> Height * (i/25) +5;

                tab[i]->Pen->Color = clBtnFace;

                life[i] = false;

                tab[i]->OnMouseDown = Shape1MouseDown;




        }

}
//---------------------------------------------------------------------------

void __fastcall TForm1::Shape1MouseDown(TObject *Sender,
      TMouseButton Button, TShiftState Shift, int X, int Y)
{
        TShape* tmp = dynamic_cast<TShape*>(Sender);


        tmp->Brush->Color = clBlack;




}
//---------------------------------------------------------------------------

Zasady Gry (jakby ktoś jej nie znał):

Zasady są proste i polegają na zmianie stanu każdej komórki na planszy podczas jednego kroku gry.
Zasady zmiany stanu są następujące:

  1. Martwa komórka, która ma dokładnie 3 żywych sąsiadów, staje się żywa w następnej jednostce
    czasu (rodzi się).
  2. Żywa komórka z 2 albo 3 żywymi sąsiadami pozostaje nadal żywa; przy innej liczbie sąsiadów umiera
    (z „samotności” albo „zatłoczenia”)

Siatką są komponenty TShape, 625 elementów 25 na 25, siatka ma być dynamiczna i tak też zrobiłem. Zrobiłem event OnMouseDown, gdzie zamienia mi biale kwadraciki na czarne (z martwych na żywe), chciałbym teraz zrobić tablicę, w której zapiszę sobie który z tych kwadracików jest żywy a który martwy, bym mógł później wykorzystać to sprawdzając sąsiadów i zmieniając stan komórek przy każdym kolejnym kroku wg. zasad gry.

Nie mam pojęcia jak zrobić taką tablicę. Jakiś podpowiedzi?

0

w C++ Windows Forms
Wykorzystuje do tego Buildera 6.

pierwsze to CLI, drugie to bardzo stara technologia. One nie sa ze soba w zaden sposob powiazany

zapoznaj sie z std::map mozesz zrobic wtedy

std::map<Coords, bool>

gdzie Coords to Twoje x,y w tablicy a bool to jaki stan ma dana komorka

0

kto Ci podsunął ten genialny pomysł aby w roli siatki użyć 256 shapeów?? Przecież masz StringGrida chociażby

0

proponuje ListBoxa ukrytego oczywiście w tym przypadku zadziała jak tablica

0

To projekt na zaliczenie, siatka ma być zrobiona TShapem dynamicznie.

0

Moja wizja polega na tym, że chciałbym by przy zdarzeniu OnMouseDown poszczególnej komórki, zamieniała się na czarny lub biały w zależności od tego czy komórka jest obecnie martwa czy żywa, udało mi się zrobić by zamienić ją na żywą, ale nie wiem jak przypisać do niej wartość bool, by móc potem przy każdym kroku wprowadzić zasady i zmienić stan planszy.

0

No dobrze tak to wymyśliłem, I działa:

 void __fastcall TForm1::Shape1MouseDown(TObject *Sender,
      TMouseButton Button, TShiftState Shift, int X, int Y)
{
        TShape* tmp = dynamic_cast<TShape*>(Sender);

        if (tmp->Brush->Color == clWhite)
        {
        tmp->Brush->Color = clBlack;
        }
        else
        {
        tmp->Brush->Color = clWhite;
        }



}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
        if(Button1->Caption == "START PROGRAMU") Button1->Caption = "Generuj Krok";


       life = new int[729];

       for( int i = 28 ; i < 701 ; i++)
       {
                if(tab[i]->Brush->Color == clWhite)  /// czy martwa
                {


                        if(tab[i-28]->Brush->Color == clBlack) life[i]++;

                        if(tab[i-27]->Brush->Color == clBlack) life[i]++;

                        if(tab[i-26]->Brush->Color == clBlack) life[i]++;

                        if(tab[i-1]->Brush->Color == clBlack) life[i]++;

                        if(tab[i+1]->Brush->Color == clBlack) life[i]++;

                        if(tab[i+26]->Brush->Color == clBlack) life[i]++;

                        if(tab[i+27]->Brush->Color == clBlack) life[i]++;

                        if(tab[i+28]->Brush->Color == clBlack) life[i]++;



                }
                else if (tab[i]->Brush->Color == clBlack)  /// jak nie martwa to zywa
                {
                        if(tab[i-28]->Brush->Color == clBlack) life[i]++;

                        if(tab[i-27]->Brush->Color == clBlack) life[i]++;

                        if(tab[i-26]->Brush->Color == clBlack) life[i]++;

                        if(tab[i-1]->Brush->Color == clBlack) life[i]++;

                        if(tab[i+1]->Brush->Color == clBlack) life[i]++;

                        if(tab[i+26]->Brush->Color == clBlack) life[i]++;

                        if(tab[i+27]->Brush->Color == clBlack) life[i]++;

                        if(tab[i+28]->Brush->Color == clBlack) life[i]++;


                }
       }

       for( int j = 28 ; j < 701 ; j++)
       {
                if(tab[j]->Brush->Color == clWhite)
                {
                        if(life[j] == 3) tab[j]->Brush->Color = clBlack;
                }
                else if(tab[j]->Brush->Color == clBlack)
                {
                        if(life[j] == 2 || life[j] == 3) tab[j]->Brush->Color = clBlack;
                        else tab[j]->Brush->Color = clWhite;
                }
       }


}
//---------------------------------------------------------------------------

void __fastcall TForm1::FormDestroy(TObject *Sender)
{
        delete [] tab;
        delete [] life;
}
//---------------------------------------------------------------------------

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