#ifndef _LIFE_GAME_H_
#define _LIFE_GAME_H_
-#ifdef __GNUG__
+#if defined(__GNUG__) && !defined(__APPLE__)
#pragma interface "game.h"
#endif
#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_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_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 = wxEmptyString;
+ m_shape.Add( wxString::Format(_T("%i %i"), -width/2, -height/2) );
+ 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
// --------------------------------------------------------------------------
-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:
~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
- Cell FindNorth();
- Cell FindSouth();
- Cell FindWest();
- Cell FindEast();
- Cell FindCenter();
+ 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
// 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);
+ 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 i, wxInt32 j, wxUint32 alive, wxUint32 old = 0);
-
-
- 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;
+ 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_