This commit is contained in:
nora 2023-01-09 15:19:34 +01:00
parent 02dcaf07e7
commit 9dcde0e451
2 changed files with 34 additions and 17 deletions

View file

@ -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<usize> 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) {

View file

@ -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