A chess library for Gleam

Pregenerate hash data to make computing hashes faster

+1499 -133
+67
dev/starfish_dev.gleam
··· 1 + import gleam/int 2 + import simplifile as file 3 + import starfish/internal/board 4 + 5 + const generated_file_path = "src/starfish/internal/generated.gleam" 6 + 7 + const piece_count = 12 8 + 9 + pub fn main() { 10 + let imports = 11 + "import starfish/internal/board.{Pawn, Knight, Bishop, Rook, Queen, King, White, Black}" 12 + 13 + let generated_code = imports <> "\n\n" <> generate_hash_data() <> "\n" 14 + let assert Ok(Nil) = 15 + file.write(to: generated_file_path, contents: generated_code) 16 + } 17 + 18 + const max_60_bit_int = 576_460_752_303_423_500 19 + 20 + fn generate_hash_data() -> String { 21 + let function_head = 22 + "pub fn hash_for_piece(piece: board.Piece, colour: board.Colour, position: Int) -> Int { 23 + case piece, colour, position {" 24 + let length = piece_count * board.size 25 + let hash_for_piece = generate_hash_data_loop(function_head, 0, length) 26 + let black_to_move = 27 + "pub const black_to_move_hash = 0x" 28 + <> int.to_base16(int.random(max_60_bit_int)) 29 + 30 + hash_for_piece <> "\n\n" <> black_to_move 31 + } 32 + 33 + fn generate_hash_data_loop(acc: String, generated: Int, length: Int) -> String { 34 + case generated >= length { 35 + True -> acc <> "\n }\n}" 36 + False -> { 37 + let position = generated / piece_count 38 + let position = case position == board.size - 1 { 39 + True -> "_" 40 + False -> int.to_string(position) 41 + } 42 + let piece = case generated % piece_count { 43 + 0 -> "Pawn, White" 44 + 1 -> "Pawn, Black" 45 + 2 -> "Knight, White" 46 + 3 -> "Knight, Black" 47 + 4 -> "Bishop, White" 48 + 5 -> "Bishop, Black" 49 + 6 -> "Rook, White" 50 + 7 -> "Rook, Black" 51 + 8 -> "Queen, White" 52 + 9 -> "Queen, Black" 53 + 10 -> "King, White" 54 + _11 -> "King, Black" 55 + } 56 + let acc = 57 + acc 58 + <> "\n " 59 + <> piece 60 + <> ", " 61 + <> position 62 + <> " -> 0x" 63 + <> int.to_base16(int.random(max_60_bit_int)) 64 + generate_hash_data_loop(acc, generated + 1, length) 65 + } 66 + } 67 + }
+1
gleam.toml
··· 19 19 [dev-dependencies] 20 20 gleeunit = ">= 1.0.0 and < 2.0.0" 21 21 pocket_watch = ">= 1.0.0 and < 2.0.0" 22 + simplifile = ">= 2.3.0 and < 3.0.0"
+3
manifest.toml
··· 3 3 4 4 packages = [ 5 5 { name = "birl", version = "1.8.0", build_tools = ["gleam"], requirements = ["gleam_regexp", "gleam_stdlib", "ranger"], otp_app = "birl", source = "hex", outer_checksum = "2AC7BA26F998E3DFADDB657148BD5DDFE966958AD4D6D6957DD0D22E5B56C400" }, 6 + { name = "filepath", version = "1.1.2", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "filepath", source = "hex", outer_checksum = "B06A9AF0BF10E51401D64B98E4B627F1D2E48C154967DA7AF4D0914780A6D40A" }, 6 7 { name = "gleam_regexp", version = "1.1.1", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "gleam_regexp", source = "hex", outer_checksum = "9C215C6CA84A5B35BB934A9B61A9A306EC743153BE2B0425A0D032E477B062A9" }, 7 8 { name = "gleam_stdlib", version = "0.62.1", build_tools = ["gleam"], requirements = [], otp_app = "gleam_stdlib", source = "hex", outer_checksum = "0080706D3A5A9A36C40C68481D1D231D243AF602E6D2A2BE67BA8F8F4DFF45EC" }, 8 9 { name = "gleam_time", version = "1.4.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "gleam_time", source = "hex", outer_checksum = "DCDDC040CE97DA3D2A925CDBBA08D8A78681139745754A83998641C8A3F6587E" }, ··· 12 13 { name = "iv", version = "1.3.2", build_tools = ["gleam"], requirements = ["gleam_stdlib", "gleam_yielder"], otp_app = "iv", source = "hex", outer_checksum = "1FE22E047705BE69EA366E3A2E73C2E1310CBCB27DDE767DE17AE3FA86499947" }, 13 14 { name = "pocket_watch", version = "1.0.0", build_tools = ["gleam"], requirements = ["birl", "gleam_stdlib", "humanise"], otp_app = "pocket_watch", source = "hex", outer_checksum = "CD8784CAC29735CDC2E6A67212FFC1C60A13A48D8F74470CE3DE15D41447227C" }, 14 15 { name = "ranger", version = "1.4.0", build_tools = ["gleam"], requirements = ["gleam_stdlib", "gleam_yielder"], otp_app = "ranger", source = "hex", outer_checksum = "C8988E8F8CDBD3E7F4D8F2E663EF76490390899C2B2885A6432E942495B3E854" }, 16 + { name = "simplifile", version = "2.3.0", build_tools = ["gleam"], requirements = ["filepath", "gleam_stdlib"], otp_app = "simplifile", source = "hex", outer_checksum = "0A868DAC6063D9E983477981839810DC2E553285AB4588B87E3E9C96A7FB4CB4" }, 15 17 ] 16 18 17 19 [requirements] ··· 19 21 gleeunit = { version = ">= 1.0.0 and < 2.0.0" } 20 22 iv = { version = ">= 1.3.2 and < 2.0.0" } 21 23 pocket_watch = { version = ">= 1.0.0 and < 2.0.0" } 24 + simplifile = { version = ">= 2.3.0 and < 3.0.0" }
+6 -3
src/starfish/internal/evaluate.gleam
··· 3 3 import starfish/internal/board 4 4 import starfish/internal/game 5 5 import starfish/internal/move 6 + import starfish/internal/piece_table 6 7 7 8 /// Statically evaluates a position. Does not take into account checkmate or 8 9 /// stalemate, those must be accounted for beforehand. ··· 14 15 } 15 16 16 17 fn evaluate_position(game: game.Game) -> Int { 17 - use eval, _position, #(piece, colour) <- dict.fold(game.board, 0) 18 + use eval, position, #(piece, colour) <- dict.fold(game.board, 0) 19 + let score = 20 + piece_score(piece) + piece_table.piece_score(piece, colour, position) 18 21 case colour == game.to_move { 19 - True -> eval + piece_score(piece) 20 - False -> eval - piece_score(piece) 22 + True -> eval + score 23 + False -> eval - score 21 24 } 22 25 } 23 26
+3 -18
src/starfish/internal/game.gleam
··· 7 7 import starfish/internal/board.{Black, White} 8 8 import starfish/internal/hash 9 9 import starfish/internal/move/attack 10 - import starfish/internal/piece_table 11 10 12 11 pub type Castling { 13 12 Castling( ··· 29 28 full_moves: Int, 30 29 // Extra information 31 30 zobrist_hash: Int, 32 - hash_data: hash.HashData, 33 - piece_tables: piece_table.PieceTables, 34 31 previous_positions: Set(Int), 35 32 attack_information: attack.AttackInformation, 36 33 ) ··· 40 37 41 38 pub fn initial_position() -> Game { 42 39 let to_move = White 43 - let hash_data = hash.generate_data() 44 - let piece_tables = piece_table.construct_tables() 45 40 let board = board.initial_position() 46 - let zobrist_hash = hash.hash(hash_data, board, to_move) 41 + let zobrist_hash = hash.hash(board, to_move) 47 42 let attack_information = attack.calculate(board, to_move) 48 43 49 44 Game( ··· 54 49 half_moves: 0, 55 50 full_moves: 1, 56 51 zobrist_hash:, 57 - hash_data:, 58 - piece_tables:, 59 52 previous_positions: set.new(), 60 53 attack_information:, 61 54 ) ··· 99 92 Ok(#(moves, _)) -> moves 100 93 } 101 94 102 - let hash_data = hash.generate_data() 103 - let piece_tables = piece_table.construct_tables() 104 - let zobrist_hash = hash.hash(hash_data, board, to_move) 95 + let zobrist_hash = hash.hash(board, to_move) 105 96 let attack_information = attack.calculate(board, to_move) 106 97 107 98 Game( ··· 112 103 half_moves:, 113 104 full_moves:, 114 105 zobrist_hash:, 115 - hash_data:, 116 - piece_tables:, 117 106 previous_positions: set.new(), 118 107 attack_information:, 119 108 ) ··· 244 233 let fen = strip_spaces(fen) 245 234 use <- bool.guard(fen != "", Error(TrailingData(fen))) 246 235 247 - let hash_data = hash.generate_data() 248 - let piece_tables = piece_table.construct_tables() 249 - let zobrist_hash = hash.hash(hash_data, board, to_move) 236 + let zobrist_hash = hash.hash(board, to_move) 250 237 let attack_information = attack.calculate(board, to_move) 251 238 252 239 Ok(Game( ··· 257 244 half_moves:, 258 245 full_moves:, 259 246 zobrist_hash:, 260 - hash_data:, 261 - piece_tables:, 262 247 previous_positions: set.new(), 263 248 attack_information:, 264 249 ))
+782
src/starfish/internal/generated.gleam
··· 1 + import starfish/internal/board.{ 2 + Bishop, Black, King, Knight, Pawn, Queen, Rook, White, 3 + } 4 + 5 + pub fn hash_for_piece( 6 + piece: board.Piece, 7 + colour: board.Colour, 8 + position: Int, 9 + ) -> Int { 10 + case piece, colour, position { 11 + Pawn, White, 0 -> 0x3AEE1865C8A7A00 12 + Pawn, Black, 0 -> 0x6EC1C0812F7D00 13 + Knight, White, 0 -> 0x36D86050808D480 14 + Knight, Black, 0 -> 0x778F07100D6F380 15 + Bishop, White, 0 -> 0x3C22074287B0300 16 + Bishop, Black, 0 -> 0x187F6B077AEF9C0 17 + Rook, White, 0 -> 0x1357EE010778880 18 + Rook, Black, 0 -> 0x48A29FC6DE50E40 19 + Queen, White, 0 -> 0x5DCE73C07B08340 20 + Queen, Black, 0 -> 0x2988606B3ED2A40 21 + King, White, 0 -> 0x45FBD0504603E40 22 + King, Black, 0 -> 0x95EEE0C6F07F00 23 + Pawn, White, 1 -> 0x333612084CC1C0 24 + Pawn, Black, 1 -> 0x1770E31D5A1D2C0 25 + Knight, White, 1 -> 0x7CFC377F1BD82C0 26 + Knight, Black, 1 -> 0x16B57C5F3611D40 27 + Bishop, White, 1 -> 0x10F075D7E46A340 28 + Bishop, Black, 1 -> 0x284F7E8AA0AD480 29 + Rook, White, 1 -> 0x15DEF9393918C00 30 + Rook, Black, 1 -> 0x62263AA381C2400 31 + Queen, White, 1 -> 0x7E901E75A983780 32 + Queen, Black, 1 -> 0x8BB9F737CBF80 33 + King, White, 1 -> 0x168F34B6220EE00 34 + King, Black, 1 -> 0x386FCE0E1B35F00 35 + Pawn, White, 2 -> 0x6C6B442B1F59300 36 + Pawn, Black, 2 -> 0x3A6BF173FC37940 37 + Knight, White, 2 -> 0x63A6F4FF60B7240 38 + Knight, Black, 2 -> 0x732634B70ACFE40 39 + Bishop, White, 2 -> 0x320EE7649063C00 40 + Bishop, Black, 2 -> 0x65F972D5D00DA40 41 + Rook, White, 2 -> 0x39480095E377C00 42 + Rook, Black, 2 -> 0x1A443C4B46A780 43 + Queen, White, 2 -> 0x73FDBBF2D973840 44 + Queen, Black, 2 -> 0x1B291B796E4C140 45 + King, White, 2 -> 0x7759489DC4E9F00 46 + King, Black, 2 -> 0x313CE153CD40140 47 + Pawn, White, 3 -> 0xAD4B8F649EAE00 48 + Pawn, Black, 3 -> 0x14EEBFF65BA2E40 49 + Knight, White, 3 -> 0x5465F58A6DA4E00 50 + Knight, Black, 3 -> 0x50BC0DEE9EFD3C0 51 + Bishop, White, 3 -> 0x4F6BE2CDF6EF580 52 + Bishop, Black, 3 -> 0x1E5EC02D46D09C0 53 + Rook, White, 3 -> 0x6B9890D9785AFC0 54 + Rook, Black, 3 -> 0x5C1F5E34CFF8DC0 55 + Queen, White, 3 -> 0x1D16B2B4D868200 56 + Queen, Black, 3 -> 0x6C52F9931894200 57 + King, White, 3 -> 0x10FABE5A5321040 58 + King, Black, 3 -> 0x4A6C0C99EEB3E00 59 + Pawn, White, 4 -> 0xCC955687DBA8C0 60 + Pawn, Black, 4 -> 0x53F20EBADD2E540 61 + Knight, White, 4 -> 0x768EF3D3ED2EBC0 62 + Knight, Black, 4 -> 0x7B8EF55ADE20800 63 + Bishop, White, 4 -> 0x146D027B4014580 64 + Bishop, Black, 4 -> 0x79557AB6644CB40 65 + Rook, White, 4 -> 0xE6D0DEEF60DE40 66 + Rook, Black, 4 -> 0x57CC3A823813A40 67 + Queen, White, 4 -> 0x7B86EE046F85CC0 68 + Queen, Black, 4 -> 0x60E117A8A61EF80 69 + King, White, 4 -> 0x798163A131E880 70 + King, Black, 4 -> 0x35926A6E9CAB040 71 + Pawn, White, 5 -> 0x7891CB0D6DE7480 72 + Pawn, Black, 5 -> 0x44C457F57D58740 73 + Knight, White, 5 -> 0x6EB03513BB1E900 74 + Knight, Black, 5 -> 0x68936029F72F9C0 75 + Bishop, White, 5 -> 0x1D88A9E8BC12140 76 + Bishop, Black, 5 -> 0x3C87938AF272600 77 + Rook, White, 5 -> 0x58AF963DD68D4C0 78 + Rook, Black, 5 -> 0x7CF6C36BE29C6C0 79 + Queen, White, 5 -> 0x3FF303F01F365C0 80 + Queen, Black, 5 -> 0x65AC89552EC9880 81 + King, White, 5 -> 0x73E7D38FB34C340 82 + King, Black, 5 -> 0x23AA19095109640 83 + Pawn, White, 6 -> 0x521E9636B096A00 84 + Pawn, Black, 6 -> 0x45E5E9C2BAAFF80 85 + Knight, White, 6 -> 0x8A62F888F92280 86 + Knight, Black, 6 -> 0x457636F7F5F2780 87 + Bishop, White, 6 -> 0x6E62A8FE5CA1A00 88 + Bishop, Black, 6 -> 0x47D5B56CB680C80 89 + Rook, White, 6 -> 0xC78FBF3AC9CC00 90 + Rook, Black, 6 -> 0x7E00C2DF8CD4CC0 91 + Queen, White, 6 -> 0x88976F85CE4400 92 + Queen, Black, 6 -> 0x389054569699900 93 + King, White, 6 -> 0x4049507709FB4C0 94 + King, Black, 6 -> 0x798EA2E83744780 95 + Pawn, White, 7 -> 0x315385868E65100 96 + Pawn, Black, 7 -> 0xA2464F3AB08780 97 + Knight, White, 7 -> 0x4AF8B42F39ED3C0 98 + Knight, Black, 7 -> 0x75DA414DC6B91C0 99 + Bishop, White, 7 -> 0x3D8CD709F530DC0 100 + Bishop, Black, 7 -> 0x367B0837C9B5B40 101 + Rook, White, 7 -> 0x785F34A52872C40 102 + Rook, Black, 7 -> 0x5893BC7B5169340 103 + Queen, White, 7 -> 0x2DE6F62AC00A540 104 + Queen, Black, 7 -> 0x71E28FE1CEB6B00 105 + King, White, 7 -> 0x7954FF935725740 106 + King, Black, 7 -> 0x7F9693449A07D80 107 + Pawn, White, 8 -> 0x29CC83F21701840 108 + Pawn, Black, 8 -> 0x2814CB70B023240 109 + Knight, White, 8 -> 0x6AAE54D7F5173C0 110 + Knight, Black, 8 -> 0x6D1FA4939949780 111 + Bishop, White, 8 -> 0x607B775030461C0 112 + Bishop, Black, 8 -> 0x237705DD6FAC1C0 113 + Rook, White, 8 -> 0x6EB57BDCAE0C400 114 + Rook, Black, 8 -> 0x390D513C39A9B40 115 + Queen, White, 8 -> 0x1A4E869373EC940 116 + Queen, Black, 8 -> 0x3C88D5C3DDF3A80 117 + King, White, 8 -> 0x7B8D5E6C8C69A40 118 + King, Black, 8 -> 0x20D7B63A3A95C40 119 + Pawn, White, 9 -> 0x462A60B22C6EE40 120 + Pawn, Black, 9 -> 0x11D3B0DCFCC97C0 121 + Knight, White, 9 -> 0x17DF080630A1AC0 122 + Knight, Black, 9 -> 0x156A31747406540 123 + Bishop, White, 9 -> 0xD52C5EB2B1340 124 + Bishop, Black, 9 -> 0x1452EB9BDAF9140 125 + Rook, White, 9 -> 0x5BBE198F1FE9600 126 + Rook, Black, 9 -> 0x10E1E6ED3119900 127 + Queen, White, 9 -> 0x12C52EFF4AEF140 128 + Queen, Black, 9 -> 0xBD63A24A20E6C0 129 + King, White, 9 -> 0x6DC7296D60D2940 130 + King, Black, 9 -> 0x311019B62104540 131 + Pawn, White, 10 -> 0x7B31CF43CA8E840 132 + Pawn, Black, 10 -> 0x668B3BF73DA2340 133 + Knight, White, 10 -> 0x685946F6A682240 134 + Knight, Black, 10 -> 0x15DF328CB69C180 135 + Bishop, White, 10 -> 0x7C20C10D56A2780 136 + Bishop, Black, 10 -> 0x7BD676FB70174C0 137 + Rook, White, 10 -> 0x61F07EEEC395FC0 138 + Rook, Black, 10 -> 0x4AEE2905EB59440 139 + Queen, White, 10 -> 0x68501CCBD2B1100 140 + Queen, Black, 10 -> 0x437DC8645378C40 141 + King, White, 10 -> 0x2504F3CCD378B40 142 + King, Black, 10 -> 0x2C39F13C5AED9C0 143 + Pawn, White, 11 -> 0x6AF50ABD0F4D640 144 + Pawn, Black, 11 -> 0xD5F702BA729980 145 + Knight, White, 11 -> 0x60A2BB2DA1C50C0 146 + Knight, Black, 11 -> 0x2EB2E6169F5C380 147 + Bishop, White, 11 -> 0x57C0748F7417680 148 + Bishop, Black, 11 -> 0x1C5A76E3EC7140 149 + Rook, White, 11 -> 0xCBB60B9616F480 150 + Rook, Black, 11 -> 0x2A8D7D25847FCC0 151 + Queen, White, 11 -> 0x3B073673A4BDE80 152 + Queen, Black, 11 -> 0x21814782BE27EC0 153 + King, White, 11 -> 0x51AD76120ED4400 154 + King, Black, 11 -> 0x5928EBF8A28CCC0 155 + Pawn, White, 12 -> 0x44AE208DF73A040 156 + Pawn, Black, 12 -> 0x57A1C3659530D00 157 + Knight, White, 12 -> 0x24E16DD04BF8D80 158 + Knight, Black, 12 -> 0x73CD7CBED925B00 159 + Bishop, White, 12 -> 0x6E2121CB84F3BC0 160 + Bishop, Black, 12 -> 0x8BC555CFC71B40 161 + Rook, White, 12 -> 0x29BB2FF48A2BA80 162 + Rook, Black, 12 -> 0x372D308F6FF3D00 163 + Queen, White, 12 -> 0x4F2E6CF12D06800 164 + Queen, Black, 12 -> 0x67173565EB94700 165 + King, White, 12 -> 0x7A846D55635CF00 166 + King, Black, 12 -> 0x2E75857ABE5F080 167 + Pawn, White, 13 -> 0x2C3686FBDCE4700 168 + Pawn, Black, 13 -> 0x50C0E7A4815A1C0 169 + Knight, White, 13 -> 0x2B3B0DA1E02F200 170 + Knight, Black, 13 -> 0xEF03A62832C680 171 + Bishop, White, 13 -> 0x42D589AD73AB2C0 172 + Bishop, Black, 13 -> 0x3B823E896890380 173 + Rook, White, 13 -> 0x713F68653623200 174 + Rook, Black, 13 -> 0x7D1C13BDC9A5680 175 + Queen, White, 13 -> 0x282C27BD656F340 176 + Queen, Black, 13 -> 0x3338D373C1D5FC0 177 + King, White, 13 -> 0x4F86047F3F64D00 178 + King, Black, 13 -> 0x6B1D7DC3D371280 179 + Pawn, White, 14 -> 0xFB887EF209B800 180 + Pawn, Black, 14 -> 0x1658B2D0EA9DB40 181 + Knight, White, 14 -> 0x4C8146A2B3E6040 182 + Knight, Black, 14 -> 0x25D9D81E958BAC0 183 + Bishop, White, 14 -> 0x7E0238109343F80 184 + Bishop, Black, 14 -> 0x1F498F07B448D80 185 + Rook, White, 14 -> 0x518CDAE0E75600 186 + Rook, Black, 14 -> 0x2E18976A52BEB40 187 + Queen, White, 14 -> 0x365DC461EEF3280 188 + Queen, Black, 14 -> 0x5D1BA5FC08BD380 189 + King, White, 14 -> 0x4E8D3E3C92F80 190 + King, Black, 14 -> 0x4D4BC41258CD480 191 + Pawn, White, 15 -> 0x1C1EDA03482F900 192 + Pawn, Black, 15 -> 0x2164A5703F7CC0 193 + Knight, White, 15 -> 0x6D0B3FA6E8F840 194 + Knight, Black, 15 -> 0x35D41D1656DA400 195 + Bishop, White, 15 -> 0x367977A1C14840 196 + Bishop, Black, 15 -> 0x3747D336B1D8640 197 + Rook, White, 15 -> 0x2798F87A778DE40 198 + Rook, Black, 15 -> 0x4F982EB551ECC80 199 + Queen, White, 15 -> 0x7484B8DF78E3BC0 200 + Queen, Black, 15 -> 0x6E2F14E1CCEA5C0 201 + King, White, 15 -> 0x594005217375680 202 + King, Black, 15 -> 0x66FC65AB00F2F80 203 + Pawn, White, 16 -> 0x4FE4CC1AC35A2C0 204 + Pawn, Black, 16 -> 0x6127358DCD81E00 205 + Knight, White, 16 -> 0x6A582E884E1B9C0 206 + Knight, Black, 16 -> 0x43DAA9592559F00 207 + Bishop, White, 16 -> 0x5692E332942EF80 208 + Bishop, Black, 16 -> 0x6D520FDCB1F6F00 209 + Rook, White, 16 -> 0x5D8B16248483A40 210 + Rook, Black, 16 -> 0x7DA80315B99F540 211 + Queen, White, 16 -> 0x26C18A181EED1C0 212 + Queen, Black, 16 -> 0x2571306CE7D8380 213 + King, White, 16 -> 0x6C3171F39186A00 214 + King, Black, 16 -> 0x123B1F6C60B5180 215 + Pawn, White, 17 -> 0x3BDB1AA4D1AF400 216 + Pawn, Black, 17 -> 0x457EA5953A90740 217 + Knight, White, 17 -> 0x671C8D1F561BB40 218 + Knight, Black, 17 -> 0x63C11EA65711240 219 + Bishop, White, 17 -> 0x21948512AFFC480 220 + Bishop, Black, 17 -> 0x598E77DFAA0E040 221 + Rook, White, 17 -> 0x573EC352EFE8D00 222 + Rook, Black, 17 -> 0x1E5A2FB0D003F40 223 + Queen, White, 17 -> 0x6A8020B1A3B8CC0 224 + Queen, Black, 17 -> 0x2C0E16859A96600 225 + King, White, 17 -> 0x5D53C27B1FA0B00 226 + King, Black, 17 -> 0x64F0D0F06D03C0 227 + Pawn, White, 18 -> 0x564C0C8B42CE4C0 228 + Pawn, Black, 18 -> 0x3F3AFC4EDF990C0 229 + Knight, White, 18 -> 0x239CC5A06E6FC00 230 + Knight, Black, 18 -> 0x2A5BC1477C2AA00 231 + Bishop, White, 18 -> 0x3B6809333037DC0 232 + Bishop, Black, 18 -> 0x55FC6D91B61D5C0 233 + Rook, White, 18 -> 0x66C2AFF510CF240 234 + Rook, Black, 18 -> 0x24054F5A660700 235 + Queen, White, 18 -> 0x782B5F436926C40 236 + Queen, Black, 18 -> 0x15CFD8A4B9BACC0 237 + King, White, 18 -> 0x415DF822FCD7140 238 + King, Black, 18 -> 0x6286B82CA971900 239 + Pawn, White, 19 -> 0x16D561EA1A5D140 240 + Pawn, Black, 19 -> 0x407C5E8659F1C40 241 + Knight, White, 19 -> 0x40EAF57997DF640 242 + Knight, Black, 19 -> 0xBE6BACFBA4CB40 243 + Bishop, White, 19 -> 0x81CD33F5138A40 244 + Bishop, Black, 19 -> 0x86D741D2F2B680 245 + Rook, White, 19 -> 0x48730AF605D3C80 246 + Rook, Black, 19 -> 0x49737EFE46D740 247 + Queen, White, 19 -> 0x2463F7F06B681C0 248 + Queen, Black, 19 -> 0x343FCD239A8DF80 249 + King, White, 19 -> 0x4C09DB5ABBA0C0 250 + King, Black, 19 -> 0x7595D586FAF9000 251 + Pawn, White, 20 -> 0x1EB0CCCABF3EA40 252 + Pawn, Black, 20 -> 0x5BD68853FE77E00 253 + Knight, White, 20 -> 0x673D746A145ED40 254 + Knight, Black, 20 -> 0x4DBF10A25F5E680 255 + Bishop, White, 20 -> 0xC4C3A28DF4C400 256 + Bishop, Black, 20 -> 0x4C5BCEA0FEE9340 257 + Rook, White, 20 -> 0x5C1A5757904B100 258 + Rook, Black, 20 -> 0x51E5E19B760C00 259 + Queen, White, 20 -> 0x6F693D46AD7E3C0 260 + Queen, Black, 20 -> 0x166B8DDC96442C0 261 + King, White, 20 -> 0xF17BC7EC1AD500 262 + King, Black, 20 -> 0x57551158CC4C980 263 + Pawn, White, 21 -> 0x6ACFFE88A36EB80 264 + Pawn, Black, 21 -> 0x2B79FB951CA1B40 265 + Knight, White, 21 -> 0x1A86B74D81B1DC0 266 + Knight, Black, 21 -> 0x2E3426B67EBBB40 267 + Bishop, White, 21 -> 0x7F6DB0AB66678C0 268 + Bishop, Black, 21 -> 0x950FA68DB09A00 269 + Rook, White, 21 -> 0x34F3B91E0F1ED40 270 + Rook, Black, 21 -> 0x3CE7FFA35480680 271 + Queen, White, 21 -> 0x3E0CBF90BF8BB00 272 + Queen, Black, 21 -> 0x508CEDBFAF075C0 273 + King, White, 21 -> 0x4AFB903AD8625C0 274 + King, Black, 21 -> 0x7FAD27F6E48A3C0 275 + Pawn, White, 22 -> 0x1D988BA7859C800 276 + Pawn, Black, 22 -> 0x2D44449FDD60F00 277 + Knight, White, 22 -> 0x2201DFBBD5EB5C0 278 + Knight, Black, 22 -> 0x40E6D0257CCE100 279 + Bishop, White, 22 -> 0x524279B87E93B00 280 + Bishop, Black, 22 -> 0x4B0561BF40A62C0 281 + Rook, White, 22 -> 0x470FC3824A8E500 282 + Rook, Black, 22 -> 0x6D5BB1C5FE8C300 283 + Queen, White, 22 -> 0x59A28BABDDDBF00 284 + Queen, Black, 22 -> 0x4820EBC34FB84C0 285 + King, White, 22 -> 0x7166A5D46816D80 286 + King, Black, 22 -> 0x5D06CC06A37FDC0 287 + Pawn, White, 23 -> 0x4D249648B0CA280 288 + Pawn, Black, 23 -> 0x75C68BA48C56500 289 + Knight, White, 23 -> 0x45FA2391C6AE800 290 + Knight, Black, 23 -> 0x1CDAFC37327DCC0 291 + Bishop, White, 23 -> 0x27E3DA4C03E36C0 292 + Bishop, Black, 23 -> 0x26CAA132CB88340 293 + Rook, White, 23 -> 0x3DAE5E8812F0140 294 + Rook, Black, 23 -> 0x49B5B0081C57100 295 + Queen, White, 23 -> 0xDE20409EA2BFC0 296 + Queen, Black, 23 -> 0x6876D86129D9340 297 + King, White, 23 -> 0x3E43CCAD88918C0 298 + King, Black, 23 -> 0x447A46B509CD940 299 + Pawn, White, 24 -> 0x2B8F612961FD280 300 + Pawn, Black, 24 -> 0x2BDBD62058F3F40 301 + Knight, White, 24 -> 0x31777E1A11F00C0 302 + Knight, Black, 24 -> 0xB2D32D7030E4C0 303 + Bishop, White, 24 -> 0x77F00264D946900 304 + Bishop, Black, 24 -> 0x97DE4A9F71F880 305 + Rook, White, 24 -> 0xD51EC452AA0C80 306 + Rook, Black, 24 -> 0x62087985C1D3640 307 + Queen, White, 24 -> 0x409DEF726E2480 308 + Queen, Black, 24 -> 0x13EBBBDD7B2E480 309 + King, White, 24 -> 0x63C21D0F27EBC00 310 + King, Black, 24 -> 0x5FE40293E2BA580 311 + Pawn, White, 25 -> 0x87EDB08FCCE040 312 + Pawn, Black, 25 -> 0x17D34B616775D40 313 + Knight, White, 25 -> 0x5225733E8B4A240 314 + Knight, Black, 25 -> 0xC5FA56D4460EC0 315 + Bishop, White, 25 -> 0x70C46B2AA6A0580 316 + Bishop, Black, 25 -> 0xCCB0DBD679DEC0 317 + Rook, White, 25 -> 0x3EEAD3315255380 318 + Rook, Black, 25 -> 0x1C7989FA596ED40 319 + Queen, White, 25 -> 0x43D6479BDD59640 320 + Queen, Black, 25 -> 0x3A5242D350BFA40 321 + King, White, 25 -> 0x4C9FA9A23013C0 322 + King, Black, 25 -> 0x1706CE239473B00 323 + Pawn, White, 26 -> 0x5B5138504D88C00 324 + Pawn, Black, 26 -> 0x6A7882E86EBDAC0 325 + Knight, White, 26 -> 0x2EAB44DFE96FBC0 326 + Knight, Black, 26 -> 0x3D4FD8F9ECB28C0 327 + Bishop, White, 26 -> 0x42A73DE8EDC3B00 328 + Bishop, Black, 26 -> 0x5C4B731BE4FF8C0 329 + Rook, White, 26 -> 0x833C9592B57EC0 330 + Rook, Black, 26 -> 0x60E8C351B8811C0 331 + Queen, White, 26 -> 0x69AC20A4FCE8180 332 + Queen, Black, 26 -> 0x5459DAB8EE20740 333 + King, White, 26 -> 0x111E126B4A13780 334 + King, Black, 26 -> 0x620E90C8EA761C0 335 + Pawn, White, 27 -> 0x1FACD203E1DB000 336 + Pawn, Black, 27 -> 0x8D913327DC0600 337 + Knight, White, 27 -> 0x4E7758049902C00 338 + Knight, Black, 27 -> 0x495672044E3DF40 339 + Bishop, White, 27 -> 0x6D96C5B4DFB9940 340 + Bishop, Black, 27 -> 0x1DC13B357D78F80 341 + Rook, White, 27 -> 0xF0097463B35940 342 + Rook, Black, 27 -> 0x13871788BAC6700 343 + Queen, White, 27 -> 0x2E9E6A97CC37A80 344 + Queen, Black, 27 -> 0x6B9DDE53DBC5080 345 + King, White, 27 -> 0x76EAE3528EF2B00 346 + King, Black, 27 -> 0x51600B5DF501F00 347 + Pawn, White, 28 -> 0x6A8DDA30871F240 348 + Pawn, Black, 28 -> 0x2F54A773AB7C7C0 349 + Knight, White, 28 -> 0x29640EBA7A3F340 350 + Knight, Black, 28 -> 0x1A959252E864480 351 + Bishop, White, 28 -> 0x534053EEF1705C0 352 + Bishop, Black, 28 -> 0x3C3CE1CBA2ED3C0 353 + Rook, White, 28 -> 0x323D06637E4C5C0 354 + Rook, Black, 28 -> 0x48BCF3D85CDDEC0 355 + Queen, White, 28 -> 0x3A0AE34AA267440 356 + Queen, Black, 28 -> 0x7239F5403327D40 357 + King, White, 28 -> 0x6CAD7FF7EB7FB40 358 + King, Black, 28 -> 0x72D0D7AD38F5080 359 + Pawn, White, 29 -> 0x373AB5B30A2E300 360 + Pawn, Black, 29 -> 0x22645F6EB245280 361 + Knight, White, 29 -> 0x75A4E4F83797DC0 362 + Knight, Black, 29 -> 0x795EED0D57B3140 363 + Bishop, White, 29 -> 0x7C165C0C87F0EC0 364 + Bishop, Black, 29 -> 0x250C770E896B480 365 + Rook, White, 29 -> 0xB24121C1870180 366 + Rook, Black, 29 -> 0x4E45D6E87B96DC0 367 + Queen, White, 29 -> 0x7BBB5F835BDBF80 368 + Queen, Black, 29 -> 0x5DF67226BAEA300 369 + King, White, 29 -> 0x141EAD04E3D8900 370 + King, Black, 29 -> 0x576AAAF50D934C0 371 + Pawn, White, 30 -> 0x7336AE9209783C0 372 + Pawn, Black, 30 -> 0x60E4E82F752B5C0 373 + Knight, White, 30 -> 0x6455E4CA4B7780 374 + Knight, Black, 30 -> 0x6DCB2C6DDF9F940 375 + Bishop, White, 30 -> 0x7A638509BDE0F80 376 + Bishop, Black, 30 -> 0x138DB7850A4C00 377 + Rook, White, 30 -> 0x448D98FE859C180 378 + Rook, Black, 30 -> 0x4CE3973A4367F80 379 + Queen, White, 30 -> 0x6D3192FF3B2A100 380 + Queen, Black, 30 -> 0x3D4EC29E8EFE440 381 + King, White, 30 -> 0x1162F7D8BD1700 382 + King, Black, 30 -> 0x1EC4F8A08F22500 383 + Pawn, White, 31 -> 0xB0C74F0EA9D5C0 384 + Pawn, Black, 31 -> 0x14ACA68BA2CBA40 385 + Knight, White, 31 -> 0x619B48694C87700 386 + Knight, Black, 31 -> 0x3A521377E48A180 387 + Bishop, White, 31 -> 0x7FD00AA14141E80 388 + Bishop, Black, 31 -> 0x2DC4C82E6F8A6C0 389 + Rook, White, 31 -> 0x504205321668DC0 390 + Rook, Black, 31 -> 0x7A55B793398AB80 391 + Queen, White, 31 -> 0x282B9631E2DFA80 392 + Queen, Black, 31 -> 0x203D448A00CF840 393 + King, White, 31 -> 0x4CD1BA29D594200 394 + King, Black, 31 -> 0x1D5F599A8AF38C0 395 + Pawn, White, 32 -> 0x768589BC38E6240 396 + Pawn, Black, 32 -> 0x1F3680CAA97EDC0 397 + Knight, White, 32 -> 0x509C9436B74EAC0 398 + Knight, Black, 32 -> 0x6002B254E596A40 399 + Bishop, White, 32 -> 0x7E0B67A5110B1C0 400 + Bishop, Black, 32 -> 0x4E525F242441780 401 + Rook, White, 32 -> 0xFC7B43E21B1D80 402 + Rook, Black, 32 -> 0x3B578A183162B40 403 + Queen, White, 32 -> 0x16DB7E490BAD400 404 + Queen, Black, 32 -> 0x7EB311228033440 405 + King, White, 32 -> 0x10E90BF6C7FEB40 406 + King, Black, 32 -> 0x60806EB3B8E8F80 407 + Pawn, White, 33 -> 0x737408CE2F51740 408 + Pawn, Black, 33 -> 0x34EF907A9FAB840 409 + Knight, White, 33 -> 0x23638CD255A6700 410 + Knight, Black, 33 -> 0x26097AFBDD05180 411 + Bishop, White, 33 -> 0x4F3E163E6BBF6C0 412 + Bishop, Black, 33 -> 0x48A23E50AFA7A80 413 + Rook, White, 33 -> 0x59A1EC1BA4BA100 414 + Rook, Black, 33 -> 0x41916A69F7CE3C0 415 + Queen, White, 33 -> 0x3BD4C5E81E75700 416 + Queen, Black, 33 -> 0x1C7387FBC8322C0 417 + King, White, 33 -> 0x6D3599D02BFCB00 418 + King, Black, 33 -> 0x57DEA27CD692E00 419 + Pawn, White, 34 -> 0x251C14E2A3C0600 420 + Pawn, Black, 34 -> 0x2BE0AC4874EFF00 421 + Knight, White, 34 -> 0x6FA9689A0DB5F80 422 + Knight, Black, 34 -> 0x243A333C344EC0 423 + Bishop, White, 34 -> 0x29F451487298A80 424 + Bishop, Black, 34 -> 0x754F9869466C900 425 + Rook, White, 34 -> 0x15C837387B5C140 426 + Rook, Black, 34 -> 0x6EB4ADB1C7CEC00 427 + Queen, White, 34 -> 0x9F33BF4FCBF700 428 + Queen, Black, 34 -> 0x72CB97EE6F6ED00 429 + King, White, 34 -> 0x3AD797AC388A540 430 + King, Black, 34 -> 0x7D3303D2F92A700 431 + Pawn, White, 35 -> 0x64C900DFCA3BEC0 432 + Pawn, Black, 35 -> 0x7CD7B982FC31500 433 + Knight, White, 35 -> 0x4F9D0B9E69EA80 434 + Knight, Black, 35 -> 0x7333A203ADCC140 435 + Bishop, White, 35 -> 0x5815D22137FC80 436 + Bishop, Black, 35 -> 0x1BD7A1C9476D900 437 + Rook, White, 35 -> 0x615A2A96411B740 438 + Rook, Black, 35 -> 0x3D3EEEBAB044880 439 + Queen, White, 35 -> 0x33AA751ABDAB240 440 + Queen, Black, 35 -> 0x1EDDEA12CDDBA80 441 + King, White, 35 -> 0x7C5C817AC393C40 442 + King, Black, 35 -> 0xEAC366061B4240 443 + Pawn, White, 36 -> 0xADF88C08E6D340 444 + Pawn, Black, 36 -> 0x28B5141DB569380 445 + Knight, White, 36 -> 0x3B2DCA32559F1C0 446 + Knight, Black, 36 -> 0x18E5CA17FB3400 447 + Bishop, White, 36 -> 0xA7E4E798E8E040 448 + Bishop, Black, 36 -> 0x11F060CF483C100 449 + Rook, White, 36 -> 0xBF6188C1487180 450 + Rook, Black, 36 -> 0x2654E378993B080 451 + Queen, White, 36 -> 0x5CC8C98E66D6040 452 + Queen, Black, 36 -> 0x474CCE25B7C4840 453 + King, White, 36 -> 0x76B8A76C3107340 454 + King, Black, 36 -> 0x44B66A0896F9800 455 + Pawn, White, 37 -> 0x368099B52CB3240 456 + Pawn, Black, 37 -> 0x4B417A7BBBB70C0 457 + Knight, White, 37 -> 0x55870884E9615C0 458 + Knight, Black, 37 -> 0x1A37D49F28915C0 459 + Bishop, White, 37 -> 0x7B807BF0FE209C0 460 + Bishop, Black, 37 -> 0x6448C6A2F5F5DC0 461 + Rook, White, 37 -> 0x35F999417E7BB00 462 + Rook, Black, 37 -> 0x177710FB4211C40 463 + Queen, White, 37 -> 0x6AEFD3E2E5A3EC0 464 + Queen, Black, 37 -> 0x7616F1BDF184340 465 + King, White, 37 -> 0x6803BB90255AD00 466 + King, Black, 37 -> 0x2C75DE4DB0DDBC0 467 + Pawn, White, 38 -> 0x62F6322990A4180 468 + Pawn, Black, 38 -> 0x45EC64422CFF840 469 + Knight, White, 38 -> 0x74BCC4C95897400 470 + Knight, Black, 38 -> 0x2D9ADB86DFB9CC0 471 + Bishop, White, 38 -> 0x36F14C1FA95DB00 472 + Bishop, Black, 38 -> 0x9B3A2517C5D500 473 + Rook, White, 38 -> 0x180BE5DADC29B40 474 + Rook, Black, 38 -> 0x6162000C3FA8C0 475 + Queen, White, 38 -> 0x133A59B4AB2AFC0 476 + Queen, Black, 38 -> 0x2ACF86E75890040 477 + King, White, 38 -> 0x4EC48C8298BD6C0 478 + King, Black, 38 -> 0x1BCB273316385C0 479 + Pawn, White, 39 -> 0x490848951479600 480 + Pawn, Black, 39 -> 0x5BEC26CB439ECC0 481 + Knight, White, 39 -> 0xBDD9B97032D640 482 + Knight, Black, 39 -> 0x3CC871FF77071C0 483 + Bishop, White, 39 -> 0x381A0D6934D8880 484 + Bishop, Black, 39 -> 0x2C31F539D99600 485 + Rook, White, 39 -> 0x5A9C4DD7376CF40 486 + Rook, Black, 39 -> 0x2B786E5A19401C0 487 + Queen, White, 39 -> 0x549F3BA37C4B80 488 + Queen, Black, 39 -> 0x558E994F8B67300 489 + King, White, 39 -> 0xF05B25B7A39340 490 + King, Black, 39 -> 0x372FD654C504900 491 + Pawn, White, 40 -> 0x67746C7E70E6200 492 + Pawn, Black, 40 -> 0x7453C650365AC00 493 + Knight, White, 40 -> 0x2B2B5D166BF66C0 494 + Knight, Black, 40 -> 0x23848AB46CB9940 495 + Bishop, White, 40 -> 0x7F35E0CE22E2B00 496 + Bishop, Black, 40 -> 0x48257DC895119C0 497 + Rook, White, 40 -> 0x12BBF70AF5A3740 498 + Rook, Black, 40 -> 0x7DEBF75B523F300 499 + Queen, White, 40 -> 0x74E5F7FDF98C9C0 500 + Queen, Black, 40 -> 0xEBCF70CDFAA140 501 + King, White, 40 -> 0x1ECF996E8A3FAC0 502 + King, Black, 40 -> 0x7CA02701A8AE200 503 + Pawn, White, 41 -> 0x48EA517321BA880 504 + Pawn, Black, 41 -> 0x48C32461E8BC980 505 + Knight, White, 41 -> 0x3D1EF58975CD940 506 + Knight, Black, 41 -> 0x600363CDD84B8C0 507 + Bishop, White, 41 -> 0x28A728394A78980 508 + Bishop, Black, 41 -> 0x61BCFCA4FC5DC80 509 + Rook, White, 41 -> 0x2EFAB64B7010140 510 + Rook, Black, 41 -> 0x350CF2FD493FA80 511 + Queen, White, 41 -> 0x65333A680277B80 512 + Queen, Black, 41 -> 0xBCDC29B8048280 513 + King, White, 41 -> 0x7E615374279C400 514 + King, Black, 41 -> 0x6D865E80BA62280 515 + Pawn, White, 42 -> 0x23863A943051540 516 + Pawn, Black, 42 -> 0xCB2A3822E8F140 517 + Knight, White, 42 -> 0x53242AB4E38D580 518 + Knight, Black, 42 -> 0x64E0C54A6B5C900 519 + Bishop, White, 42 -> 0x5C2CDFDBEFC89C0 520 + Bishop, Black, 42 -> 0x142626CF2528D80 521 + Rook, White, 42 -> 0x1CF28F53C9A000 522 + Rook, Black, 42 -> 0x5DC536691D58D80 523 + Queen, White, 42 -> 0x7F2B1DA4619A040 524 + Queen, Black, 42 -> 0x1EA9FF670E1900 525 + King, White, 42 -> 0x2439495460DB6C0 526 + King, Black, 42 -> 0x31A7B4CB26BDB00 527 + Pawn, White, 43 -> 0x32B3D32556D4600 528 + Pawn, Black, 43 -> 0x71F4A6BE4E637C0 529 + Knight, White, 43 -> 0x6167E062FB3D3C0 530 + Knight, Black, 43 -> 0x4ADCE9EF4728880 531 + Bishop, White, 43 -> 0x531A8241244D1C0 532 + Bishop, Black, 43 -> 0x171A9D041FC50C0 533 + Rook, White, 43 -> 0x72E95374F06A1C0 534 + Rook, Black, 43 -> 0x10A2FC47260E780 535 + Queen, White, 43 -> 0x41FBAADF14CCA40 536 + Queen, Black, 43 -> 0x7D69FBB0C563A00 537 + King, White, 43 -> 0x30C06956301C680 538 + King, Black, 43 -> 0x6C852C0833A6C00 539 + Pawn, White, 44 -> 0x2188E51D6624B40 540 + Pawn, Black, 44 -> 0x1B761231E37C300 541 + Knight, White, 44 -> 0x23903B088255900 542 + Knight, Black, 44 -> 0x68C6B89ADABB100 543 + Bishop, White, 44 -> 0x6D4D450A9F647C0 544 + Bishop, Black, 44 -> 0x7F7045B5E894800 545 + Rook, White, 44 -> 0x305BBF1236CB600 546 + Rook, Black, 44 -> 0x7E724086B8F8040 547 + Queen, White, 44 -> 0x38BA8324D894140 548 + Queen, Black, 44 -> 0x5FE14678629DDC0 549 + King, White, 44 -> 0xC6BFFFE56FAC00 550 + King, Black, 44 -> 0x535A909E9EC57C0 551 + Pawn, White, 45 -> 0x6880AB8951568C0 552 + Pawn, Black, 45 -> 0x7DFCB0F97DFE540 553 + Knight, White, 45 -> 0x614046ED6A8C740 554 + Knight, Black, 45 -> 0x60F6CCF55279980 555 + Bishop, White, 45 -> 0xFB829FFB6BD600 556 + Bishop, Black, 45 -> 0x3A5203249512380 557 + Rook, White, 45 -> 0x2FA64286B037700 558 + Rook, Black, 45 -> 0x376FF9116183980 559 + Queen, White, 45 -> 0xD39F4D7542CA40 560 + Queen, Black, 45 -> 0x75CAB3FD497B8C0 561 + King, White, 45 -> 0x788DAB0DFD61F80 562 + King, Black, 45 -> 0x2CF6C0473799FC0 563 + Pawn, White, 46 -> 0x3EE1BAEB83611C0 564 + Pawn, Black, 46 -> 0x494F68052349F00 565 + Knight, White, 46 -> 0x57CFFDA4327D340 566 + Knight, Black, 46 -> 0x4B79A9904E9CB00 567 + Bishop, White, 46 -> 0x4F5F322646D79C0 568 + Bishop, Black, 46 -> 0x65B8E7C656BBE00 569 + Rook, White, 46 -> 0x2A300F977A2700 570 + Rook, Black, 46 -> 0x3D75F36F05EDCC0 571 + Queen, White, 46 -> 0x181E49B3B3DA140 572 + Queen, Black, 46 -> 0x4E5141205917F40 573 + King, White, 46 -> 0x4956C1200847240 574 + King, Black, 46 -> 0x6C7B932548609C0 575 + Pawn, White, 47 -> 0x596B4A2CCD1C840 576 + Pawn, Black, 47 -> 0x798CE81E1434440 577 + Knight, White, 47 -> 0x3408C60AE43C00 578 + Knight, Black, 47 -> 0x390005505B12500 579 + Bishop, White, 47 -> 0x511407D32EBC580 580 + Bishop, Black, 47 -> 0x54BAB12846EB300 581 + Rook, White, 47 -> 0x2F7501F52E7BA40 582 + Rook, Black, 47 -> 0xD3B687990520C0 583 + Queen, White, 47 -> 0x54D61631E9081C0 584 + Queen, Black, 47 -> 0x2A4508CDB914200 585 + King, White, 47 -> 0x5578336EC1B7580 586 + King, Black, 47 -> 0x7FEEC5092927280 587 + Pawn, White, 48 -> 0x3D64D4AC1EC1200 588 + Pawn, Black, 48 -> 0x4EC2F26E9B73000 589 + Knight, White, 48 -> 0x50660B4B92EC840 590 + Knight, Black, 48 -> 0x30E1CC478C63040 591 + Bishop, White, 48 -> 0x579B977DF67AC00 592 + Bishop, Black, 48 -> 0x716586AE5644DC0 593 + Rook, White, 48 -> 0x575ABD70DE0D100 594 + Rook, Black, 48 -> 0x274AA616929C940 595 + Queen, White, 48 -> 0x6A55521E1FE0800 596 + Queen, Black, 48 -> 0x47ACD3323799C80 597 + King, White, 48 -> 0x7901E7ABEFD5840 598 + King, Black, 48 -> 0x142B79FF52A2D00 599 + Pawn, White, 49 -> 0x65B8C5E4F5B4840 600 + Pawn, Black, 49 -> 0x279FF3E7CC7C0C0 601 + Knight, White, 49 -> 0x6A27A306B0DD080 602 + Knight, Black, 49 -> 0xAC8EBC924F1980 603 + Bishop, White, 49 -> 0x6907E57EF5AA8C0 604 + Bishop, Black, 49 -> 0x15B3EB1625AD6C0 605 + Rook, White, 49 -> 0x5700160842DA3C0 606 + Rook, Black, 49 -> 0x2D25F414BE3E080 607 + Queen, White, 49 -> 0x2682148B8C446C0 608 + Queen, Black, 49 -> 0x2BF058C974E680 609 + King, White, 49 -> 0x270127F8F650380 610 + King, Black, 49 -> 0x1BDC08933A8F3C0 611 + Pawn, White, 50 -> 0x11E245DF22E4140 612 + Pawn, Black, 50 -> 0x4EF026FBD1B7400 613 + Knight, White, 50 -> 0x180B761AE292E80 614 + Knight, Black, 50 -> 0x2713AD580DA3A00 615 + Bishop, White, 50 -> 0x73371177DB06680 616 + Bishop, Black, 50 -> 0xD7BCD15144F300 617 + Rook, White, 50 -> 0x6DB4C844F5D4C40 618 + Rook, Black, 50 -> 0x4F5CC560AFC20C0 619 + Queen, White, 50 -> 0x43E09188D300F40 620 + Queen, Black, 50 -> 0x339FB8BA4D0DC00 621 + King, White, 50 -> 0x3C15815D92789C0 622 + King, Black, 50 -> 0x37BCC0846D3AEC0 623 + Pawn, White, 51 -> 0x5195042734FB740 624 + Pawn, Black, 51 -> 0x565FB8E63E5E680 625 + Knight, White, 51 -> 0x685078F533B6400 626 + Knight, Black, 51 -> 0x2F926211DA39040 627 + Bishop, White, 51 -> 0x5755A497270FAC0 628 + Bishop, Black, 51 -> 0x2DD089CA97D3400 629 + Rook, White, 51 -> 0x51BF4EB43905780 630 + Rook, Black, 51 -> 0x73FE6FF98E456C0 631 + Queen, White, 51 -> 0x29685FB8F7B70C0 632 + Queen, Black, 51 -> 0x535E44073CDF940 633 + King, White, 51 -> 0x77FE90B4279DA80 634 + King, Black, 51 -> 0x31DA0107C1AFD40 635 + Pawn, White, 52 -> 0x3992E791B7D35C0 636 + Pawn, Black, 52 -> 0x45EF753D9DC8D40 637 + Knight, White, 52 -> 0x13B9E6B6A75A880 638 + Knight, Black, 52 -> 0x5A5FDFE08614E80 639 + Bishop, White, 52 -> 0x2AE18BE6D86D9C0 640 + Bishop, Black, 52 -> 0x2A51321BB8B3780 641 + Rook, White, 52 -> 0x6D66D3F5E6A6940 642 + Rook, Black, 52 -> 0x25686A585A83640 643 + Queen, White, 52 -> 0xF223DE02F52740 644 + Queen, Black, 52 -> 0x20AA6016BF5AC0 645 + King, White, 52 -> 0x7EEE5FAC83CC740 646 + King, Black, 52 -> 0x745D8651B838E40 647 + Pawn, White, 53 -> 0x11B8D76D2FCAE40 648 + Pawn, Black, 53 -> 0x239C5B604FE1F00 649 + Knight, White, 53 -> 0x25CF1450E798300 650 + Knight, Black, 53 -> 0x686BFC3154B70C0 651 + Bishop, White, 53 -> 0x7369161A967BD40 652 + Bishop, Black, 53 -> 0x11956ACD96D7BC0 653 + Rook, White, 53 -> 0x46041E944F00D00 654 + Rook, Black, 53 -> 0x48F7F399520C840 655 + Queen, White, 53 -> 0x6E7F910205CDD00 656 + Queen, Black, 53 -> 0x5F8F9F309F0DA00 657 + King, White, 53 -> 0x320545D814BFD00 658 + King, Black, 53 -> 0x3C0C8BE3E11BD00 659 + Pawn, White, 54 -> 0x3D651D0A96316C0 660 + Pawn, Black, 54 -> 0x13F2BCB9B5C1D40 661 + Knight, White, 54 -> 0x7A55B20EE885C40 662 + Knight, Black, 54 -> 0x4C99A343BAEF080 663 + Bishop, White, 54 -> 0x265E179D4120CC0 664 + Bishop, Black, 54 -> 0x6AE88903C93E540 665 + Rook, White, 54 -> 0xBA654BF7E73800 666 + Rook, Black, 54 -> 0x6DE831579961E80 667 + Queen, White, 54 -> 0x5281AB15CA51100 668 + Queen, Black, 54 -> 0x2608638B5342F40 669 + King, White, 54 -> 0x478CC781DF9E480 670 + King, Black, 54 -> 0x240B63638CD00C0 671 + Pawn, White, 55 -> 0x63893DF45388900 672 + Pawn, Black, 55 -> 0x7FFF5445B58E840 673 + Knight, White, 55 -> 0x77DCF67DB228680 674 + Knight, Black, 55 -> 0x3DA3895C3A4400 675 + Bishop, White, 55 -> 0x276AEB56ED373C0 676 + Bishop, Black, 55 -> 0xC600192CF2A780 677 + Rook, White, 55 -> 0x697096CE6804200 678 + Rook, Black, 55 -> 0x630DE370219B780 679 + Queen, White, 55 -> 0x633497163287C0 680 + Queen, Black, 55 -> 0x4C00B4C47C08C0 681 + King, White, 55 -> 0x48335B7D6D65C80 682 + King, Black, 55 -> 0x73479FA59032B40 683 + Pawn, White, 56 -> 0x622E16EDCE8EDC0 684 + Pawn, Black, 56 -> 0x42C2EB93764600 685 + Knight, White, 56 -> 0xF3D06580064480 686 + Knight, Black, 56 -> 0x1697DA02595400 687 + Bishop, White, 56 -> 0x187EC7CF9B08AC0 688 + Bishop, Black, 56 -> 0x4F0AC222E26B740 689 + Rook, White, 56 -> 0x14C8C8992947580 690 + Rook, Black, 56 -> 0x75927E4BF39C680 691 + Queen, White, 56 -> 0x59875B74B209E40 692 + Queen, Black, 56 -> 0x5A606B01A341600 693 + King, White, 56 -> 0x381F7DEF427A580 694 + King, Black, 56 -> 0x492BCC6EBA25280 695 + Pawn, White, 57 -> 0x7D15739361E1C40 696 + Pawn, Black, 57 -> 0x2C600E2623F39C0 697 + Knight, White, 57 -> 0x214D42E2C139FC0 698 + Knight, Black, 57 -> 0xC489DBE804CE80 699 + Bishop, White, 57 -> 0x3429D122C09700 700 + Bishop, Black, 57 -> 0x49B5D6F5473BC80 701 + Rook, White, 57 -> 0x4E7E33D62A6D440 702 + Rook, Black, 57 -> 0x4B0FC57351F32C0 703 + Queen, White, 57 -> 0x5209BE095635700 704 + Queen, Black, 57 -> 0x686BB4219A0F5C0 705 + King, White, 57 -> 0x1F6EBEAA2F7C0C0 706 + King, Black, 57 -> 0x48F863232A4D7C0 707 + Pawn, White, 58 -> 0x677705ED673C8C0 708 + Pawn, Black, 58 -> 0x7A7E6622E3FB380 709 + Knight, White, 58 -> 0x6ACA9CA40D63A40 710 + Knight, Black, 58 -> 0x106FFB0EB73DF40 711 + Bishop, White, 58 -> 0x2CF5E0A519F7440 712 + Bishop, Black, 58 -> 0x3FECC54EA8FC140 713 + Rook, White, 58 -> 0x35557D0D223480 714 + Rook, Black, 58 -> 0x10AE4971A9CFB80 715 + Queen, White, 58 -> 0x64CE89F9168CCC0 716 + Queen, Black, 58 -> 0x64E9BEC4B613300 717 + King, White, 58 -> 0x654E9A9EA29E540 718 + King, Black, 58 -> 0x66552AF416FF480 719 + Pawn, White, 59 -> 0x7116328339F0D80 720 + Pawn, Black, 59 -> 0x53E3D2D1AA01B40 721 + Knight, White, 59 -> 0xF1448D1671480 722 + Knight, Black, 59 -> 0x46022A00071D8C0 723 + Bishop, White, 59 -> 0x6D530BCE3197280 724 + Bishop, Black, 59 -> 0x6850786DEF9FD40 725 + Rook, White, 59 -> 0x4BFD5189088B940 726 + Rook, Black, 59 -> 0x4EE44E44A4CF1C0 727 + Queen, White, 59 -> 0xA98364022DF840 728 + Queen, Black, 59 -> 0xADCC1DFBDCDFC0 729 + King, White, 59 -> 0xBA4252A7FC6E40 730 + King, Black, 59 -> 0x7D49E2A75582F80 731 + Pawn, White, 60 -> 0xB4C4AED06BEB40 732 + Pawn, Black, 60 -> 0x3AEE5B6056659C0 733 + Knight, White, 60 -> 0x36A302253C6F340 734 + Knight, Black, 60 -> 0x12E79BE4FDD7DC0 735 + Bishop, White, 60 -> 0x1205592BCD24D40 736 + Bishop, Black, 60 -> 0x6B2F29D5793CA40 737 + Rook, White, 60 -> 0x3839935FB678540 738 + Rook, Black, 60 -> 0x30D0ADAA32D20C0 739 + Queen, White, 60 -> 0x657DC3E05855C0 740 + Queen, Black, 60 -> 0x3AB099A5430780 741 + King, White, 60 -> 0x4806EA6BC10B40 742 + King, Black, 60 -> 0x52DCAFDF566D0C0 743 + Pawn, White, 61 -> 0x4939DC387AD5100 744 + Pawn, Black, 61 -> 0x463FCA447EEC340 745 + Knight, White, 61 -> 0x60D9A8A1122400 746 + Knight, Black, 61 -> 0x60F1B9A9F600F40 747 + Bishop, White, 61 -> 0x63FD8354DC38340 748 + Bishop, Black, 61 -> 0x6D0AD5AC9333C40 749 + Rook, White, 61 -> 0x1E2117E91556FC0 750 + Rook, Black, 61 -> 0x651690E7564DBC0 751 + Queen, White, 61 -> 0x24C092B3F6FA980 752 + Queen, Black, 61 -> 0x7170DF885C89F40 753 + King, White, 61 -> 0x160952C594AB840 754 + King, Black, 61 -> 0x1960C32C507EE40 755 + Pawn, White, 62 -> 0x3E3E91DCA869000 756 + Pawn, Black, 62 -> 0x1A663201A1227C0 757 + Knight, White, 62 -> 0x602C3C457D914C0 758 + Knight, Black, 62 -> 0x16ADAC64EBB6C0 759 + Bishop, White, 62 -> 0x101D0E79CA8DEC0 760 + Bishop, Black, 62 -> 0x7DD79D9D7761BC0 761 + Rook, White, 62 -> 0x2DCB73EBB034880 762 + Rook, Black, 62 -> 0x24A3C1359F0F6C0 763 + Queen, White, 62 -> 0x6A9D493B2D50480 764 + Queen, Black, 62 -> 0x322140EE9D880C0 765 + King, White, 62 -> 0x1D1A0F36B7B7E80 766 + King, Black, 62 -> 0x20997D7A83D7680 767 + Pawn, White, _ -> 0x14E23DCC534D140 768 + Pawn, Black, _ -> 0x14A6D6233107EC0 769 + Knight, White, _ -> 0x3E0AD32BF7CBB80 770 + Knight, Black, _ -> 0x7B25E28C2CC6D40 771 + Bishop, White, _ -> 0x2963B407A23D580 772 + Bishop, Black, _ -> 0x1E0601BD7144400 773 + Rook, White, _ -> 0x4C46AA1D8606B00 774 + Rook, Black, _ -> 0x58684C00A26DD40 775 + Queen, White, _ -> 0x5D6B6598679940 776 + Queen, Black, _ -> 0x70C6ECF0A679480 777 + King, White, _ -> 0x72DC4871EC5AEC0 778 + King, Black, _ -> 0x6FE5161F09FA3C0 779 + } 780 + } 781 + 782 + pub const black_to_move_hash = 0x2198904CFE5900
+7 -70
src/starfish/internal/hash.gleam
··· 5 5 import gleam/int 6 6 import iv 7 7 import starfish/internal/board 8 - 9 - const white_pawn = 0 10 - 11 - const black_pawn = 1 12 - 13 - const white_knight = 2 14 - 15 - const black_knight = 3 16 - 17 - const white_bishop = 4 18 - 19 - const black_bishop = 5 20 - 21 - const white_rook = 6 22 - 23 - const black_rook = 7 8 + import starfish/internal/generated 24 9 25 - const white_queen = 8 26 - 27 - const black_queen = 9 28 - 29 - const white_king = 10 30 - 31 - const black_king = 11 32 - 33 - const num_pieces = 12 34 - 35 - /// Data structure for storing randomly generated data used for hashing positions 36 - pub opaque type HashData { 37 - HashData(table: iv.Array(Int), black_to_move: Int) 38 - } 39 - 40 - const max_64_bit_int = 18_446_744_073_709_552_000 41 - 42 - pub fn generate_data() -> HashData { 43 - let table = 44 - iv.initialise(num_pieces * board.side_length * board.side_length, fn(_) { 45 - int.random(max_64_bit_int) 46 - }) 47 - let black_to_move = int.random(max_64_bit_int) 48 - HashData(table:, black_to_move:) 49 - } 50 - 51 - pub fn hash(data: HashData, board: board.Board, to_move: board.Colour) -> Int { 10 + pub fn hash(board: board.Board, to_move: board.Colour) -> Int { 52 11 let hash = case to_move { 53 - board.Black -> data.black_to_move 12 + board.Black -> generated.black_to_move_hash 54 13 board.White -> 0 55 14 } 56 15 57 16 dict.fold(board, hash, fn(hash, position, square) { 58 17 let #(piece, colour) = square 59 - toggle_hash_square(hash, position, piece, colour, data) 18 + int.bitwise_exclusive_or( 19 + generated.hash_for_piece(piece, colour, position), 20 + hash, 21 + ) 60 22 }) 61 - } 62 - 63 - fn toggle_hash_square( 64 - hash: Int, 65 - position: Int, 66 - piece: board.Piece, 67 - colour: board.Colour, 68 - data: HashData, 69 - ) -> Int { 70 - let piece_index = case piece, colour { 71 - board.Pawn, board.White -> white_pawn 72 - board.Bishop, board.White -> white_bishop 73 - board.King, board.White -> white_king 74 - board.Knight, board.White -> white_knight 75 - board.Queen, board.White -> white_queen 76 - board.Rook, board.White -> white_rook 77 - board.Bishop, board.Black -> black_bishop 78 - board.King, board.Black -> black_king 79 - board.Knight, board.Black -> black_knight 80 - board.Pawn, board.Black -> black_pawn 81 - board.Queen, board.Black -> black_queen 82 - board.Rook, board.Black -> black_rook 83 - } 84 - let index = position * num_pieces + piece_index 85 - int.bitwise_exclusive_or(iv.get_or_default(data.table, index, 0), hash) 86 23 } 87 24 88 25 pub type Table =
+2 -10
src/starfish/internal/move.gleam
··· 478 478 half_moves:, 479 479 full_moves:, 480 480 zobrist_hash:, 481 - hash_data:, 482 - piece_tables:, 483 481 previous_positions:, 484 482 attack_information: _, 485 483 ) = game ··· 526 524 let previous_positions = set.insert(previous_positions, zobrist_hash) 527 525 528 526 // TODO: Update incrementally 529 - let zobrist_hash = hash.hash(hash_data, board, to_move) 527 + let zobrist_hash = hash.hash(board, to_move) 530 528 531 529 // TODO: Maybe we can update this incrementally too? 532 530 let attack_information = attack.calculate(board, to_move) ··· 539 537 half_moves:, 540 538 full_moves:, 541 539 zobrist_hash:, 542 - hash_data:, 543 - piece_tables:, 544 540 previous_positions:, 545 541 attack_information:, 546 542 ) ··· 562 558 half_moves:, 563 559 full_moves:, 564 560 zobrist_hash:, 565 - hash_data:, 566 - piece_tables:, 567 561 previous_positions:, 568 562 attack_information: _, 569 563 ) = game ··· 616 610 } 617 611 618 612 // TODO: Update incrementally 619 - let zobrist_hash = hash.hash(hash_data, board, to_move) 613 + let zobrist_hash = hash.hash(board, to_move) 620 614 621 615 // TODO: Maybe we can update this incrementally too? 622 616 let attack_information = attack.calculate(board, to_move) ··· 629 623 half_moves:, 630 624 full_moves:, 631 625 zobrist_hash:, 632 - hash_data:, 633 - piece_tables:, 634 626 previous_positions:, 635 627 attack_information:, 636 628 )
+627 -30
src/starfish/internal/piece_table.gleam
··· 4 4 //// Each table is made from white's perspective. To get scores for black, simply 5 5 //// reverse the squares. 6 6 7 - import iv 7 + import starfish/internal/board 8 + 9 + // Values taken from https://www.chessprogramming.org/Simplified_Evaluation_Function 10 + 11 + // We use tuples for constant time accessing. The values are constant so we don't 12 + // need to worry about the cost of updating. 8 13 9 - const pawn = [] 14 + const pawn = #( 15 + 0, 16 + 0, 17 + 0, 18 + 0, 19 + 0, 20 + 0, 21 + 0, 22 + 0, 23 + 30, 24 + 30, 25 + 30, 26 + 30, 27 + 30, 28 + 30, 29 + 30, 30 + 30, 31 + 10, 32 + 10, 33 + 20, 34 + 30, 35 + 30, 36 + 20, 37 + 10, 38 + 10, 39 + 5, 40 + 5, 41 + 10, 42 + 25, 43 + 25, 44 + 10, 45 + 5, 46 + 5, 47 + 0, 48 + 0, 49 + 0, 50 + 20, 51 + 20, 52 + 0, 53 + 0, 54 + 0, 55 + 5, 56 + -5, 57 + -10, 58 + 0, 59 + 0, 60 + -10, 61 + -5, 62 + 5, 63 + 5, 64 + 10, 65 + 10, 66 + -20, 67 + -20, 68 + 10, 69 + 10, 70 + 5, 71 + 0, 72 + 0, 73 + 0, 74 + 0, 75 + 0, 76 + 0, 77 + 0, 78 + 0, 79 + ) 10 80 11 - const knight = [] 81 + const knight = #( 82 + -50, 83 + -40, 84 + -30, 85 + -30, 86 + -30, 87 + -30, 88 + -40, 89 + -50, 90 + -40, 91 + -20, 92 + 0, 93 + 0, 94 + 0, 95 + 0, 96 + -20, 97 + -40, 98 + -30, 99 + 0, 100 + 10, 101 + 15, 102 + 15, 103 + 10, 104 + 0, 105 + -30, 106 + -30, 107 + 5, 108 + 15, 109 + 20, 110 + 20, 111 + 15, 112 + 5, 113 + -30, 114 + -30, 115 + 0, 116 + 15, 117 + 20, 118 + 20, 119 + 15, 120 + 0, 121 + -30, 122 + -30, 123 + 5, 124 + 10, 125 + 15, 126 + 15, 127 + 10, 128 + 5, 129 + -30, 130 + -40, 131 + -20, 132 + 0, 133 + 5, 134 + 5, 135 + 0, 136 + -20, 137 + -40, 138 + -50, 139 + -40, 140 + -30, 141 + -30, 142 + -30, 143 + -30, 144 + -40, 145 + -50, 146 + ) 12 147 13 - const bishop = [] 148 + const bishop = #( 149 + -20, 150 + -10, 151 + -10, 152 + -10, 153 + -10, 154 + -10, 155 + -10, 156 + -20, 157 + -10, 158 + 0, 159 + 0, 160 + 0, 161 + 0, 162 + 0, 163 + 0, 164 + -10, 165 + -10, 166 + 0, 167 + 5, 168 + 10, 169 + 10, 170 + 5, 171 + 0, 172 + -10, 173 + -10, 174 + 5, 175 + 5, 176 + 10, 177 + 10, 178 + 5, 179 + 5, 180 + -10, 181 + -10, 182 + 0, 183 + 10, 184 + 10, 185 + 10, 186 + 10, 187 + 0, 188 + -10, 189 + -10, 190 + 10, 191 + 10, 192 + 10, 193 + 10, 194 + 10, 195 + 10, 196 + -10, 197 + -10, 198 + 5, 199 + 0, 200 + 0, 201 + 0, 202 + 0, 203 + 5, 204 + -10, 205 + -20, 206 + -10, 207 + -10, 208 + -10, 209 + -10, 210 + -10, 211 + -10, 212 + -20, 213 + ) 14 214 15 - const rook = [] 215 + const rook = #( 216 + 0, 217 + 0, 218 + 0, 219 + 0, 220 + 0, 221 + 0, 222 + 0, 223 + 0, 224 + 5, 225 + 10, 226 + 10, 227 + 10, 228 + 10, 229 + 10, 230 + 10, 231 + 5, 232 + -5, 233 + 0, 234 + 0, 235 + 0, 236 + 0, 237 + 0, 238 + 0, 239 + -5, 240 + -5, 241 + 0, 242 + 0, 243 + 0, 244 + 0, 245 + 0, 246 + 0, 247 + -5, 248 + -5, 249 + 0, 250 + 0, 251 + 0, 252 + 0, 253 + 0, 254 + 0, 255 + -5, 256 + -5, 257 + 0, 258 + 0, 259 + 0, 260 + 0, 261 + 0, 262 + 0, 263 + -5, 264 + -5, 265 + 0, 266 + 0, 267 + 0, 268 + 0, 269 + 0, 270 + 0, 271 + -5, 272 + 0, 273 + 0, 274 + 0, 275 + 5, 276 + 5, 277 + 0, 278 + 0, 279 + 0, 280 + ) 16 281 17 - const queen = [] 282 + const queen = #( 283 + -20, 284 + -10, 285 + -10, 286 + -5, 287 + -5, 288 + -10, 289 + -10, 290 + -20, 291 + -10, 292 + 0, 293 + 0, 294 + 0, 295 + 0, 296 + 0, 297 + 0, 298 + -10, 299 + -10, 300 + 0, 301 + 5, 302 + 5, 303 + 5, 304 + 5, 305 + 0, 306 + -10, 307 + -5, 308 + 0, 309 + 5, 310 + 5, 311 + 5, 312 + 5, 313 + 0, 314 + -5, 315 + 0, 316 + 0, 317 + 5, 318 + 5, 319 + 5, 320 + 5, 321 + 0, 322 + -5, 323 + -10, 324 + 5, 325 + 5, 326 + 5, 327 + 5, 328 + 5, 329 + 0, 330 + -10, 331 + -10, 332 + 0, 333 + 5, 334 + 0, 335 + 0, 336 + 0, 337 + 0, 338 + -10, 339 + -20, 340 + -10, 341 + -10, 342 + -5, 343 + -5, 344 + -10, 345 + -10, 346 + -20, 347 + ) 18 348 19 - const king = [] 349 + const king = #( 350 + -30, 351 + -40, 352 + -40, 353 + -50, 354 + -50, 355 + -40, 356 + -40, 357 + -30, 358 + -30, 359 + -40, 360 + -40, 361 + -50, 362 + -50, 363 + -40, 364 + -40, 365 + -30, 366 + -30, 367 + -40, 368 + -40, 369 + -50, 370 + -50, 371 + -40, 372 + -40, 373 + -30, 374 + -30, 375 + -40, 376 + -40, 377 + -50, 378 + -50, 379 + -40, 380 + -40, 381 + -30, 382 + -20, 383 + -30, 384 + -30, 385 + -40, 386 + -40, 387 + -30, 388 + -30, 389 + -20, 390 + -10, 391 + -20, 392 + -20, 393 + -20, 394 + -20, 395 + -20, 396 + -20, 397 + -10, 398 + 20, 399 + 20, 400 + 0, 401 + 0, 402 + 0, 403 + 0, 404 + 20, 405 + 20, 406 + 20, 407 + 30, 408 + 10, 409 + 0, 410 + 0, 411 + 10, 412 + 30, 413 + 20, 414 + ) 20 415 21 416 /// In the beginning and middle of the game, the king must be kept safe, however 22 417 /// as the game progresses towards the end, the king should become more aggressive 23 418 /// so we use a different set of scores for kings in the endgame. 24 - const king_endgame = [] 419 + const king_endgame = #( 420 + -50, 421 + -40, 422 + -30, 423 + -20, 424 + -20, 425 + -30, 426 + -40, 427 + -50, 428 + -30, 429 + -20, 430 + -10, 431 + 0, 432 + 0, 433 + -10, 434 + -20, 435 + -30, 436 + -30, 437 + -10, 438 + 20, 439 + 30, 440 + 30, 441 + 20, 442 + -10, 443 + -30, 444 + -30, 445 + -10, 446 + 30, 447 + 40, 448 + 40, 449 + 30, 450 + -10, 451 + -30, 452 + -30, 453 + -10, 454 + 30, 455 + 40, 456 + 40, 457 + 30, 458 + -10, 459 + -30, 460 + -30, 461 + -10, 462 + 20, 463 + 30, 464 + 30, 465 + 20, 466 + -10, 467 + -30, 468 + -30, 469 + -30, 470 + 0, 471 + 0, 472 + 0, 473 + 0, 474 + -30, 475 + -30, 476 + -50, 477 + -30, 478 + -30, 479 + -30, 480 + -30, 481 + -30, 482 + -30, 483 + -50, 484 + ) 25 485 26 - /// A type which keeps track of the table for each piece 27 - pub opaque type PieceTables { 28 - PieceTables( 29 - pawn: iv.Array(Int), 30 - knight: iv.Array(Int), 31 - bishop: iv.Array(Int), 32 - rook: iv.Array(Int), 33 - queen: iv.Array(Int), 34 - king: iv.Array(Int), 35 - king_endgame: iv.Array(Int), 486 + type Table = 487 + #( 488 + Int, 489 + Int, 490 + Int, 491 + Int, 492 + Int, 493 + Int, 494 + Int, 495 + Int, 496 + Int, 497 + Int, 498 + Int, 499 + Int, 500 + Int, 501 + Int, 502 + Int, 503 + Int, 504 + Int, 505 + Int, 506 + Int, 507 + Int, 508 + Int, 509 + Int, 510 + Int, 511 + Int, 512 + Int, 513 + Int, 514 + Int, 515 + Int, 516 + Int, 517 + Int, 518 + Int, 519 + Int, 520 + Int, 521 + Int, 522 + Int, 523 + Int, 524 + Int, 525 + Int, 526 + Int, 527 + Int, 528 + Int, 529 + Int, 530 + Int, 531 + Int, 532 + Int, 533 + Int, 534 + Int, 535 + Int, 536 + Int, 537 + Int, 538 + Int, 539 + Int, 540 + Int, 541 + Int, 542 + Int, 543 + Int, 544 + Int, 545 + Int, 546 + Int, 547 + Int, 548 + Int, 549 + Int, 550 + Int, 551 + Int, 36 552 ) 553 + 554 + fn get(table: Table, index: Int, default: Int) -> Int { 555 + case index { 556 + 0 -> table.0 557 + 1 -> table.1 558 + 2 -> table.2 559 + 3 -> table.3 560 + 4 -> table.4 561 + 5 -> table.5 562 + 6 -> table.6 563 + 7 -> table.7 564 + 8 -> table.8 565 + 9 -> table.9 566 + 10 -> table.10 567 + 11 -> table.11 568 + 12 -> table.12 569 + 13 -> table.13 570 + 14 -> table.14 571 + 15 -> table.15 572 + 16 -> table.16 573 + 17 -> table.17 574 + 18 -> table.18 575 + 19 -> table.19 576 + 20 -> table.20 577 + 21 -> table.21 578 + 22 -> table.22 579 + 23 -> table.23 580 + 24 -> table.24 581 + 25 -> table.25 582 + 26 -> table.26 583 + 27 -> table.27 584 + 28 -> table.28 585 + 29 -> table.29 586 + 30 -> table.30 587 + 31 -> table.31 588 + 32 -> table.32 589 + 33 -> table.33 590 + 34 -> table.34 591 + 35 -> table.35 592 + 36 -> table.36 593 + 37 -> table.37 594 + 38 -> table.38 595 + 39 -> table.39 596 + 40 -> table.40 597 + 41 -> table.41 598 + 42 -> table.42 599 + 43 -> table.43 600 + 44 -> table.44 601 + 45 -> table.45 602 + 46 -> table.46 603 + 47 -> table.47 604 + 48 -> table.48 605 + 49 -> table.49 606 + 50 -> table.50 607 + 51 -> table.51 608 + 52 -> table.52 609 + 53 -> table.53 610 + 54 -> table.54 611 + 55 -> table.55 612 + 56 -> table.56 613 + 57 -> table.57 614 + 58 -> table.58 615 + 59 -> table.59 616 + 60 -> table.60 617 + 61 -> table.61 618 + 62 -> table.62 619 + 63 -> table.63 620 + _ -> default 621 + } 37 622 } 38 623 39 - /// Turn the `List`s which are in the constants into `iv.Arrays` for faster 40 - /// accessing 41 - pub fn construct_tables() -> PieceTables { 42 - PieceTables( 43 - pawn: iv.from_list(pawn), 44 - knight: iv.from_list(knight), 45 - bishop: iv.from_list(bishop), 46 - rook: iv.from_list(rook), 47 - queen: iv.from_list(queen), 48 - king: iv.from_list(king), 49 - king_endgame: iv.from_list(king_endgame), 50 - ) 624 + /// Calculate the score for a given piece at a position at some point in the game 625 + pub fn piece_score( 626 + piece: board.Piece, 627 + colour: board.Colour, 628 + position: Int, 629 + ) -> Int { 630 + let table = case piece { 631 + board.Pawn -> pawn 632 + board.Bishop -> bishop 633 + board.Knight -> knight 634 + board.Queen -> queen 635 + board.Rook -> rook 636 + board.King -> king 637 + } 638 + 639 + // If the piece is black, the table must be reversed to we index from the end 640 + // instead. 641 + let index = case colour { 642 + board.White -> position 643 + board.Black -> 63 - position 644 + } 645 + 646 + // TODO: take into account endgame for kings 647 + get(table, index, 0) 51 648 }
+1 -2
test/starfish_test.gleam
··· 12 12 gleeunit.main() 13 13 } 14 14 15 - // Ignore `HashData` and `PieceTables` as they are not relevant to the state of 16 - // the board. 15 + /// Compare the state of two games, ignoring additional fields 17 16 fn game_equal(a: game.Game, b: game.Game) -> Bool { 18 17 a.board == b.board 19 18 && a.to_move == b.to_move