let him COOK

This commit is contained in:
LinlyBoi
2023-05-10 12:25:31 +03:00
parent ca1cf55b15
commit a36c89ad51
4 changed files with 113 additions and 122 deletions

View File

@@ -103,76 +103,76 @@ fn minimise_pruning(
} }
} }
} }
#[test] //#[test]
fn minimax_test() { //fn minimax_test() {
let time = Instant::now(); // let time = Instant::now();
let mut board = Board::default(); // let mut board = Board::default();
let mut disk = Disk::P2; // let mut disk = Disk::P2;
let _depth = 5; // let _depth = 5;
let _turn1 = board.play(disk, minimax_decision(&board, disk, &5).last_move as usize); // let _turn1 = board.play(disk, minimax_decision(&board, disk, &5).last_move as usize);
dbg!(&board.columns); // dbg!(&board.columns);
disk = flip_disk(disk); // disk = flip_disk(disk);
let _turn2 = board.play(disk, minimax_decision(&board, disk, &5).last_move as usize); // let _turn2 = board.play(disk, minimax_decision(&board, disk, &5).last_move as usize);
disk = flip_disk(disk); // disk = flip_disk(disk);
let _turn3 = board.play(disk, minimax_decision(&board, disk, &5).last_move as usize); // let _turn3 = board.play(disk, minimax_decision(&board, disk, &5).last_move as usize);
disk = flip_disk(disk); // disk = flip_disk(disk);
let _turn4 = board.play(disk, minimax_decision(&board, disk, &5).last_move as usize); // let _turn4 = board.play(disk, minimax_decision(&board, disk, &5).last_move as usize);
disk = flip_disk(disk); // disk = flip_disk(disk);
let _turn5 = board.play(disk, minimax_decision(&board, disk, &5).last_move as usize); // let _turn5 = board.play(disk, minimax_decision(&board, disk, &5).last_move as usize);
for column in board.columns.as_rows() { // for column in board.columns.as_rows() {
column // column
.iter() // .iter()
.map(|x| { // .map(|x| {
print!("{:#?},", x); // print!("{:#?},", x);
x // x
}) // })
.count(); // .count();
println!(); // println!();
} // }
dbg!(time.elapsed().as_millis()); // dbg!(time.elapsed().as_millis());
assert!(false); // assert!(false);
} //}
#[test] //#[test]
fn minimax_pruning_test() { //fn minimax_pruning_test() {
let time = Instant::now(); // let time = Instant::now();
let mut board = Board::default(); // let mut board = Board::default();
let mut disk = Disk::P2; // let mut disk = Disk::P2;
let _depth = 5; // let _depth = 5;
let _turn1 = board.play( // let _turn1 = board.play(
disk, // disk,
minimax_decision_pruning(&board, disk, &5).last_move as usize, // minimax_decision_pruning(&board, disk, &5).last_move as usize,
); // );
dbg!(&board.columns); // dbg!(&board.columns);
disk = flip_disk(disk); // disk = flip_disk(disk);
let _turn2 = board.play( // let _turn2 = board.play(
disk, // disk,
minimax_decision_pruning(&board, disk, &5).last_move as usize, // minimax_decision_pruning(&board, disk, &5).last_move as usize,
); // );
disk = flip_disk(disk); // disk = flip_disk(disk);
let _turn3 = board.play( // let _turn3 = board.play(
disk, // disk,
minimax_decision_pruning(&board, disk, &5).last_move as usize, // minimax_decision_pruning(&board, disk, &5).last_move as usize,
); // );
disk = flip_disk(disk); // disk = flip_disk(disk);
let _turn4 = board.play( // let _turn4 = board.play(
disk, // disk,
minimax_decision_pruning(&board, disk, &5).last_move as usize, // minimax_decision_pruning(&board, disk, &5).last_move as usize,
); // );
disk = flip_disk(disk); // disk = flip_disk(disk);
let _turn5 = board.play( // let _turn5 = board.play(
disk, // disk,
minimax_decision_pruning(&board, disk, &5).last_move as usize, // minimax_decision_pruning(&board, disk, &5).last_move as usize,
); // );
for column in board.columns.as_rows() { // for column in board.columns.as_rows() {
column // column
.iter() // .iter()
.map(|x| { // .map(|x| {
print!("{:#?},", x); // print!("{:#?},", x);
x // x
}) // })
.count(); // .count();
println!(); // println!();
} // }
dbg!(time.elapsed().as_millis()); // dbg!(time.elapsed().as_millis());
assert!(false); // assert!(false);
} //}

View File

