From 9dcde0e45109a074d886bc7e479a105e2ae2203f Mon Sep 17 00:00:00 2001 From: nils <48135649+Nilstrieb@users.noreply.github.com> Date: Mon, 9 Jan 2023 15:19:34 +0100 Subject: [PATCH] works --- minmax-rs/src/connect4/board.rs | 28 ++++++++++++++++------------ rs-wrapper/src/lib.rs | 23 ++++++++++++++++++----- 2 files changed, 34 insertions(+), 17 deletions(-) diff --git a/minmax-rs/src/connect4/board.rs b/minmax-rs/src/connect4/board.rs index 4a7362b..025a6d2 100644 --- a/minmax-rs/src/connect4/board.rs +++ b/minmax-rs/src/connect4/board.rs @@ -115,6 +115,20 @@ impl Connect4 { Score::new(score_player(player) - score_player(player.opponent())) } + + pub fn drop_player(&self, position: usize) -> usize { + for i in 0..3 { + let prev = position + (i * WIDTH); + let next = position + ((i + 1) * WIDTH); + + if self[next].is_some() { + return prev; + } + } + + let bottom = position + (3 * WIDTH); + bottom + } } impl Index for Connect4 { @@ -150,18 +164,8 @@ impl Game for Connect4 { } fn make_move(&mut self, position: Self::Move, player: Player) { - for i in 0..3 { - let prev = position + (i * WIDTH); - let next = position + ((i + 1) * WIDTH); - - if self[next].is_some() { - self[prev] = Some(player); - return; - } - } - - let bottom = position + (3 * WIDTH); - self[bottom] = Some(player); + let pos = self.drop_player(position); + self[pos] = Some(player); } fn undo_move(&mut self, position: Self::Move) { diff --git a/rs-wrapper/src/lib.rs b/rs-wrapper/src/lib.rs index 200c458..5e1cdb3 100644 --- a/rs-wrapper/src/lib.rs +++ b/rs-wrapper/src/lib.rs @@ -2,7 +2,7 @@ use jni::objects::{JClass, JObject, ReleaseMode}; use jni::sys::{jbyte, jint}; use jni::JNIEnv; use minmax::{connect4::board::Connect4, GamePlayer}; -use minmax::{PerfectPlayer, Player}; +use minmax::{Game, PerfectPlayer, Player}; /// We need to map the board. /// Rust: @@ -22,7 +22,7 @@ use minmax::{PerfectPlayer, Player}; fn map_idx(i: usize) -> usize { match () { () if i < 7 => i + 21, - () if i < 15 => i + 7, + () if i < 14 => i + 7, () if i < 21 => i - 7, () => i - 21, } @@ -34,7 +34,10 @@ fn crate_board(java_board: &[i8]) -> Connect4 { for i in 0..28 { let java_int = java_board[i]; let rust_value = match java_int { - 0 => Some(Player::X), + 0 => { + dbg!("x player {i}", i, map_idx(i)); + Some(Player::X) + }, 1 => Some(Player::O), 2 => None, _ => unreachable!(), @@ -61,8 +64,12 @@ pub fn wrap_player(env: JNIEnv<'_>, current_player: i8, board: JObject<'_>) -> i let slice = unsafe { std::slice::from_raw_parts(byte_array.as_ptr() as *const _, 28) }; + dbg!(slice); + let mut board = crate_board(slice); + println!("{board}"); + let mut player = PerfectPlayer::new(false); let current_player_rust = match current_player { @@ -72,10 +79,16 @@ pub fn wrap_player(env: JNIEnv<'_>, current_player: i8, board: JObject<'_>) -> i }; player.next_move(&mut board, current_player_rust); - let result_move = player.best_move(); + board.undo_move(result_move); - map_idx(result_move) as i32 + let result_move = board.drop_player(result_move); + + let java_idx = map_idx(result_move) as i32; + + dbg!(result_move, java_idx); + + java_idx } // This keeps Rust from "mangling" the name and making it unique for this