fix: check the whole board to check a win

This commit is contained in:
landrigun 2022-11-15 14:49:37 +00:00
parent 6131589084
commit fbc1aafce6

View File

@ -99,15 +99,15 @@ impl Board {
} }
} }
fn check_first_line(&self, item: Item) -> bool { fn check_first_row(&self, item: Item) -> bool {
self.items[0] == item && self.items[1] == item && self.items[2] == item self.items[0] == item && self.items[1] == item && self.items[2] == item
} }
fn check_second_line(&self, item: Item) -> bool { fn check_second_row(&self, item: Item) -> bool {
self.items[3] == item && self.items[4] == item && self.items[5] == item self.items[3] == item && self.items[4] == item && self.items[5] == item
} }
fn check_last_line(&self, item: Item) -> bool { fn check_last_row(&self, item: Item) -> bool {
self.items[6] == item && self.items[7] == item && self.items[8] == item self.items[6] == item && self.items[7] == item && self.items[8] == item
} }
@ -131,42 +131,16 @@ impl Board {
self.items[2] == item && self.items[4] == item && self.items[6] == item self.items[2] == item && self.items[4] == item && self.items[6] == item
} }
/// instead of scanning all the board, checks input "win" combinaison fn check_win(&self, player: Player) -> bool {
fn check_win(&self, player: Player, idx: usize) -> bool {
let item = player.item; let item = player.item;
match idx { return self.check_first_col(item)
0 => { || self.check_second_col(item)
self.check_first_col(item)
|| self.check_first_line(item)
|| self.check_first_diag(item)
}
1 => self.check_first_line(item) || self.check_second_col(item),
2 => {
self.check_first_line(item)
|| self.check_last_col(item) || self.check_last_col(item)
|| self.check_last_diag(item) || self.check_first_row(item)
} || self.check_second_row(item)
3 => self.check_first_col(item) || self.check_second_line(item), || self.check_last_row(item)
4 => {
self.check_second_col(item)
|| self.check_second_line(item)
|| self.check_last_diag(item)
|| self.check_first_diag(item) || self.check_first_diag(item)
} || self.check_last_diag(item);
5 => self.check_last_col(item) || self.check_second_line(item),
6 => {
self.check_first_col(item)
|| self.check_last_line(item)
|| self.check_last_diag(item)
}
7 => self.check_last_line(item) || self.check_second_col(item),
8 => {
self.check_last_line(item)
|| self.check_last_col(item)
|| self.check_first_diag(item)
}
_ => false,
}
} }
} }
@ -439,12 +413,10 @@ impl TicTacToe {
} }
let item_icon: String = player.item.into(); let item_icon: String = player.item.into();
let mut item_position;
loop { loop {
match self.select_player_item() { match self.select_player_item() {
Ok(pos) => { Ok(pos) => {
item_position = pos;
match self.board.set_item(player.item, pos) { match self.board.set_item(player.item, pos) {
Ok(_) => break, Ok(_) => break,
Err(e) => { Err(e) => {
@ -459,7 +431,7 @@ impl TicTacToe {
} }
// check after the 5th round if there's a winner // check after the 5th round if there's a winner
if self.turn > 4 && self.board.check_win(player, item_position - 1) { if self.turn > 4 && self.board.check_win(player) {
info(format!("{} wins!", item_icon)); info(format!("{} wins!", item_icon));
self.board.show(); self.board.show();
break; break;