Minor auto cpu improvements.

This commit is contained in:
yukirij 2025-01-24 16:37:56 -08:00
parent e8b747dc47
commit 25b3d3f0c1
3 changed files with 125 additions and 87 deletions

View File

@ -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,7 +381,8 @@ const GAME_CONFIGS = {
.set_rule("reverse", true),
// Trials
Guide_Trial1: new GameConfig()
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(
@ -394,7 +397,7 @@ const GAME_CONFIGS = {
)
.set_rule("cpu", true),
Guide_Trial2: new GameConfig()
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(
@ -409,7 +412,7 @@ const GAME_CONFIGS = {
)
.set_rule("cpu", true),
Guide_Trial3: new GameConfig()
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(
@ -436,4 +439,40 @@ const GAME_CONFIGS = {
.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),
],
};

View File

@ -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();
// Select move.
if(moves.length > 0) {
// 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);
}
// 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);
}
moves[mv].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);
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");
}
},

View File

@ -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([], []);