00001 /* '='='=' '@' '='='='='='='='='=' '@' '='='='='='='='='=' '@' '='='='| */ 00002 /* ='='=' '@'@' '='='='='='='='=' '@'@' '='='='='='='='=' '@'@' '='='=| */ 00003 /* '='=' '@':'@' '='='='='='='=' '@':'@' '='='='='='='=' '@':'@' '='='| */ 00004 /* ='=' '@':':'@' '='='='='='=' '@':':'@' '='='='='='=' '@':':'@' '='=| */ 00005 /* '=' '@':':':'@' '='='='='=' '@':':':'@' '='='='='=' '@':':':'@' '='| */ 00006 /* =' '@':':':':'@' '='='='=' '@':':':':'@' '='='='=' '@':':':':'@' '=| */ 00007 /* ' '@':' '@' '| */ 00008 /* '@' 3rd Year Project - ROY SCHESTOWITZ - 2002 @' | */ 00009 /* '@ @'| */ 00010 /* @':':':':':':':':'@' ' '@':':':':':':':':'@' ' '@':':':':':':':':'@| */ 00011 /* ':':':':':':':':':'@' '@':':':':':':':':':'@' '@':':':':':':':':':'| */ 00012 /* :':':':':':':':':':'@'@':':':':':':':':':':'@'@':':':':':':':':':':| */ 00013 /* ':':':': : :':':':':'@':':':':': : :':':':':'@':':':':': : :':':':'| */ 00014 /* -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- */ 00015 /* Name: computation.h */ 00016 /* Version: 0.6.6 */ 00017 /* Date: 12/2/2003 */ 00018 /* */ 00019 /* Datastructures for the main procedure to compute a */ 00020 /* smart move in the game */ 00021 /* */ 00022 /* -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- */ 00023 00024 /************************************************************************/ 00025 /********************** INCLUDES **************************************/ 00026 /************************************************************************/ 00027 00028 00029 /************************************************************************/ 00030 /********************** DEFINES ***************************************/ 00031 /************************************************************************/ 00032 00033 /************************** Line values *******************************/ 00034 //The following definition are followed by a map showing position X in 00035 //the upper left side of the board 00036 00037 /*==================*/ 00039 /*==================*/ 00040 00041 #define LINE_STRAIGHT_EDGE 5 00042 00043 // X*** 00044 // X*** 00045 // X*** 00046 // X*** 00047 00048 #define LINE_STRAIGHT_NEAR_EDGE 3 00049 00050 // *X** 00051 // *X** 00052 // *X** 00053 // *X** 00054 00055 #define LINE_STRAIGHT_NEAR_MIDDLE 2 00056 00057 // **X* 00058 // **X* 00059 // **X* 00060 // **X* 00061 00062 #define LINE_STRAIGHT_MIDDLE 2 00063 00064 // ***X 00065 // ***X 00066 // ***X 00067 // ***X 00068 00069 00070 /*==================*/ 00072 /*==================*/ 00073 00074 #define LINE_DIAGONAL_MIDDLE 5 00075 00076 // X******* 00077 // *X****** 00078 // **X***** 00079 // ***X**** 00080 // ****X*** 00081 // *****X** 00082 // ******X* 00083 // *******X 00084 00085 #define LINE_DIAGONAL_NEAR_MIDDLE 4 00086 00087 // ******** 00088 // X******* 00089 // *X****** 00090 // **X***** 00091 // ***X**** 00092 // ****X*** 00093 // *****X** 00094 // ******X* 00095 00096 #define LINE_DIAGONAL_BETWEEN_MIDDLE_AND_CORNER 3 00097 00098 // ******** 00099 // ******** 00100 // X******* 00101 // *X****** 00102 // **X***** 00103 // ***X**** 00104 // ****X*** 00105 // *****X** 00106 00107 #define LINE_DIAGONAL_NEAR_CORNER 2 00108 00109 // ******** 00110 // ******** 00111 // ******** 00112 // X******* 00113 // *X****** 00114 // **X***** 00115 // ***X**** 00116 // ****X*** 00117 00118 #define LINE_DIAGONAL_CORNER 1 00119 00120 // ******** 00121 // ******** 00122 // ******** 00123 // ******** 00124 // X******* 00125 // *X****** 00126 // **X***** 00127 // ***X**** 00128 00129 /*=============================*/ 00131 /*=============================*/ 00132 00133 #define INCOMPLETE_LINE_STRAIGHT_EDGE 4 00134 00135 // **** 00136 // X*** 00137 // X*** 00138 // X*** 00139 // X*** 00140 // X*** 00141 // X*** 00142 // X*** 00143 // 00144 // OR 00145 // 00146 // X*** 00147 // X*** 00148 // X*** 00149 // X*** 00150 // X*** 00151 // X*** 00152 // X*** 00153 // **** 00154 00155 #define INCOMPLETE_LINE_STRAIGHT_NEAR_EDGE 3 00156 00157 // **** 00158 // *X** 00159 // *X** 00160 // *X** 00161 // *X** 00162 // *X** 00163 // *X** 00164 // *X** 00165 // 00166 // OR 00167 // 00168 // *X** 00169 // *X** 00170 // *X** 00171 // *X** 00172 // *X** 00173 // *X** 00174 // *X** 00175 // **** 00176 00177 #define INCOMPLETE_LINE_STRAIGHT_NEAR_MIDDLE 2 00178 00179 // **** 00180 // **X* 00181 // **X* 00182 // **X* 00183 // **X* 00184 // **X* 00185 // **X* 00186 // **X* 00187 // 00188 // OR 00189 // 00190 // **X* 00191 // **X* 00192 // **X* 00193 // **X* 00194 // **X* 00195 // **X* 00196 // **X* 00197 // **** 00198 00199 #define INCOMPLETE_LINE_STRAIGHT_MIDDLE 2 00200 00201 // **** 00202 // ***X 00203 // ***X 00204 // ***X 00205 // ***X 00206 // ***X 00207 // ***X 00208 // ***X 00209 // 00210 // OR 00211 // 00212 // ***X 00213 // ***X 00214 // ***X 00215 // ***X 00216 // ***X 00217 // ***X 00218 // ***X 00219 // **** 00220 00221 00222 00223 /*=============================*/ 00225 /*=============================*/ 00226 00227 #define INCOMPLETE_LINE_DIAGONAL_MIDDLE 5 00228 00229 // X******* 00230 // *X****** 00231 // **X***** 00232 // ***X**** 00233 // ****X*** 00234 // *****X** 00235 // ******X* 00236 // ******** 00237 // 00238 // OR 00239 // 00240 // ******** 00241 // *X****** 00242 // **X***** 00243 // ***X**** 00244 // ****X*** 00245 // *****X** 00246 // ******X* 00247 // *******X 00248 00249 #define INCOMPLETE_LINE_DIAGONAL_NEAR_MIDDLE 4 00250 00251 // ******** 00252 // X******* 00253 // *X****** 00254 // **X***** 00255 // ***X**** 00256 // ****X*** 00257 // *****X** 00258 // ******** 00259 // 00260 // OR 00261 // 00262 // ******** 00263 // ******** 00264 // *X****** 00265 // **X***** 00266 // ***X**** 00267 // ****X*** 00268 // *****X** 00269 // ******X* 00270 #define INCOMPLETE_LINE_DIAGONAL_BETWEEN_MIDDLE_AND_CORNER 3 00271 00272 // ******** 00273 // ******** 00274 // X******* 00275 // *X****** 00276 // **X***** 00277 // ***X**** 00278 // ****X*** 00279 // ******** 00280 // 00281 // OR 00282 // 00283 // ******** 00284 // ******** 00285 // ******** 00286 // *X****** 00287 // **X***** 00288 // ***X**** 00289 // ****X*** 00290 // *****X** 00291 00292 #define INCOMPLETE_LINE_DIAGONAL_NEAR_CORNER 2 00293 00294 // ******** 00295 // ******** 00296 // ******** 00297 // X******* 00298 // *X****** 00299 // **X***** 00300 // ***X**** 00301 // ******** 00302 // 00303 // OR 00304 // 00305 // ******** 00306 // ******** 00307 // ******** 00308 // ******** 00309 // *X****** 00310 // **X***** 00311 // ***X**** 00312 // ****X*** 00313 00314 #define INCOMPLETE_LINE_DIAGONAL_CORNER 1 00315 00316 // ******** 00317 // ******** 00318 // ******** 00319 // ******** 00320 // ******** 00321 // *X****** 00322 // **X***** 00323 // ***X**** 00324 // 00325 // OR 00326 // 00327 // ******** 00328 // ******** 00329 // ******** 00330 // ******** 00331 // X******* 00332 // *X****** 00333 // **X***** 00334 // ******** 00335 00336 00337 00338 /************************** Position values *******************************/ 00339 //The following definition are followed by a map showing position X in 00340 //the upper left side of the board 00341 00342 #define CORNER_POS 10000 00343 00344 // X*** 00345 // **** 00346 // **** 00347 // **** 00348 00349 #define SIDE_MIDDLE_POS 800 00350 00351 // ***X 00352 // **** 00353 // **** 00354 // X*** 00355 00356 #define SIDE_FAR_POS 1000 00357 00358 // **X* 00359 // **** 00360 // X*** 00361 // **** 00362 00363 #define MIDDLE_4_POS 50 00364 00365 // **** 00366 // **** 00367 // **** 00368 // ***X 00369 00370 #define MIDDLE_8_POS 10 00371 00372 // **** 00373 // **** 00374 // ***X 00375 // **X* 00376 00377 #define MIDDLE_DIAGONAL_4_POS 30 00378 00379 // **** 00380 // **** 00381 // **X* 00382 // **** 00383 00384 #define NEAR_SIDES_MIDDLE_POS -500 00385 00386 // **** 00387 // ***X 00388 // **** 00389 // *X** 00390 00391 #define NEAR_SIDES_FAR_POS -450 00392 00393 // **** 00394 // **X* 00395 // *X** 00396 // **** 00397 00398 #define DIAGONAL_NEAR_CORNER_POS -5000 00399 00400 // **** 00401 // *X** 00402 // **** 00403 // **** 00404 00405 #define SIDES_NEAR_CORNER_POS -3000 00406 00407 // *X** 00408 // X*** 00409 // **** 00410 // **** 00411 00412 00413 00414 /***************************/ 00416 /***************************/ 00417 00418 #define EVALUATE_POSITION_ACTIVE 1 00419 // sets the evaluation by positions of stones 00420 00421 #define EVALUATE_MOBILITY_ACTIVE 1 00422 // sets the evaluation by mobility difference 00423 00424 #define EVALUATE_SCORE_ACTIVE 1 00425 // sets the evaluation by score difference 00426 00427 #define EVALUATE_LINES_ACTIVE 1 00428 // sets the evaluation by control of lines 00429 00430 00431 /********************************/ 00433 /********************************/ 00434 00435 #define STRAIGHT_COMPLETE_LINES_ACTIVE 1 00436 // complete straight lines 00437 00438 #define DIAGONAL_COMPLETE_LINES_ACTIVE 1 00439 // complete diagonal lines 00440 00441 #define STRAIGHT_INCOMPLETE_LINES_ACTIVE 1 00442 // incomplete straight lines 00443 00444 #define DIAGONAL_INCOMPLETE_LINES_ACTIVE 1 00445 // incomplete diagonal lines 00446 00447 00448 /************************************************/ 00449 /********* Evaluation Coefficients **************/ 00450 /************************************************/ 00451 00452 #define SCORE_COEFFICIENT 50 00453 // defines the number of points a score unit is worth 00454 00455 #define MOBILITY_COEFFICIENT 70 00456 // defines the number of points a mobility unit is worth 00457 00458 #define POSITION_VALUE_COEFFICIENT 1 00459 // defines the coefficient of a given position value 00460 00461 #define LINE_STATE_COEFFICIENT 1 00462 // defines the coefficient of a lines value 00463 00464 /************************/ 00466 /************************/ 00467 00468 #define LINING_COEFFICIENT_STRAIGHT_COMPLETE 12 00469 // defines the coefficient of a given straight line layout value 00470 00471 #define LINING_COEFFICIENT_DIAGONAL_COMPLETE 10 00472 // defines the coefficient of a given diagonal line layout value 00473 00474 #define LINING_COEFFICIENT_STRAIGHT_INCOMPLETE 5 00475 // defines the coefficient of a given straight incomplete line layout value 00476 00477 #define LINING_COEFFICIENT_DIAGONAL_INCOMPLETE 4 00478 // defines the coefficient of a given diagonal incomplete line layout value 00479 00480 /******************/ 00482 /******************/ 00483 00484 00485 #define MOVE_FACTOR 100 00486 // the initial factor for a given possible move 00487 00488 #define MOVE_FACTOR_DIVIDER 10 00489 // the dynamic behaviour of the factor - the speed it grows smaller 00490 00491 #define MOVES_UPPER_BOUND 60 00492 // defines the upper bound of moves available 00493 00494 #define SCORE_LOWER_BOUND -10000000 00495 // defines the minimum score obtainable - lower bound 00496 00497 /************************/ 00499 /************************/ 00500 00501 #define BEGINNER_RANDOMISATION_KEY 4 00502 // Defines the number N which in the expression N/100 defines the chance 00503 // that a given move will be taken in the difficulty beginner 00504 // it also defines the maximum offset (pre-cent) added to an evaluation 00505 00506 #define NOVICE_RANDOMISATION_KEY 5 00507 // Defines the maximum offset (pre-cent) added to an evaluation 00508 // when the the current difficulty is novice 00509 00510 #define EXPERT_RANDOMISATION_KEY 4 00511 // Defines the maximum offset (pre-cent) added to an evaluation 00512 // when the the current difficulty is expert 00513 00514 #define PRE_MASTER_RANDOMISATION_KEY 6 00515 // Defines the maximum offset (pre-cent) added to an evaluation 00516 // when the the current difficulty is pre-master 00517 00518 #define MASTER_RANDOMISATION_KEY 6 00519 // Defines the maximum offset (pre-cent) added to an evaluation 00520 // when the the current difficulty is master 00521 00522 /************************/ 00524 /************************/ 00525 00526 #define OPENING_LIBRARY_HASH_SIZE 50 00527 //The size of the hashtable that stores the opening library 00528 00529 00530 /************************************************************************/ 00531 /********************** DATA STRUCTURES *******************************/ 00532 /************************************************************************/ 00533 00534 typedef struct 00535 { 00536 int score; 00537 int i; 00538 int j; 00539 } 00540 move_score; 00541 00542 /************************************************************************/ 00543 /********************** PROTOTYPES ************************************/ 00544 /************************************************************************/ 00545 00546 /*******************/ 00548 /*******************/ 00549 00550 void cpu_move ( int color ); 00551 board_map compute_move_for_color ( board_map inputboard, int color ); 00552 board_map make_nth_best_move ( board_map inputboard, int color, 00553 int priority ); 00554 00555 /******************/ 00557 /******************/ 00558 00559 int calculate_mobility_difference_of_board ( board_map inputboard, 00560 int color ); 00561 int calculate_score_difference_of_board ( board_map inputboard, int color ); 00562 int get_mobility_of_color ( board_map inputboard, int color ); 00563 00564 /******************/ 00566 /******************/ 00567 00568 int find_value_of_position ( int i, int j, int color ); 00569 int evaluate ( int, board_map ); 00570 int evaluate_lines ( board_map input_board, int color ); 00571 00572 /***************************/ 00574 /***************************/ 00575 00576 int evaluate_straight_lines_complete ( board_map input_board, int color ); 00577 int evaluate_diagonal_lines_complete ( board_map input_board, int color ); 00578 int evaluate_straight_lines_incomplete ( board_map input_board, int color ); 00579 int evaluate_diagonal_lines_incomplete ( board_map input_board, int color ); 00580 00581 00582 /************/ 00584 /************/ 00585 00586 int zero_one_random ( void ); 00587 int random_number ( int N ); 00588 void init_opening_library ( void ); 00589 char *find_board_state_ident ( void ); 00590 int load_opening_library_file ( char *filename ); 00591 00592 /* */ 00593 /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ 00594 /* end of computation.h */ 00595 /************************************************************************/