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 {
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 [
0b111000000,
0b000111000,
@ -42,12 +42,14 @@ impl GameClient {
0b100010001,
0b001010100
] {
if board & (w*m) == (w*m) {
if board & (w<<m) == (w<<m) {
return (true, Some(t))
}
}
}
// TODO: check for draw
if ((board | (board>>9)) & 0b111111111) == 0b111111111 {
return (true, None)
}
(false, None)
}
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;
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)
} else if board & 2_u32.pow(9 + c) != 0 {
} else if board & (1<<(9 + c)) != 0 {
Some(Team::One)
} else {
None
@ -146,13 +148,14 @@ impl GameClient {
Err(_) => return (HttpResCode::NotFound, "", &[]),
};
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
{
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();
BOARD.store(board, Ordering::Release);
TURN.store(turn, Ordering::Release);