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 KBLOCKSAIFEATURE_H
0008 #define KBLOCKSAIFEATURE_H
0009 
0010 #include "KBlocksAITypeDefine.h"
0011 #include "EvaluationInterface.h"
0012 
0013 #include "../KBlocksField.h"
0014 #include "../KBlocksPiece.h"
0015 
0016 /*******************************************************
0017 ****   Feature  List   ********************************
0018 *******************************************************/
0019 
0020 enum FeatureEnumeration {
0021     FEATURE_MAX_HEIGHT,
0022     FEATURE_HOLES_COUNT,
0023     FEATURE_CLOSED_HOLES_COUNT,
0024     FEATURE_WELLS_COUNT,
0025     FEATURE_AVERAGE_HEIGHT,
0026     FEATURE_AVERAGE_HEIGHT_DIFFERENT,
0027     FEATURE_MAX_HEIGHT_DIFFERENT,
0028     FEATURE_KONTUR_COUNT,
0029     FEATURE_MAX_KONTUR_LENGTH,
0030     FEATURE_BLOCKS_COUNT,
0031     FEATURE_BLOCKS_OVER_HOLES_COUNT,
0032     FEATURE_WEIGHTED_BLOCKS_COUNT,
0033     FEATURE_ROW_TRANSITION_COUNT,
0034     FEATURE_COLUMN_TRANSITION_COUNT,
0035     FEATURE_MAX_WELL_DEPTH,
0036     FEATURE_NARROW_COUNT,
0037     FEATURE_PREDICTION_COUNT,
0038     FEATURE_COUNT
0039 };
0040 
0041 enum SpecialFeatureEnumeration {
0042     FEATURE_REMOVE_LINES,
0043     FEATURE_LANDING_HEIGHT
0044 };
0045 
0046 double getFeature(const FeatureEnumeration, KBlocksField *);
0047 const char *getFeatureName(const FeatureEnumeration);
0048 double getSpecialFeature(const SpecialFeatureEnumeration, KBlocksField *, KBlocksField *, KBlocksPiece *);
0049 void update_board_signature(KBlocksField *field);
0050 void set_ground_line(int);
0051 
0052 /*******************************************************
0053 ****   Feature     ************************************
0054 *******************************************************/
0055 class Evaluation_Max_Height: public EvaluationInterface
0056 {
0057 public:
0058     double evaluate(KBlocksField *) override;
0059     static Evaluation_Max_Height *instance()
0060     {
0061         if (_instance == nullptr) {
0062             _instance = new Evaluation_Max_Height();
0063         }
0064         return _instance;
0065     }
0066     CLASSNAME(Evaluation_Max_Height)
0067 private:
0068     Evaluation_Max_Height() {}
0069     ~Evaluation_Max_Height() override {}
0070     static Evaluation_Max_Height *_instance;
0071 };
0072 //------------------------------------------------------
0073 class  Evaluation_Holes_Count: public EvaluationInterface
0074 {
0075 public:
0076     double evaluate(KBlocksField *) override;
0077     static Evaluation_Holes_Count *instance()
0078     {
0079         if (_instance == nullptr) {
0080             _instance = new Evaluation_Holes_Count();
0081         }
0082         return _instance;
0083     }
0084     CLASSNAME(Evaluation_Holes_Count)
0085 private:
0086     Evaluation_Holes_Count() {}
0087     ~Evaluation_Holes_Count() override {}
0088     static Evaluation_Holes_Count *_instance;
0089 };
0090 //------------------------------------------------------
0091 class  Evaluation_Average_Height: public EvaluationInterface
0092 {
0093 public:
0094     double evaluate(KBlocksField *) override;
0095     static Evaluation_Average_Height *instance()
0096     {
0097         if (_instance == nullptr) {
0098             _instance = new Evaluation_Average_Height();
0099         }
0100         return _instance;
0101     }
0102     CLASSNAME(Evaluation_Average_Height)
0103 private:
0104     Evaluation_Average_Height() {}
0105     ~Evaluation_Average_Height() override {}
0106     static Evaluation_Average_Height *_instance;
0107 };
0108 //------------------------------------------------------
0109 class  Evaluation_Max_Height_Difference: public EvaluationInterface
0110 {
0111 public:
0112     double evaluate(KBlocksField *) override;
0113     static Evaluation_Max_Height_Difference *instance()
0114     {
0115         if (_instance == nullptr) {
0116             _instance = new Evaluation_Max_Height_Difference();
0117         }
0118         return _instance;
0119     }
0120     CLASSNAME(Evaluation_Max_Height_Difference)
0121 private:
0122     Evaluation_Max_Height_Difference() {}
0123     ~Evaluation_Max_Height_Difference() override {}
0124     static Evaluation_Max_Height_Difference *_instance;
0125 };
0126 //------------------------------------------------------
0127 class  Evaluation_Average_Height_Difference: public EvaluationInterface
0128 {
0129 public:
0130     double evaluate(KBlocksField *) override;
0131     static Evaluation_Average_Height_Difference *instance()
0132     {
0133         if (_instance == nullptr) {
0134             _instance = new Evaluation_Average_Height_Difference();
0135         }
0136         return _instance;
0137     }
0138     CLASSNAME(Evaluation_Average_Height_Difference)
0139 private:
0140     Evaluation_Average_Height_Difference() {}
0141     ~Evaluation_Average_Height_Difference() override {}
0142     static Evaluation_Average_Height_Difference *_instance;
0143 };
0144 //------------------------------------------------------
0145 class  Evaluation_Kontur_Count: public EvaluationInterface
0146 {
0147 public:
0148     double evaluate(KBlocksField *) override;
0149     static Evaluation_Kontur_Count *instance()
0150     {
0151         if (_instance == nullptr) {
0152             _instance = new Evaluation_Kontur_Count();
0153         }
0154         return _instance;
0155     }
0156     CLASSNAME(Evaluation_Kontur_Count)
0157 private:
0158     Evaluation_Kontur_Count() {}
0159     ~Evaluation_Kontur_Count() override {}
0160     static Evaluation_Kontur_Count *_instance;
0161 };
0162 //------------------------------------------------------
0163 class  Evaluation_Max_Kontur_Length: public EvaluationInterface
0164 {
0165 public:
0166     double evaluate(KBlocksField *) override;
0167     static Evaluation_Max_Kontur_Length *instance()
0168     {
0169         if (_instance == nullptr) {
0170             _instance = new Evaluation_Max_Kontur_Length();
0171         }
0172         return _instance;
0173     }
0174     CLASSNAME(Evaluation_Max_Kontur_Length)
0175 private:
0176     Evaluation_Max_Kontur_Length() {}
0177     ~Evaluation_Max_Kontur_Length() override {}
0178     static Evaluation_Max_Kontur_Length *_instance;
0179 };
0180 //------------------------------------------------------
0181 class  Evaluation_Closed_Holes_Count: public EvaluationInterface
0182 {
0183 public:
0184     double evaluate(KBlocksField *) override;
0185     static Evaluation_Closed_Holes_Count *instance()
0186     {
0187         if (_instance == nullptr) {
0188             _instance = new Evaluation_Closed_Holes_Count();
0189         }
0190         return _instance;
0191     }
0192     CLASSNAME(Evaluation_Closed_Holes_Count)
0193 private:
0194     Evaluation_Closed_Holes_Count() {}
0195     ~Evaluation_Closed_Holes_Count() override {}
0196     static Evaluation_Closed_Holes_Count *_instance;
0197 };
0198 //------------------------------------------------------
0199 class  Evaluation_Wells_Count: public EvaluationInterface
0200 {
0201 public:
0202     double evaluate(KBlocksField *) override;
0203     static Evaluation_Wells_Count *instance()
0204     {
0205         if (_instance == nullptr) {
0206             _instance = new Evaluation_Wells_Count();
0207         }
0208         return _instance;
0209     }
0210     CLASSNAME(Evaluation_Wells_Count)
0211 private:
0212     Evaluation_Wells_Count() {}
0213     ~Evaluation_Wells_Count() override {}
0214     static Evaluation_Wells_Count *_instance;
0215 };
0216 //------------------------------------------------------
0217 class  Evaluation_Blocks_Count: public EvaluationInterface
0218 {
0219 public:
0220     double evaluate(KBlocksField *) override;
0221     static Evaluation_Blocks_Count *instance()
0222     {
0223         if (_instance == nullptr) {
0224             _instance = new Evaluation_Blocks_Count();
0225         }
0226         return _instance;
0227     }
0228     CLASSNAME(Evaluation_Blocks_Count)
0229 private:
0230     Evaluation_Blocks_Count() {}
0231     ~Evaluation_Blocks_Count() override {}
0232     static Evaluation_Blocks_Count *_instance;
0233 };
0234 //------------------------------------------------------
0235 class  Evaluation_Blocks_Over_Holes_Count: public EvaluationInterface
0236 {
0237 public:
0238     double evaluate(KBlocksField *) override;
0239     static Evaluation_Blocks_Over_Holes_Count *instance()
0240     {
0241         if (_instance == nullptr) {
0242             _instance = new Evaluation_Blocks_Over_Holes_Count();
0243         }
0244         return _instance;
0245     }
0246     CLASSNAME(Evaluation_Blocks_Over_Holes_Count)
0247 private:
0248     Evaluation_Blocks_Over_Holes_Count() {}
0249     ~Evaluation_Blocks_Over_Holes_Count() override {}
0250     static Evaluation_Blocks_Over_Holes_Count *_instance;
0251 };
0252 //------------------------------------------------------
0253 class Evaluation_Weighted_Blocks_Count: public EvaluationInterface
0254 {
0255 public:
0256     double evaluate(KBlocksField *) override;
0257     static Evaluation_Weighted_Blocks_Count *instance()
0258     {
0259         if (_instance == nullptr) {
0260             _instance = new Evaluation_Weighted_Blocks_Count();
0261         }
0262         return _instance;
0263     }
0264     CLASSNAME(Evaluation_Weighted_Blocks_Count)
0265 private:
0266     Evaluation_Weighted_Blocks_Count() {}
0267     ~Evaluation_Weighted_Blocks_Count() override {}
0268     static Evaluation_Weighted_Blocks_Count *_instance;
0269 };
0270 //------------------------------------------------------
0271 class Evaluation_Row_Transition_Count: public EvaluationInterface
0272 {
0273 public:
0274     double evaluate(KBlocksField *) override;
0275     static Evaluation_Row_Transition_Count *instance()
0276     {
0277         if (_instance == nullptr) {
0278             _instance = new Evaluation_Row_Transition_Count();
0279         }
0280         return _instance;
0281     }
0282     CLASSNAME(Evaluation_Row_Transition_Count)
0283 private:
0284     Evaluation_Row_Transition_Count() {}
0285     ~Evaluation_Row_Transition_Count() override {}
0286     static Evaluation_Row_Transition_Count *_instance;
0287 };
0288 //------------------------------------------------------
0289 class Evaluation_Column_Transition_Count: public EvaluationInterface
0290 {
0291 public:
0292     double evaluate(KBlocksField *) override;
0293     static Evaluation_Column_Transition_Count *instance()
0294     {
0295         if (_instance == nullptr) {
0296             _instance = new Evaluation_Column_Transition_Count();
0297         }
0298         return _instance;
0299     }
0300     CLASSNAME(Evaluation_Column_Transition_Count)
0301 private:
0302     Evaluation_Column_Transition_Count() {}
0303     ~Evaluation_Column_Transition_Count() override {}
0304     static Evaluation_Column_Transition_Count *_instance;
0305 };
0306 //------------------------------------------------------
0307 class Evaluation_Narrow_Count: public EvaluationInterface
0308 {
0309 public:
0310     double evaluate(KBlocksField *) override;
0311     static Evaluation_Narrow_Count *instance()
0312     {
0313         if (_instance == nullptr) {
0314             _instance = new Evaluation_Narrow_Count();
0315         }
0316         return _instance;
0317     }
0318     CLASSNAME(Evaluation_Narrow_Count)
0319 private:
0320     Evaluation_Narrow_Count() {}
0321     ~Evaluation_Narrow_Count() override {}
0322     static Evaluation_Narrow_Count *_instance;
0323 };
0324 //------------------------------------------------------
0325 class Evaluation_Prediction_Count: public EvaluationInterface
0326 {
0327 public:
0328     double evaluate(KBlocksField *) override;
0329     static Evaluation_Prediction_Count *instance()
0330     {
0331         if (_instance == nullptr) {
0332             _instance = new Evaluation_Prediction_Count();
0333         }
0334         return _instance;
0335     }
0336     CLASSNAME(Evaluation_Prediction_Count)
0337 private:
0338     Evaluation_Prediction_Count() {}
0339     ~Evaluation_Prediction_Count() override {}
0340     static Evaluation_Prediction_Count *_instance;
0341 };
0342 //------------------------------------------------------
0343 class Evaluation_Max_Well_Depth: public EvaluationInterface
0344 {
0345 public:
0346     double evaluate(KBlocksField *) override;
0347     static Evaluation_Max_Well_Depth *instance()
0348     {
0349         if (_instance == nullptr) {
0350             _instance = new Evaluation_Max_Well_Depth();
0351         }
0352         return _instance;
0353     }
0354     CLASSNAME(Evaluation_Max_Well_Depth)
0355 private:
0356     Evaluation_Max_Well_Depth() {}
0357     ~Evaluation_Max_Well_Depth() override {}
0358     static Evaluation_Max_Well_Depth *_instance;
0359 };
0360 
0361 //# SPECIAL FEATURE #######################################
0362 class Evaluation_Remove_Lines: public SpecialEvaluationInterface
0363 {
0364 public:
0365     double evaluate(KBlocksField *) override;
0366     static Evaluation_Remove_Lines *instance()
0367     {
0368         if (_instance == nullptr) {
0369             _instance = new Evaluation_Remove_Lines();
0370         }
0371         return _instance;
0372     }
0373     CLASSNAME(Evaluation_Remove_Lines)
0374 private:
0375     Evaluation_Remove_Lines() {}
0376     ~Evaluation_Remove_Lines() override {}
0377     static Evaluation_Remove_Lines *_instance;
0378 };
0379 //------------------------------------------------------
0380 class Evaluation_Landing_Height: public SpecialEvaluationInterface
0381 {
0382 public:
0383     double evaluate(KBlocksField *) override;
0384     static Evaluation_Landing_Height *instance()
0385     {
0386         if (_instance == nullptr) {
0387             _instance = new Evaluation_Landing_Height();
0388         }
0389         return _instance;
0390     }
0391     CLASSNAME(Evaluation_Landing_Height)
0392 private:
0393     Evaluation_Landing_Height() {}
0394     ~Evaluation_Landing_Height() override {}
0395     static Evaluation_Landing_Height *_instance;
0396 };
0397 
0398 #endif //KBLOCKSAIFEATURE_H