3f66f6a5b3
This keyword is not expanded by Git which means it's not replaced with the correct revision value in the releases made using git-based scripts and it's confusing to have lines with unexpanded "$Id$" in the released files. As expanding them with Git is not that simple (it could be done with git archive and export-subst attribute) and there are not many benefits in having them in the first place, just remove all these lines. If nothing else, this will make an eventual transition to Git simpler. Closes #14487. git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@74602 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
166 lines
5.2 KiB
C++
166 lines
5.2 KiB
C++
/////////////////////////////////////////////////////////////////////////////
|
|
// 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_
|