From 124e5c0f7f5ba42374557456075135f83335ebc7 Mon Sep 17 00:00:00 2001 From: Gleb Koval Date: Sun, 7 Aug 2022 19:20:56 +0000 Subject: [PATCH] initial o-x-rust implementation complete --- wasm/o-x-rust/Cargo.lock | 2 +- wasm/o-x-rust/Cargo.toml | 2 +- wasm/o-x-rust/src/lib.rs | 56 ++++++++++++++++++++++++++++++++++++++-- 3 files changed, 56 insertions(+), 4 deletions(-) diff --git a/wasm/o-x-rust/Cargo.lock b/wasm/o-x-rust/Cargo.lock index ff1f126..8eecd9c 100644 --- a/wasm/o-x-rust/Cargo.lock +++ b/wasm/o-x-rust/Cargo.lock @@ -25,7 +25,7 @@ dependencies = [ [[package]] name = "o-x-rust" -version = "0.0.2" +version = "0.0.3" dependencies = [ "wasm-bindgen", ] diff --git a/wasm/o-x-rust/Cargo.toml b/wasm/o-x-rust/Cargo.toml index daca615..6ce2416 100644 --- a/wasm/o-x-rust/Cargo.toml +++ b/wasm/o-x-rust/Cargo.toml @@ -4,7 +4,7 @@ description = "Naughts and crosses WASM algorithms" repository = "https://git.koval.net/cyclane/game-algorithms/src/branch/main/wasm/o-x-rust" license = "GNU GPLv3" readme = "README.md" -version = "0.0.2" +version = "0.0.3" edition = "2021" [lib] diff --git a/wasm/o-x-rust/src/lib.rs b/wasm/o-x-rust/src/lib.rs index 74b3078..e6a9a84 100644 --- a/wasm/o-x-rust/src/lib.rs +++ b/wasm/o-x-rust/src/lib.rs @@ -1,6 +1,58 @@ use wasm_bindgen::prelude::wasm_bindgen; #[wasm_bindgen] -pub fn add(a: usize, b: usize) -> usize { - a + b +pub fn find_winner(board: &[u8]) -> u8 { + for i in 0..3 { + let h = i*3; + if board[h] == board[h + 1] && board[h + 1] == board[h + 2] { + return board[h]; + } + if board[i] == board[i + 3] && board[i + 3] == board[i + 6] { + return board[i]; + } + } + if board[0] == board[4] && board[4] == board[8] { + return board[0]; + } + if board[2] == board[4] && board[4] == board[6] { + return board[2]; + } + 0 +} + +#[wasm_bindgen] +pub fn count_empty(board: &[u8]) -> usize { + board.iter().filter(|&n| *n == 0).count() +} + +#[wasm_bindgen] +pub fn get_turn(me: u8, other: u8, first: bool, empty: usize) -> u8 { + if empty % 2 == if first { 1 } else { 0 } { + me + } else { + other + } +} + +#[wasm_bindgen] +pub fn get_score(me: u8, other: u8, first: bool, board: &[u8]) -> i32 { + let winner = find_winner(board); + if winner != 0 { + return if winner == me { 1 } else { -1 }; + } + let empty = count_empty(board); + if empty == 0 { + return 0; + } + let mut score = 0; + for i in 0..9 { + if board[i] != 0 { + continue; + } + let copy = &mut [0u8; 9]; + copy.copy_from_slice(board); + copy[i] = get_turn(me, other, first, empty); + score += get_score(me, other, first, copy); + } + score }