draw + rewrite with bit switch because it's way cooler

This commit is contained in:
Arkitu 2025-04-12 20:00:30 +02:00
parent 2aabfa52d1
commit ee6dd90ddd

View File

@ -31,7 +31,7 @@ impl GameClient {
if let Some((_, t)) = self.end { if let Some((_, t)) = self.end {
return (true, t); return (true, t);
} }
for (t, m) in [(Team::Zero, 1), (Team::One, 2_u32.pow(9))] { for (t, m) in [(Team::Zero, 0), (Team::One, 9)] {
for w in [ for w in [
0b111000000, 0b111000000,
0b000111000, 0b000111000,
@ -42,12 +42,14 @@ impl GameClient {
0b100010001, 0b100010001,
0b001010100 0b001010100
] { ] {
if board & (w*m) == (w*m) { if board & (w<<m) == (w<<m) {
return (true, Some(t)) return (true, Some(t))
} }
} }
} }
// TODO: check for draw if ((board | (board>>9)) & 0b111111111) == 0b111111111 {
return (true, None)
}
(false, None) (false, None)
} }
pub fn update_end_state(&mut self, board: &mut u32) { pub fn update_end_state(&mut self, board: &mut u32) {
@ -98,9 +100,9 @@ impl GameClient {
} }
unwrap(self.res_buf.extend_from_slice(b"<div id=\"grid\">")).await; unwrap(self.res_buf.extend_from_slice(b"<div id=\"grid\">")).await;
for c in 0..=8 { for c in 0..=8 {
let picked_by = if board & 2_u32.pow(c) != 0 { let picked_by = if board & (1<<c) != 0 {
Some(Team::Zero) Some(Team::Zero)
} else if board & 2_u32.pow(9 + c) != 0 { } else if board & (1<<(9 + c)) != 0 {
Some(Team::One) Some(Team::One)
} else { } else {
None None
@ -146,13 +148,14 @@ impl GameClient {
Err(_) => return (HttpResCode::NotFound, "", &[]), Err(_) => return (HttpResCode::NotFound, "", &[]),
}; };
if board if board
& ((2_u32.pow(clicked_c as u32)) & (
+ (2_u32.pow(9 + clicked_c as u32))) (1<<(clicked_c as u32)) + (1<<(9 + clicked_c as u32))
)
!= 0 != 0
{ {
return (HttpResCode::Forbidden, "", &[]); return (HttpResCode::Forbidden, "", &[]);
} }
board = board | 2_u32.pow((self.team as u32 * 9) + clicked_c as u32); board = board | (1<<((self.team as u32 * 9) + clicked_c as u32));
turn = (!self.team).into(); turn = (!self.team).into();
BOARD.store(board, Ordering::Release); BOARD.store(board, Ordering::Release);
TURN.store(turn, Ordering::Release); TURN.store(turn, Ordering::Release);