| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165 |
- /////////////////////////////////////////////////////////////////////////////
- // Name: game.h
- // Purpose: Life! game logic
- // Author: Guillermo Rodriguez Garcia, <guille@iies.es>
- // Modified by:
- // Created: Jan/2000
- // Copyright: (c) 2000, Guillermo Rodriguez Garcia
- // Licence: wxWindows licence
- /////////////////////////////////////////////////////////////////////////////
- #ifndef _LIFE_GAME_H_
- #define _LIFE_GAME_H_
- // --------------------------------------------------------------------------
- // LifePattern
- // --------------------------------------------------------------------------
- // A class which holds a pattern
- class LifePattern
- {
- public:
- // This ctor is used by the LifeReader class
- LifePattern(wxString name,
- wxString description,
- wxString rules,
- wxArrayString shape)
- {
- m_name = name;
- m_description = description;
- m_rules = rules;
- m_shape = shape;
- };
- // A more convenient ctor for the built-in samples
- LifePattern(wxString name,
- wxString description,
- int width,
- int height,
- const char *shape)
- {
- m_name = name;
- m_description = description;
- m_rules = wxEmptyString;
- // TODO: add the positions later, since the formatting command
- // causes a crash due to conversion objects not being available
- // during initialisation.
- #ifndef __WXMAC__
- m_shape.Add( wxString::Format(wxT("%i %i"), -width/2, -height/2) );
- #endif
- for(int j = 0; j < height; j++)
- {
- wxString tmp;
- for(int i = 0; i < width; i++)
- {
- tmp += wxChar(shape[j * width + i]);
- }
- m_shape.Add( tmp );
- }
- };
- wxString m_name;
- wxString m_description;
- wxString m_rules;
- wxArrayString m_shape;
- };
- // --------------------------------------------------------------------------
- // Life
- // --------------------------------------------------------------------------
- // A struct used to pass cell coordinates around
- struct LifeCell
- {
- wxInt32 i;
- wxInt32 j;
- };
- // A private class that contains data about a block of cells
- class LifeCellBox;
- // A class that models a Life game instance
- class Life
- {
- public:
- // ctor and dtor
- Life();
- ~Life();
- // accessors
- inline wxUint32 GetNumCells() const { return m_numcells; };
- inline wxString GetRules() const { return m_rules; };
- inline wxString GetDescription() const { return m_description; };
- bool IsAlive(wxInt32 x, wxInt32 y);
- void SetCell(wxInt32 x, wxInt32 y, bool alive = true);
- void SetPattern(const LifePattern &pattern);
- // game control
- void Clear();
- bool NextTic();
- // navigation
- LifeCell FindNorth();
- LifeCell FindSouth();
- LifeCell FindWest();
- LifeCell FindEast();
- LifeCell FindCenter();
- // The following functions find cells within a given viewport; either
- // all alive cells, or only those cells which have changed since last
- // generation. You first call BeginFind() to specify the viewport,
- // then keep calling FindMore() until it returns true.
- //
- // BeginFind:
- // Specify the viewport and whether to look for alive cells or for
- // cells which have changed since the last generation and thus need
- // to be repainted. In this latter case, there is no distinction
- // between newborn or just-dead cells.
- //
- // FindMore:
- // Fills an array with cells that match the specification given with
- // BeginFind(). The array itself belongs to the Life object and must
- // not be modified or freed by the caller. If this function returns
- // false, then the operation is not complete: just process all cells
- // and call FillMore() again.
- //
- void BeginFind(wxInt32 x0, wxInt32 y0,
- wxInt32 x1, wxInt32 y1,
- bool changed);
- bool FindMore(LifeCell *cells[], size_t *ncells);
- private:
- // cellbox-related
- LifeCellBox *CreateBox(wxInt32 x, wxInt32 y, wxUint32 hv);
- LifeCellBox *LinkBox(wxInt32 x, wxInt32 y, bool create = true);
- void KillBox(LifeCellBox *c);
- // helper for BeginFind & FindMore
- void DoLine(wxInt32 x, wxInt32 y, wxUint32 alive, wxUint32 old = 0);
- // pattern description
- wxString m_name; // name (currently unused)
- wxString m_rules; // rules (currently unused)
- wxString m_description; // description
- // pattern data
- LifeCellBox *m_head; // list of alive boxes
- LifeCellBox *m_available; // list of reusable dead boxes
- LifeCellBox **m_boxes; // hash table of alive boxes
- wxUint32 m_numcells; // population (number of alive cells)
- // state vars for BeginFind & FindMore
- LifeCell *m_cells; // array of cells
- size_t m_ncells; // number of valid entries in m_cells
- wxInt32 m_x, m_y, // counters and search mode
- m_x0, m_y0,
- m_x1, m_y1;
- bool m_changed;
- bool m_findmore;
- };
- #endif // _LIFE_GAME_H_
|