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