Early legality check to not clone asa often
This commit is contained in:
parent
f82b210e28
commit
94982994f5
|
@ -26,7 +26,7 @@ byte-strings = "0.2.2"
|
|||
#alloc_counter = "0.0.4"
|
||||
|
||||
[profile.release]
|
||||
debug = 1
|
||||
debug = 0
|
||||
lto = "fat"
|
||||
codegen-units = 1
|
||||
panic = "abort"
|
||||
|
|
73
src/azul.rs
73
src/azul.rs
|
@ -665,6 +665,79 @@ impl State {
|
|||
self.player = (self.player + 1) % self.boards.len() as u8;
|
||||
Ok(())
|
||||
}
|
||||
pub fn is_legal(&self, game_move: GameMove) -> Result<(), &'static str> {
|
||||
let board = &self.boards[self.player as usize];
|
||||
match game_move {
|
||||
GameMove(_, Tile::Start, _) => return Err("You can't take the start tile specifically"),
|
||||
GameMove(0, _, 0) => {
|
||||
if !&self.market.contains(&game_move.1) {
|
||||
return Err("Market does not contain selected tile")
|
||||
}
|
||||
else {
|
||||
Ok(())
|
||||
}
|
||||
},
|
||||
GameMove(0, _, 1..=5) => {
|
||||
if self.market.len() == 0 {
|
||||
return Err("Market is empty");
|
||||
}
|
||||
else if self.market.contains(&game_move.1) {
|
||||
let target = &board.patterns[game_move.2 - 1];
|
||||
if target.first().is_some() && target[0] != game_move.1 {
|
||||
return Err("That pattern line already contains a different color")
|
||||
}
|
||||
let empty = game_move.2 - target.len();
|
||||
|
||||
if empty == 0 {
|
||||
return Err("That pattern is full")
|
||||
}
|
||||
|
||||
Ok(())
|
||||
}
|
||||
else {
|
||||
return Err("Market does not contain selected tile")
|
||||
}
|
||||
},
|
||||
GameMove(1..=9, _, _) => {
|
||||
let board = &self.boards[self.player as usize];
|
||||
if game_move.0 > self.factories.len() {
|
||||
return Err("That factory is out of bounds");
|
||||
}
|
||||
|
||||
let factory = self.factories[game_move.0 - 1].deref();
|
||||
if factory.contains(&game_move.1) {
|
||||
let mut hand = factory.clone();
|
||||
hand.retain(|x| *x == game_move.1);
|
||||
|
||||
match game_move.2 {
|
||||
0 => Ok(()),
|
||||
1..=9 => {
|
||||
let target = &board.patterns[game_move.2 - 1];
|
||||
if target.first().is_some() && target[0] != game_move.1 {
|
||||
return Err("That pattern line already contains a different color")
|
||||
}
|
||||
let empty = game_move.2 - target.len();
|
||||
if hand.len() <= empty {
|
||||
return Ok(())
|
||||
}
|
||||
else if empty != 0 {
|
||||
return Ok(())
|
||||
}
|
||||
else {
|
||||
return Err("That pattern line is full")
|
||||
}
|
||||
},
|
||||
_ => return Err("Not a valid destination")
|
||||
}
|
||||
}
|
||||
else {
|
||||
return Err("That tile is not in that factory")
|
||||
}
|
||||
},
|
||||
GameMove(_,_,_) => return Err("Not a valid move")
|
||||
}
|
||||
|
||||
}
|
||||
/*pub fn hash(&self) -> [u8; 256]{
|
||||
[
|
||||
[self.player],
|
||||
|
|
|
@ -485,9 +485,10 @@ impl Game2 {
|
|||
use std::time::{Instant, Duration};
|
||||
|
||||
pub fn size_of_bitfields() -> Result<(), &'static str> {
|
||||
//println!("size of bitfield game: {}", std::mem::size_of::<Game2>());
|
||||
println!("size of bitfield game: {}", std::mem::size_of::<Game2>());
|
||||
println!("size of state: {}", std::mem::size_of::<super::azul::State>());
|
||||
|
||||
let game2 = Game2::create();
|
||||
/* let game2 = Game2::create();
|
||||
//println!("debug: {:#?}", game2);
|
||||
//println!("{:?}", game2.into_bytes());
|
||||
|
||||
|
@ -510,7 +511,7 @@ pub fn size_of_bitfields() -> Result<(), &'static str> {
|
|||
let game_1_time = now.elapsed().as_nanos();
|
||||
|
||||
println!("{} | {}", game_1_time, game_2_time);
|
||||
|
||||
*/
|
||||
Ok(())
|
||||
|
||||
|
||||
|
|
|
@ -100,11 +100,12 @@ fn count_options(_game: Game, depth: u8, treshold: u8) -> u128 {
|
|||
|
||||
let mut multiplier = 1;
|
||||
|
||||
// Upper bound calculation by skipping first depth and assuming most complicated possible game as multiplier
|
||||
let game = match depth {
|
||||
0 => {
|
||||
let mut new_game = _game.clone();
|
||||
for i in GameMoveIter::new(2).next() {
|
||||
match new_game.do_move( i) {
|
||||
match new_game.do_move(i) {
|
||||
Ok(_) => break,
|
||||
Err(_) => continue
|
||||
}
|
||||
|
@ -121,6 +122,9 @@ fn count_options(_game: Game, depth: u8, treshold: u8) -> u128 {
|
|||
|
||||
for game_move in i {
|
||||
//println!("{:?}", game_move);
|
||||
if game.is_legal(game_move).is_err() {
|
||||
continue;
|
||||
};
|
||||
let mut new_game = game.clone();
|
||||
let r = new_game.do_move(game_move);
|
||||
match r {
|
||||
|
|
Loading…
Reference in New Issue