You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
311 lines
8.3 KiB
311 lines
8.3 KiB
/*
|
|
Copyright (C) 2001 Jens Hoefkens
|
|
jens@hoefkens.com
|
|
|
|
This program is free software; you can redistribute it and/or modify
|
|
it under the terms of the GNU General Public License as published by
|
|
the Free Software Foundation; either version 2 of the License, or
|
|
(at your option) any later version.
|
|
|
|
This program is distributed in the hope that it will be useful,
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
GNU General Public License for more details.
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
along with this program; if not, write to the Free Software
|
|
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
|
|
|
$Id$
|
|
|
|
*/
|
|
|
|
#ifndef KBGSTATUS_H
|
|
#define KBGSTATUS_H
|
|
|
|
#ifdef HAVE_CONFIG_H
|
|
#include <config.h>
|
|
#endif
|
|
|
|
#include <qobject.h>
|
|
|
|
|
|
/**
|
|
* This is a the fundamental class of the KBg* hierarchy. It represents
|
|
* the state of backgammon games.
|
|
*
|
|
* The game states can be initialized in a variety of information and
|
|
* are meant to be passed to the board. In addition to that, the class
|
|
* has several utility functions that are helpful for engines that
|
|
* maintain a local state.
|
|
*
|
|
* @short The backgammon status object
|
|
* @author Jens Hoefkens <jens@hoefkens.com>
|
|
* @version $Id$
|
|
*/
|
|
class KBgStatus : public QObject
|
|
{
|
|
|
|
Q_OBJECT
|
|
|
|
public:
|
|
|
|
/**
|
|
* These numbers are used to distinguish the two players. The
|
|
* notion of US and THEM is a leftover from ancient times.
|
|
*/
|
|
enum {NONE = -1, US = 0, THEM = 1, BOTH = 2};
|
|
|
|
/**
|
|
* The names are just to distinguish the two different colors.
|
|
*/
|
|
enum {Black = -1, White = +1};
|
|
|
|
/**
|
|
* The default constructor initializes the status to an "empty"
|
|
* state. The board and dice are empty and the cube shows 1.
|
|
*/
|
|
KBgStatus();
|
|
|
|
/**
|
|
* Constructor from a FIBS rawboard string
|
|
*/
|
|
KBgStatus(const QString &rawboard);
|
|
|
|
/**
|
|
* Copy constructor
|
|
*/
|
|
KBgStatus(const KBgStatus &rhs);
|
|
|
|
/**
|
|
* Assignment operator
|
|
*/
|
|
KBgStatus& operator=(const KBgStatus &rhs);
|
|
|
|
/**
|
|
* Destructor
|
|
*/
|
|
virtual ~KBgStatus();
|
|
|
|
|
|
/*
|
|
* The absolute value of the return value is the number of
|
|
* checkers on the i-th field (or zero if i is out of
|
|
* bounds). If the return value has the same sign as the
|
|
* current color of US, it belongs to US, otherwise it belongs
|
|
* to THEM.
|
|
*/
|
|
int board(const int &i) const;
|
|
|
|
/*
|
|
* The absolute value of the return value is the number of
|
|
* checkers on the home of player w (or zero if i is out of
|
|
* bounds). If the return value has the same sign as the
|
|
* current color of US, it belongs to US, otherwise it belongs
|
|
* to THEM.
|
|
*
|
|
* The encoding of the color is slighly redundant. See also board(...).
|
|
*/
|
|
int home(const int &w = US) const;
|
|
|
|
/*
|
|
* The absolute value of the return value is the number of
|
|
* checkers on the bar of player w (or zero if i is out of
|
|
* bounds). If the return value has the same sign as the
|
|
* current color of US, it belongs to US, otherwise it belongs
|
|
* to THEM.
|
|
*
|
|
* The encoding of the color is slighly redundant. See also board(...).
|
|
*/
|
|
int bar(const int &w = US) const;
|
|
|
|
/*
|
|
* Return the current color of player w. If w is invalid, the
|
|
* color of US is returned. The return value will be either
|
|
* Black or White.
|
|
*/
|
|
int color(const int& w = US) const;
|
|
|
|
/*
|
|
* Returns the current direction of the game. It is -1 if US
|
|
* plays from 24 to 1 and +1 if US plays from 1 to 24.
|
|
*/
|
|
int direction() const;
|
|
|
|
/*
|
|
* Returns the n-th dice of player w. If w is invalid or if n
|
|
* is out of bounds, return zero. Also, if the dice haven't
|
|
* been set, zero is returned.
|
|
*/
|
|
int dice(const int &w, const int &n) const;
|
|
|
|
/*
|
|
* Returns the value of the cube. If w can double, the return
|
|
* value is positive, if w may not double, the negative value
|
|
* of the cube is returned. If w is not legal, zero is
|
|
* returned.
|
|
*/
|
|
int cube(const int &w = US) const;
|
|
|
|
/*
|
|
* Return the points of w in th ecurrent game. Negative values
|
|
* indicate that either w was not a legal player ID or that
|
|
* the engine doesn't have any information on points.
|
|
*/
|
|
int points(const int &w) const;
|
|
|
|
/*
|
|
* Return the name of player w. If w is out of bounds or if
|
|
* the player names have not been set, QString::null is
|
|
* returned.
|
|
*/
|
|
QString player(const int &w = US) const;
|
|
|
|
/*
|
|
* Return the length of the game. Negative values should be used to
|
|
* indicate that the game is over. Zero indicates that the game is
|
|
* unlimited.
|
|
*/
|
|
int length() const;
|
|
|
|
/*
|
|
* Return whose turn it is. The possible return values are US,
|
|
* THEM, and NONE.
|
|
*/
|
|
int turn() const;
|
|
|
|
/*
|
|
* Return true if the cube has just been offered. If this
|
|
* information is not available or if this is not the case,
|
|
* return false.
|
|
*/
|
|
bool doubled() const;
|
|
|
|
/*
|
|
* Set the number of checkers of player w on the i-th field to
|
|
* the absolute value of v. If either i or w are out of bound,
|
|
* nothing is done.
|
|
*
|
|
* Internally, positive numbers are stored for US and negative
|
|
* ones for THEM. While this coding is redundant, it is
|
|
* consistent with the storing of board positions.
|
|
*/
|
|
void setBoard(const int &i, const int &w, const int &v);
|
|
|
|
/*
|
|
* Set the number of checkers on the home of player w to the
|
|
* absolute value of v. If w is out of bound, nothing is done.
|
|
*
|
|
* Internally, positive numbers are stored for US and negative
|
|
* ones for THEM. While this coding is redundant, it is
|
|
* consistent with the storing of board positions. See also
|
|
* setBoard(...).
|
|
*/
|
|
void setHome(const int &w = US, const int &v = 0);
|
|
|
|
/*
|
|
* Set the number of checkers on the bar of player w to the
|
|
* absolute value of v. If w is out of bound, nothing is done.
|
|
*
|
|
* Internally, positive numbers are stored for US and negative
|
|
* ones for THEM. While this coding is redundant, it is
|
|
* consistent with the storing of board positions. See also
|
|
* setBoard(...).
|
|
*/
|
|
void setBar(const int &w = US, const int &v = 0);
|
|
|
|
/*
|
|
* This function sets the color of player w to c. Negative
|
|
* values of c translate to Black for US (and White for
|
|
* THEM). Non-negative values for c translate to White for US
|
|
* and Black for THEM.
|
|
*/
|
|
void setColor(const int& col, const int& w = US);
|
|
|
|
/*
|
|
* Set the direction of the game. If dir is negative, US plays
|
|
* from 24 to 1. If dir is positive, US plays from 1 to 24.
|
|
*/
|
|
void setDirection(const int &dir);
|
|
|
|
/*
|
|
* Set the n-th dice of player w to v. Nothing is done if w is
|
|
* invalid or if n is out of bounds. If v is invalid, the
|
|
* value zero is assigned (i.e., the dice is invalidated).
|
|
*/
|
|
void setDice(const int &w, const int &n, const int &v);
|
|
|
|
/*
|
|
* Set the cube to c us indicates if US can double, them
|
|
* indicates if THEM can double.
|
|
*
|
|
* This function is depreciated.
|
|
*/
|
|
void setCube(const int &c, const bool &us, const bool &them);
|
|
|
|
/*
|
|
* Set the cube to c, which must be a legal value (i.e., a
|
|
* power of 2). w indicates who can double. Legal values are
|
|
* NONE, US, THEM, and BOTH.
|
|
*/
|
|
void setCube(const int &c, const int &w);
|
|
|
|
/*
|
|
* Set the points of w in the current game to p. Nothing is
|
|
* done if w is illegal.
|
|
*/
|
|
void setPoints(const int &w, const int &p);
|
|
|
|
/*
|
|
* Set the name of player w to name. If w is out of bound,
|
|
* nothing is done.
|
|
*/
|
|
void setPlayer(const int &w, const QString &name);
|
|
|
|
/*
|
|
* Set the length of the game. Negative values should be used to
|
|
* indicate that the game is over. Zero indicates that the game
|
|
* is unlimited.
|
|
*/
|
|
void setLength(const int &l);
|
|
|
|
/*
|
|
* Set the turn to w. Legal values for w are US, THEM, and
|
|
* NONE (which should indicate that the game is over).
|
|
*/
|
|
void setTurn(const int &w);
|
|
|
|
/*
|
|
* Return the number of possible moves basesd on the current
|
|
* dice, checkers, etc.
|
|
*/
|
|
int moves() const;
|
|
|
|
private:
|
|
|
|
/*
|
|
* Determine if there is any possibility to move a steps
|
|
* anywhere starting from start or later into direction
|
|
* dir in the game given by sc.
|
|
*/
|
|
bool movePossible(KBgStatus &sc, int a, int start, int dir) const;
|
|
|
|
/*
|
|
* Copy constr. and assignment share a lot of code.
|
|
*/
|
|
void copy(const KBgStatus &rhs);
|
|
|
|
/*
|
|
* Private variables with self-expalanatory names.
|
|
*/
|
|
QString player_[2];
|
|
|
|
int board_[26], home_[2], bar_[2], dice_[2][2], points_[2];
|
|
int color_, direction_, cube_, length_, turn_;
|
|
int doubled_;
|
|
|
|
bool maydouble_[2];
|
|
};
|
|
|
|
#endif // KBGSTATUS_H
|