@@ -222,25 +222,6 @@ fn heur_scan(
//Tests because I am making everything public //Tests because I am making everything public
//TODO separate module here //TODO separate module here
#[test] #[test]
fn streak_test_1() {
let mut board = Board::default();
board.play(Disk::P2, 3);
board.play(Disk::P2, 3);
board.play(Disk::P2, 3);
board.play(Disk::P2, 2);
board.play(Disk::P2, 1);
let sequences = get_streaks(&board.columns, &Disk::P2);
assert_eq!(POT_STREAKS * 3, potential_streaks(&sequences, &Disk::P2));
board.play(Disk::P2, 0);
let _sequences = get_streaks(&board.columns, &Disk::P2);
board.play(Disk::P2, 3);
board.play(Disk::P2, 3);
board.play(Disk::P2, 3);
board.play(Disk::P2, 3);
let sequences = get_streaks(&board.columns, &Disk::P2);
assert_eq!(POT_STREAKS * 2, potential_streaks(&sequences, &Disk::P2));
}
#[test]
fn win_test_flipping() { fn win_test_flipping() {
let mut board = Board::default(); let mut board = Board::default();
board.play(Disk::P2, 3); board.play(Disk::P2, 3);
@@ -256,12 +237,3 @@ fn win_test_flipping() {
dbg!(&sequences); dbg!(&sequences);
assert_eq!(POT_WIN, potential_wins(&sequences, &Disk::P2)); assert_eq!(POT_WIN, potential_wins(&sequences, &Disk::P2));
} }
#[test]
fn win_test_flipping_hard() {
let mut board = Board::default();
board.play(Disk::P2, 1);
board.play(Disk::P2, 2);
board.play(Disk::P2, 4);
let sequences = get_wins(&board.columns, &Disk::P2);
assert_eq!(POT_WIN, potential_wins(&sequences, &Disk::P2));
}

View File

@@ -88,32 +88,37 @@ pub fn scan(
None => break, None => break,
} }
} }
in_a_row.len() as i32 in_a_row
.iter()
.filter(|d| variant_eq(*d, &player_disk))
.count() as i32
} }
// board[(2,3)]; // board[(2,3)];
pub fn get_legal_moves( pub fn get_legal_moves(
(row, col): &(usize, usize), (row, col): &(usize, usize),
(nrow, ncol): (usize, usize), (nrow, ncol): (usize, usize),
) -> Vec<Direction> { ) -> Vec<Direction> {
let _max_col = ncol - 1; let max_col = ncol - 1;
let _max_row = nrow - 1; let max_row = nrow - 1;
let mut moves: Vec<Direction> = vec![]; let mut moves: Vec<Direction> = vec![];
match *row { if *row > 0 && *row < max_row {
0 => moves.push(Direction::Up), //dbg!(row, max_row);
_max_rows => moves.push(Direction::Down), moves.push(Direction::Up);
_ => { moves.push(Direction::Down);
moves.push(Direction::Up); } else if *row == 0 {
moves.push(Direction::Down); moves.push(Direction::Up);
} } else if *row == max_row {
}; moves.push(Direction::Down);
match *col { }
0 => moves.push(Direction::Right), if (*col > 0 && *col < max_col) {
_max_col => moves.push(Direction::Left), moves.push(Direction::Left);
_ => { moves.push(Direction::Right);
moves.push(Direction::Left); } else if *col == 0 {
moves.push(Direction::Right) moves.push(Direction::Right);
} } else if *col == max_col {
}; moves.push(Direction::Left);
}
if moves.contains(&Direction::Up) && moves.contains(&Direction::Left) { if moves.contains(&Direction::Up) && moves.contains(&Direction::Left) {
moves.push(Direction::UpLeft); moves.push(Direction::UpLeft);
} }
@@ -128,6 +133,20 @@ pub fn get_legal_moves(
} }
moves moves
} }
#[test]
fn dir_test() {
let moves1 = get_legal_moves(&(0, 0), (6, 7));
dbg!(&moves1);
assert_eq!(3, moves1.len());
assert!(moves1.contains(&Direction::Up));
let moves2 = get_legal_moves(&(0, 3), (6, 7));
dbg!(&moves2);
assert_eq!(5, moves2.len());
let moves3 = get_legal_moves(&(1, 3), (6, 7));
dbg!(&moves3);
assert_eq!(8, moves3.len());
}
#[derive(Clone, Debug, PartialEq, Eq)] #[derive(Clone, Debug, PartialEq, Eq)]
pub enum Direction { pub enum Direction {

View File

@@ -16,7 +16,7 @@ const BOARDSTART: (i32, i32) = (0, 0);
fn main() { fn main() {
let (mut rl, thread) = raylib::init() let (mut rl, thread) = raylib::init()
.size(WIDTH, HEIGHT) .size(WIDTH, HEIGHT)
.title("Hello, World") .title("Connect 4 Game (bad)")
.build(); .build();
//images //images
@@ -101,7 +101,7 @@ fn main() {
Disk::P2 => Color::YELLOW, Disk::P2 => Color::YELLOW,
Disk::EMPTY => Color::WHITE, Disk::EMPTY => Color::WHITE,
}; };
d.draw_texture(&circle_texture, x, y, color); d.draw_texture(&circle_texture, x - 1, y + 2, color);
} }
d.clear_background(Color::WHITE); d.clear_background(Color::WHITE);
} }