mirror of
https://github.com/Noratrieb/minmax.git
synced 2026-01-16 16:25:07 +01:00
works
This commit is contained in:
parent
02dcaf07e7
commit
9dcde0e451
2 changed files with 34 additions and 17 deletions
|
|
@ -115,6 +115,20 @@ impl Connect4 {
|
||||||
|
|
||||||
Score::new(score_player(player) - score_player(player.opponent()))
|
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 {
|
impl Index<usize> for Connect4 {
|
||||||
|
|
@ -150,18 +164,8 @@ impl Game for Connect4 {
|
||||||
}
|
}
|
||||||
|
|
||||||
fn make_move(&mut self, position: Self::Move, player: Player) {
|
fn make_move(&mut self, position: Self::Move, player: Player) {
|
||||||
for i in 0..3 {
|
let pos = self.drop_player(position);
|
||||||
let prev = position + (i * WIDTH);
|
self[pos] = Some(player);
|
||||||
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);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
fn undo_move(&mut self, position: Self::Move) {
|
fn undo_move(&mut self, position: Self::Move) {
|
||||||
|
|
|
||||||
|
|
@ -2,7 +2,7 @@ use jni::objects::{JClass, JObject, ReleaseMode};
|
||||||
use jni::sys::{jbyte, jint};
|
use jni::sys::{jbyte, jint};
|
||||||
use jni::JNIEnv;
|
use jni::JNIEnv;
|
||||||
use minmax::{connect4::board::Connect4, GamePlayer};
|
use minmax::{connect4::board::Connect4, GamePlayer};
|
||||||
use minmax::{PerfectPlayer, Player};
|
use minmax::{Game, PerfectPlayer, Player};
|
||||||
|
|
||||||
/// We need to map the board.
|
/// We need to map the board.
|
||||||
/// Rust:
|
/// Rust:
|
||||||
|
|
@ -22,7 +22,7 @@ use minmax::{PerfectPlayer, Player};
|
||||||
fn map_idx(i: usize) -> usize {
|
fn map_idx(i: usize) -> usize {
|
||||||
match () {
|
match () {
|
||||||
() if i < 7 => i + 21,
|
() if i < 7 => i + 21,
|
||||||
() if i < 15 => i + 7,
|
() if i < 14 => i + 7,
|
||||||
() if i < 21 => i - 7,
|
() if i < 21 => i - 7,
|
||||||
() => i - 21,
|
() => i - 21,
|
||||||
}
|
}
|
||||||
|
|
@ -34,7 +34,10 @@ fn crate_board(java_board: &[i8]) -> Connect4 {
|
||||||
for i in 0..28 {
|
for i in 0..28 {
|
||||||
let java_int = java_board[i];
|
let java_int = java_board[i];
|
||||||
let rust_value = match java_int {
|
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),
|
1 => Some(Player::O),
|
||||||
2 => None,
|
2 => None,
|
||||||
_ => unreachable!(),
|
_ => 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) };
|
let slice = unsafe { std::slice::from_raw_parts(byte_array.as_ptr() as *const _, 28) };
|
||||||
|
|
||||||
|
dbg!(slice);
|
||||||
|
|
||||||
let mut board = crate_board(slice);
|
let mut board = crate_board(slice);
|
||||||
|
|
||||||
|
println!("{board}");
|
||||||
|
|
||||||
let mut player = PerfectPlayer::new(false);
|
let mut player = PerfectPlayer::new(false);
|
||||||
|
|
||||||
let current_player_rust = match current_player {
|
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);
|
player.next_move(&mut board, current_player_rust);
|
||||||
|
|
||||||
let result_move = player.best_move();
|
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
|
// This keeps Rust from "mangling" the name and making it unique for this
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue