X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/e0a4029251c1d80d50f9cb0bd152d1fca7914bc4..906c935a80b10d53cecf57f71ab5f3f4f1d529ec:/demos/life/game.h diff --git a/demos/life/game.h b/demos/life/game.h index 9238e6d0ab..a95dae2656 100644 --- a/demos/life/game.h +++ b/demos/life/game.h @@ -1,6 +1,6 @@ ///////////////////////////////////////////////////////////////////////////// // Name: game.h -// Purpose: Life! game logic, version 2 +// Purpose: Life! game logic // Author: Guillermo Rodriguez Garcia, // Modified by: // Created: Jan/2000 @@ -12,61 +12,59 @@ #ifndef _LIFE_GAME_H_ #define _LIFE_GAME_H_ -#ifdef __GNUG__ - #pragma interface "game.h" -#endif - -// for compilers that support precompilation, includes "wx/wx.h" -#include "wx/wxprec.h" - -#ifdef __BORLANDC__ - #pragma hdrstop -#endif - -// for all others, include the necessary headers -#ifndef WX_PRECOMP - #include "wx/wx.h" -#endif - -// -------------------------------------------------------------------------- -// Cell -// -------------------------------------------------------------------------- - -// A Cell is just a struct which contains a pair of (i, j) coords. -// These structs are not used internally anywhere; they are just -// used to pass cell coordinates around. -struct Cell -{ - wxInt32 i; - wxInt32 j; -}; - // -------------------------------------------------------------------------- -// LifeShape +// LifePattern // -------------------------------------------------------------------------- // A class which holds a pattern -class LifeShape +class LifePattern { public: - LifeShape::LifeShape(wxString name, - wxString desc, - int width, - int height, - char *data) + // This ctor is used by the LifeReader class + LifePattern(wxString name, + wxString description, + wxString rules, + wxArrayString shape) { - m_name = name; - m_desc = desc; - m_width = width; - m_height = height; - m_data = data; - } - - wxString m_name; - wxString m_desc; - int m_width; - int m_height; - char *m_data; + 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; }; @@ -74,8 +72,17 @@ public: // Life // -------------------------------------------------------------------------- -class CellBox; +// 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: @@ -84,19 +91,28 @@ public: ~Life(); // accessors - inline wxUint32 GetNumCells() const { return m_numcells; }; - bool IsAlive (wxInt32 x, wxInt32 y); - void SetCell (wxInt32 x, wxInt32 y, bool alive = TRUE); - void SetShape(const LifeShape &shape); + 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. + // then keep calling FindMore() until it returns true. // // BeginFind: // Specify the viewport and whether to look for alive cells or for @@ -108,36 +124,43 @@ public: // 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 + // false, then the operation is not complete: just process all cells // and call FillMore() again. // - void BeginFind(wxInt32 i0, wxInt32 j0, - wxInt32 i1, wxInt32 j1, + void BeginFind(wxInt32 x0, wxInt32 y0, + wxInt32 x1, wxInt32 y1, bool changed); - bool FindMore(Cell *cells[], size_t *ncells); + bool FindMore(LifeCell *cells[], size_t *ncells); private: // cellbox-related - CellBox *CreateBox(wxInt32 x, wxInt32 y, wxUint32 hv); - CellBox *LinkBox(wxInt32 x, wxInt32 y, bool create = TRUE); - void KillBox(CellBox *c); - - // helpers for FindMore & co. - void DoLine(wxInt32 i, wxInt32 j, wxUint32 alive, wxUint32 old); - void DoLine(wxInt32 i, wxInt32 j, wxUint32 alive); - - - CellBox *m_head; // list of alive boxes - CellBox *m_available; // list of reusable dead boxes - CellBox **m_boxes; // hash table of alive boxes - wxUint32 m_numcells; // population (number of alive cells) - Cell *m_cells; // cell array for FindMore() - size_t m_ncells; // number of valid cells in cell array - wxInt32 m_i, m_j, // state vars for FindMore() - m_i0, m_j0, - m_i1, m_j1; - bool m_changed; - bool m_findmore; + 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_