From 25b3d3f0c114dd3c82e65a7c47033ed36f86ca06 Mon Sep 17 00:00:00 2001 From: yukirij Date: Fri, 24 Jan 2025 16:37:56 -0800 Subject: [PATCH] Minor auto cpu improvements. --- www/js/game_config_const.js | 151 +++++++++++++++++++++++------------- www/js/interface.js | 41 ++++------ www/js/scene.js | 20 +++-- 3 files changed, 125 insertions(+), 87 deletions(-) diff --git a/www/js/game_config_const.js b/www/js/game_config_const.js index 8b5a1bd..ad56041 100644 --- a/www/js/game_config_const.js +++ b/www/js/game_config_const.js @@ -336,9 +336,9 @@ const GAME_CONFIGS = { .add_piece(5, 0, false, new MATH.Vec2(5, 4)) .add_piece(0, 1, false, new MATH.Vec2(4, 4)) .add_piece(2, 1, false, new MATH.Vec2(5, 6)) - ) .set_rule("cpu", true), + Guide_Check2: new GameConfig() .set_pieces(CONFIG_PIECES_STANDARD) .set_pool(new Uint8Array([1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0])) @@ -350,8 +350,10 @@ const GAME_CONFIGS = { .add_piece(1, 1, false, new MATH.Vec2(4, 4)) .add_piece(6, 1, true, new MATH.Vec2(7, 3)) .add_piece(1, 1, true, new MATH.Vec2(2, 0)) + .add_piece(5, 1, false, new MATH.Vec2(1, 4)) ) .set_rule("cpu", true), + Guide_Check3: new GameConfig() .set_pieces(CONFIG_PIECES_STANDARD) .set_pool(new Uint8Array([1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0])) @@ -379,61 +381,98 @@ const GAME_CONFIGS = { .set_rule("reverse", true), // Trials - Guide_Trial1: new GameConfig() - .set_pieces(CONFIG_PIECES_STANDARD) - .set_pool(new Uint8Array([1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1])) - .set_layout( - new GameConfig.Layout() - .add_piece(7, 1, false, new MATH.Vec2(4, 8)) - .add_piece(4, 1, true, new MATH.Vec2(4, 7)) - .add_piece(2, 1, false, new MATH.Vec2(5, 8)) - .add_piece(2, 1, false, new MATH.Vec2(3, 5)) - .add_piece(3, 0, true, new MATH.Vec2(2, 6)) - .add_piece(6, 0, true, new MATH.Vec2(1, 5)) - .add_piece(2, 0, true, new MATH.Vec2(7, 7)) - ) - .set_rule("cpu", true), + Guide_Trial: [ + new GameConfig() + .set_pieces(CONFIG_PIECES_STANDARD) + .set_pool(new Uint8Array([1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1])) + .set_layout( + new GameConfig.Layout() + .add_piece(7, 1, false, new MATH.Vec2(4, 8)) + .add_piece(4, 1, true, new MATH.Vec2(4, 7)) + .add_piece(2, 1, false, new MATH.Vec2(5, 8)) + .add_piece(2, 1, false, new MATH.Vec2(3, 5)) + .add_piece(3, 0, true, new MATH.Vec2(2, 6)) + .add_piece(6, 0, true, new MATH.Vec2(1, 5)) + .add_piece(2, 0, true, new MATH.Vec2(7, 7)) + ) + .set_rule("cpu", true), - Guide_Trial2: new GameConfig() - .set_pieces(CONFIG_PIECES_STANDARD) - .set_pool(new Uint8Array([1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1])) - .set_layout( - new GameConfig.Layout() - .add_piece(7, 1, false, new MATH.Vec2(4, 8)) - .add_piece(2, 1, false, new MATH.Vec2(3, 7)) - .add_piece(3, 1, false, new MATH.Vec2(4, 6)) - .add_piece(5, 1, true, new MATH.Vec2(2, 3)) - .add_piece(2, 0, true, new MATH.Vec2(6, 7)) - .add_piece(6, 0, false, new MATH.Vec2(4, 4)) - .add_piece(5, 0, false, new MATH.Vec2(4, 2)) - ) - .set_rule("cpu", true), + new GameConfig() + .set_pieces(CONFIG_PIECES_STANDARD) + .set_pool(new Uint8Array([1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1])) + .set_layout( + new GameConfig.Layout() + .add_piece(7, 1, false, new MATH.Vec2(4, 8)) + .add_piece(2, 1, false, new MATH.Vec2(3, 7)) + .add_piece(3, 1, false, new MATH.Vec2(4, 6)) + .add_piece(5, 1, true, new MATH.Vec2(2, 3)) + .add_piece(2, 0, true, new MATH.Vec2(6, 7)) + .add_piece(6, 0, false, new MATH.Vec2(4, 4)) + .add_piece(5, 0, false, new MATH.Vec2(4, 2)) + ) + .set_rule("cpu", true), - Guide_Trial3: new GameConfig() - .set_pieces(CONFIG_PIECES_STANDARD) - .set_pool(new Uint8Array([4, 1, 0, 2, 0, 0, 1, 9, 1, 0, 0, 2, 0, 0])) - .set_layout( - new GameConfig.Layout() - .add_piece(5, 0, false, new MATH.Vec2(4, 6)) - .add_piece(3, 0, false, new MATH.Vec2(5, 5)) - .add_piece(7, 1, false, new MATH.Vec2(4, 7)) - .add_piece(4, 1, false, new MATH.Vec2(5, 8)) - .add_piece(3, 1, false, new MATH.Vec2(6, 8)) - .add_piece(4, 1, false, new MATH.Vec2(2, 6)) - .add_piece(2, 1, false, new MATH.Vec2(4, 8)) - .add_piece(1, 0, false, new MATH.Vec2(2, 1)) - .add_piece(0, 1, false, new MATH.Vec2(3, 2)) - .add_piece(0, 1, false, new MATH.Vec2(5, 6)) - .add_piece(7, 0, false, new MATH.Vec2(5, 2)) - .add_piece(2, 1, true, new MATH.Vec2(7, 5)) - .add_piece(6, 1, true, new MATH.Vec2(6, 4)) - .add_piece(0, 0, false, new MATH.Vec2(4, 3)) - .add_piece(5, 1, true, new MATH.Vec2(3, 0)) - .add_piece(1, 1, true, new MATH.Vec2(1, 2)) - .add_piece(0, 1, false, new MATH.Vec2(0, 1)) - .add_piece(2, 0, false, new MATH.Vec2(6, 5)) - .add_piece(0, 1, false, new MATH.Vec2(1, 4)) - .add_piece(2, 0, true, new MATH.Vec2(0, 3)) - ) - .set_rule("cpu", true), + new GameConfig() + .set_pieces(CONFIG_PIECES_STANDARD) + .set_pool(new Uint8Array([4, 1, 0, 2, 0, 0, 1, 9, 1, 0, 0, 2, 0, 0])) + .set_layout( + new GameConfig.Layout() + .add_piece(5, 0, false, new MATH.Vec2(4, 6)) + .add_piece(3, 0, false, new MATH.Vec2(5, 5)) + .add_piece(7, 1, false, new MATH.Vec2(4, 7)) + .add_piece(4, 1, false, new MATH.Vec2(5, 8)) + .add_piece(3, 1, false, new MATH.Vec2(6, 8)) + .add_piece(4, 1, false, new MATH.Vec2(2, 6)) + .add_piece(2, 1, false, new MATH.Vec2(4, 8)) + .add_piece(1, 0, false, new MATH.Vec2(2, 1)) + .add_piece(0, 1, false, new MATH.Vec2(3, 2)) + .add_piece(0, 1, false, new MATH.Vec2(5, 6)) + .add_piece(7, 0, false, new MATH.Vec2(5, 2)) + .add_piece(2, 1, true, new MATH.Vec2(7, 5)) + .add_piece(6, 1, true, new MATH.Vec2(6, 4)) + .add_piece(0, 0, false, new MATH.Vec2(4, 3)) + .add_piece(5, 1, true, new MATH.Vec2(3, 0)) + .add_piece(1, 1, true, new MATH.Vec2(1, 2)) + .add_piece(0, 1, false, new MATH.Vec2(0, 1)) + .add_piece(2, 0, false, new MATH.Vec2(6, 5)) + .add_piece(0, 1, false, new MATH.Vec2(1, 4)) + .add_piece(2, 0, true, new MATH.Vec2(0, 3)) + ) + .set_rule("cpu", true), + + new GameConfig() + .set_pieces(CONFIG_PIECES_STANDARD) + .set_pool(new Uint8Array([1, 0, 1, 0, 0, 0, 0, 7, 2, 0, 1, 2, 1, 0])) + .set_layout( + new GameConfig.Layout() + .add_piece(7, 0, false, new MATH.Vec2(1, 0)) + .add_piece(1, 0, false, new MATH.Vec2(1, 1)) + .add_piece(0, 0, false, new MATH.Vec2(0, 1)) + .add_piece(0, 0, false, new MATH.Vec2(1, 2)) + .add_piece(3, 0, false, new MATH.Vec2(2, 1)) + .add_piece(0, 0, false, new MATH.Vec2(3, 2)) + .add_piece(0, 0, false, new MATH.Vec2(4, 3)) + .add_piece(2, 0, false, new MATH.Vec2(5, 2)) + .add_piece(0, 0, false, new MATH.Vec2(6, 4)) + .add_piece(2, 0, false, new MATH.Vec2(7, 4)) + + .add_piece(1, 1, false, new MATH.Vec2(0, 4)) + .add_piece(0, 1, false, new MATH.Vec2(0, 3)) + .add_piece(2, 1, false, new MATH.Vec2(1, 5)) + .add_piece(0, 1, false, new MATH.Vec2(1, 4)) + .add_piece(4, 1, false, new MATH.Vec2(2, 6)) + .add_piece(0, 1, false, new MATH.Vec2(2, 4)) + .add_piece(3, 1, false, new MATH.Vec2(3, 7)) + .add_piece(0, 1, false, new MATH.Vec2(3, 4)) + .add_piece(7, 1, false, new MATH.Vec2(4, 8)) + .add_piece(3, 1, false, new MATH.Vec2(5, 8)) + .add_piece(6, 1, false, new MATH.Vec2(5, 7)) + .add_piece(4, 1, false, new MATH.Vec2(6, 7)) + + .add_piece(0, 1, true, new MATH.Vec2(3, 0)) + .add_piece(5, 1, true, new MATH.Vec2(4, 2)) + .add_piece(6, 1, true, new MATH.Vec2(5, 1)) + ) + .set_rule("cpu", true), + ], }; diff --git a/www/js/interface.js b/www/js/interface.js index c4adeeb..06e6d34 100644 --- a/www/js/interface.js +++ b/www/js/interface.js @@ -1895,7 +1895,7 @@ const INTERFACE = { let opponent = player ^ 1; let turn = (state.turn & 1); - if(state.state.checkmate) { + if(state.state.code != 0) { if(turn == player) { score = -100000; } else { score = 100000; } } else { @@ -1963,6 +1963,8 @@ const INTERFACE = { let moves = [ ]; let player = state.turn & 1; + let st = state.clone(); + // Get available placement moves. for(let p = 0; p < 8; ++p) { if(state.pools[player].pieces[p] > 0) { @@ -1994,37 +1996,27 @@ const INTERFACE = { } } - // Get move scores. - let st = state.clone(); - for(let mv = 0; mv < moves.length; ++mv) { - st.from(state); - st.process(moves[mv].play); - moves[mv].score = state_score(st, player); - } - // Select move. if(moves.length > 0) { - moves.sort((a, b) => { return b.score - a.score }); - if(depth == 0) { - // Get move scores for search player. - for(let i = 0; i < moves.length; ++i) { - let st = state.clone(); - st.process(moves[i].play); - moves[i].score = state_score(st, search_player); - } - } else { - for(let i = 0; i < moves.length && i < 8; ++i) { - let st = state.clone(); - st.process(moves[i].play); - + // Determine move scores. + for(let mv = 0; mv < moves.length; ++mv) { + st.from(state); + st.process(moves[mv].play); + + moves[mv].score = state_score(st, player); + if(depth == 0) { + moves[mv].score = state_score(st, search_player); + } else { let result = determine_play(st, search_player, depth - 1); if(result !== null) { - moves[i].score = result.score; + moves[mv].score = result.score; } } } + moves.sort((a, b) => { return b.score - a.score }); + // Select random from ties. let selection = 0; for(let i = 1; i < moves.length; ++i) { @@ -2042,10 +2034,7 @@ const INTERFACE = { let result = determine_play(GAME_DATA, GAME_DATA.turn & 1, 1); if(result !== null) { - console.log("PL" + result.play.from + " " + result.play.to); INTERFACE.process(result.play); - } else { - console.log("MOVES NULL"); } }, diff --git a/www/js/scene.js b/www/js/scene.js index 0936f84..83b444f 100644 --- a/www/js/scene.js +++ b/www/js/scene.js @@ -680,12 +680,22 @@ const SCENES = { ], []); } break; case "checkmate": { - UI.mainnav([ + function cb() { + INTERFACE.load(GAME_CONFIGS.Guide_Trial[this.id]); + } + + let buttons = [ UI.button("Ex", () => { INTERFACE.load(GAME_CONFIGS.Guide_Checkmate); }), - UI.button("1", () => { INTERFACE.load(GAME_CONFIGS.Guide_Trial1); }), - UI.button("2", () => { INTERFACE.load(GAME_CONFIGS.Guide_Trial2); }), - UI.button("3", () => { INTERFACE.load(GAME_CONFIGS.Guide_Trial3); }), - ], []); + ]; + for(let i = 0; i < GAME_CONFIGS.Guide_Trial.length; ++i) { + let bound = cb.bind({ + id: i, + }); + let button = UI.button((i + 1).toString(), bound); + buttons.push(button); + } + + UI.mainnav(buttons, []); } break; default: { UI.mainnav([], []);