File indexing completed on 2024-04-28 04:01:56

0001 /***************************************************************************
0002 *   KBlocks, a falling blocks game by KDE                                 *
0003 *   SPDX-FileCopyrightText: 2010 University Freiburg <squall.leonhart.cai@gmail.com> *
0004 *                                                                          *
0005 *   SPDX-License-Identifier: GPL-2.0-or-later
0006 ***************************************************************************/
0007 #ifndef KBLOCKSAIEVALUATION_H
0008 #define KBLOCKSAIEVALUATION_H
0009 
0010 #include "KBlocksAITypeDefine.h"
0011 
0012 #include "EvaluationInterface.h"
0013 
0014 #include "../KBlocksField.h"
0015 
0016 enum DecisionFeatureEnumeration {
0017     DF_HEIGHT_MAX,
0018     DF_PEEKS_COUNT,
0019     DF_BLOCK_SCAN,
0020     DF_LAYER_SCAN,
0021     DF_CREATING_TETRIS,
0022     DF_REMOVE_TETRIS,
0023     DF_DEEP_NARROW
0024 };
0025 
0026 bool getDecisionFeature(const DecisionFeatureEnumeration, KBlocksField *);
0027 
0028 /******************************************************
0029 ****   Evaluation Function    *************************
0030 *******************************************************/
0031 class BaseEvaluation : public EvaluationInterface
0032 {
0033 public:
0034     double evaluate(KBlocksField *) override;
0035     static BaseEvaluation *instance()
0036     {
0037         if (_instance == nullptr) {
0038             _instance = new BaseEvaluation();
0039         }
0040         return _instance;
0041     }
0042     CLASSNAME(BaseEvaluation)
0043 
0044 private:
0045     BaseEvaluation() {};
0046     ~BaseEvaluation() override {};
0047     static BaseEvaluation *_instance;
0048 };
0049 /*###################################################*/
0050 class HalfBaseEvaluation : public EvaluationInterface
0051 {
0052 public:
0053     double evaluate(KBlocksField *) override;
0054     static HalfBaseEvaluation *instance()
0055     {
0056         if (_instance == nullptr) {
0057             _instance = new HalfBaseEvaluation();
0058         }
0059         return _instance;
0060     }
0061     CLASSNAME(HalfBaseEvaluation)
0062 
0063 private:
0064     HalfBaseEvaluation() {};
0065     ~HalfBaseEvaluation() override {};
0066     static HalfBaseEvaluation *_instance;
0067 };
0068 /*###################################################*/
0069 class WellsFillerEvaluation : public EvaluationInterface
0070 {
0071 public:
0072     double evaluate(KBlocksField *) override;
0073     static WellsFillerEvaluation *instance()
0074     {
0075         if (_instance == nullptr) {
0076             _instance = new WellsFillerEvaluation();
0077         }
0078         return _instance;
0079     }
0080     CLASSNAME(WellsFillerEvaluation)
0081 
0082 private:
0083     WellsFillerEvaluation() {};
0084     ~WellsFillerEvaluation() override {};
0085     static WellsFillerEvaluation *_instance;
0086 };
0087 /*###################################################*/
0088 class HeightKillerEvaluation : public EvaluationInterface
0089 {
0090 public:
0091     double evaluate(KBlocksField *) override;
0092     static HeightKillerEvaluation *instance()
0093     {
0094         if (_instance == nullptr) {
0095             _instance = new HeightKillerEvaluation();
0096         }
0097         return _instance;
0098     }
0099     CLASSNAME(HeightKillerEvaluation)
0100 
0101 private:
0102     HeightKillerEvaluation() {};
0103     ~HeightKillerEvaluation() override {};
0104     static HeightKillerEvaluation *_instance;
0105 };
0106 /*###################################################*/
0107 class BlockRemoverEvaluation : public EvaluationInterface
0108 {
0109 public:
0110     double evaluate(KBlocksField *) override;
0111     static BlockRemoverEvaluation *instance()
0112     {
0113         if (_instance == nullptr) {
0114             _instance = new BlockRemoverEvaluation();
0115         }
0116         return _instance;
0117     }
0118     CLASSNAME(BlockRemoverEvaluation)
0119 
0120 private:
0121     BlockRemoverEvaluation() {};
0122     ~BlockRemoverEvaluation() override {};
0123     static BlockRemoverEvaluation *_instance;
0124 };
0125 /*###################################################*/
0126 class DeepNarrowRemoverEvaluation : public EvaluationInterface
0127 {
0128 public:
0129     double evaluate(KBlocksField *) override;
0130     static DeepNarrowRemoverEvaluation *instance()
0131     {
0132         if (_instance == nullptr) {
0133             _instance = new DeepNarrowRemoverEvaluation();
0134         }
0135         return _instance;
0136     }
0137     CLASSNAME(DeepNarrowRemoverEvaluation)
0138 
0139 private:
0140     DeepNarrowRemoverEvaluation() {};
0141     ~DeepNarrowRemoverEvaluation() override {};
0142     static DeepNarrowRemoverEvaluation *_instance;
0143 };
0144 /*###################################################*/
0145 class TetrisPreparingEvaluation : public EvaluationInterface
0146 {
0147 public:
0148     double evaluate(KBlocksField *) override;
0149     static TetrisPreparingEvaluation *instance()
0150     {
0151         if (_instance == nullptr) {
0152             _instance = new TetrisPreparingEvaluation();
0153         }
0154         return _instance;
0155     }
0156     CLASSNAME(TetrisPreparingEvaluation)
0157 
0158 private:
0159     TetrisPreparingEvaluation() {};
0160     ~TetrisPreparingEvaluation() override {};
0161     static TetrisPreparingEvaluation *_instance;
0162 };
0163 /*###################################################*/
0164 class TetrisEliminationEvaluation : public EvaluationInterface
0165 {
0166 public:
0167     double evaluate(KBlocksField *) override;
0168     static TetrisEliminationEvaluation *instance()
0169     {
0170         if (_instance == nullptr) {
0171             _instance = new TetrisEliminationEvaluation();
0172         }
0173         return _instance;
0174     }
0175     CLASSNAME(TetrisEliminationEvaluation)
0176 
0177 private:
0178     TetrisEliminationEvaluation() {};
0179     ~TetrisEliminationEvaluation() override {};
0180     static TetrisEliminationEvaluation *_instance;
0181 };
0182 /*###################################################*/
0183 class NBSEvaluation : public SpecialEvaluationInterface
0184 {
0185 public:
0186     double evaluate(KBlocksField *) override;
0187     static NBSEvaluation *instance()
0188     {
0189         if (_instance == nullptr) {
0190             _instance = new NBSEvaluation();
0191         }
0192         return _instance;
0193     }
0194     CLASSNAME(NBSEvaluation)
0195 
0196 private:
0197     NBSEvaluation() {};
0198     ~NBSEvaluation() override {};
0199     static NBSEvaluation *_instance;
0200 };
0201 /*###################################################*/
0202 
0203 #endif //KBLOCKSAIEVALUATION_H