summaryrefslogtreecommitdiffstats
path: root/kjumpingcube/brain.h
diff options
context:
space:
mode:
Diffstat (limited to 'kjumpingcube/brain.h')
-rw-r--r--kjumpingcube/brain.h135
1 files changed, 135 insertions, 0 deletions
diff --git a/kjumpingcube/brain.h b/kjumpingcube/brain.h
new file mode 100644
index 00000000..8f270705
--- /dev/null
+++ b/kjumpingcube/brain.h
@@ -0,0 +1,135 @@
+/* ****************************************************************************
+ This file is part of the game 'KJumpingCube'
+
+ Copyright (C) 1998-2000 by Matthias Kiefer
+ <matthias.kiefer@gmx.de>
+
+ 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.
+
+**************************************************************************** */
+#ifndef BRAIN_H
+#define BRAIN_H
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <krandomsequence.h>
+
+#include "cubebox.h"
+
+/** @internal */
+struct coordinate
+{
+ int row;
+ int column;
+
+ int val;
+};
+
+
+/**
+* Class Brain computes a (good) possibility to move
+* for a given playingfield.
+*
+* It puts a value on every cube by looking at its neighbours
+* and searches the best cubes to move. It then simulates what would
+* happen, if you would click on these cubes. This is done recursively
+* to a certain depth and the playingfield will be valued.
+*
+* @short The games brain
+*/
+class Brain
+{
+public:
+ /**
+ * @param initValue value to initialize the random number generator with
+ * if no value is given a truly random value is used
+ */
+ Brain(int initValue=0);
+
+ /**
+ * Computes a good possible move at the given field.
+ * The index of this Cube is stored in given 'row' and 'column'
+ *
+ * @return false if computing was stopped
+ * @see Brain#stop;
+ */
+ bool getHint(int& row, int& column, CubeBox::Player player, CubeBox field);
+
+ /** stops thinking */
+ void stop();
+ /** @return true if the Brain is thinking at the moment */
+ bool isActive() const;
+
+ /** skill according to Prefs::EnumSkill **/
+ void setSkill(int);
+ int skill() const;
+
+private:
+ /**
+ * checks if a move is possible at cube row,column from player 'player' and
+ * simulates this move. Then it checks the new playingfield for possible moves
+ * and calls itself for every possible move until the maximum depth 'maxLevel'
+ * is reached.
+ *
+ * If the maximum depth is reached, it puts a value on the playingfield and returns this.
+ * @see CubeBox#simulateMove
+ * @see CubeBox#assessField
+ * @see Brain#findCubes2Move
+ *
+ * @param row,column coordinates of cube to increase
+ * @param player for which player the cube has to be increased
+ * @param box playingfield to do the moves on
+ * @return the value put on the field
+ */
+ double doMove(int row,int column,CubeBox::Player player, CubeBox box);
+ /**
+ * Checks the given playingfield, which cubes are favourable to do a move
+ * by checking every cubes neighbours. And looking for the difference to overflow.
+ *
+ * @param c2m Array in which the coordinates of the best cubes to move will be stored
+ * @param player for which player to check
+ * @param box playingfield to check
+ * @param debug if debugmessages should be printed
+ * @return number of found cubes to move
+ */
+ int findCubes2Move(coordinate* c2m,CubeBox::Player player,CubeBox& box);
+ /**
+ *
+ */
+ int assessCube(int row,int column,CubeBox::Player,CubeBox& box) const;
+ int getDiff(int row,int column, CubeBox::Player player, CubeBox& box) const;
+
+ /** current depth of recursive simulating of the moves */
+ int currentLevel;
+ /** maximum depth of recursive thinking */
+ int maxLevel;
+ /** the player for which to check the moves */
+ CubeBox::Player currentPlayer;
+
+
+ /** flag, if the engine has to be stopped */
+ bool stopped;
+ /** flag, if the engine is active */
+ bool active;
+ /** skill of the Brain, see Prefs::EnumSkill */
+ int _skill;
+
+ /** Sequence generator */
+ KRandomSequence random;
+};
+
+#endif //BRAIN_H