7 个版本
0.2.1 | 2022 年 9 月 11 日 |
---|---|
0.2.0 | 2022 年 9 月 10 日 |
0.1.4 | 2022 年 9 月 10 日 |
#2041 in 数据结构
19KB
373 行
array2ds
但愿 Rust 能有更好的常量泛型
Array2ds 是 Rust 中的 Rust 开发的一个轻量级库,用于处理静态大小的 2D 数组/网格,运行示例:cargo run --example 'example_name'
- 仅使用 Safe Rust,不使用 "unsafe"
- 应该可以工作
- ✨魔法✨
特性
- 创建 2D 数组
- 可以遍历可变和不可变的行
- 创建后的网格大小不可变
- 可以使用 (row,column) 或 [row,column] 进行索引,并且可以轻松地重载到其他方式
- 可以遍历列
use array2ds::array2d::*;
use std::io::stdin;
struct Square {
data: char,
}
impl Default for Square {
fn default() -> Self {
Square { data: '#' }
}
}
fn main() {
run_game();
}
fn run_game() {
let mut board: Array2d<Square> = Array2d::filled_with_default(3, 3);
println!("enter location as: row col, for example: `0 1`, row: 0 column 1");
print_board(&board);
let mut winner = false;
let mut current_player = 'X';
while !winner {
let (row, column) = read_grid_location();
if board[[row, column]].data == '#' {
board[[row, column]].data = current_player;
match current_player {
'X' => current_player = 'O',
'O' => current_player = 'X',
_ => panic!("invalid data for square"),
}
println!();
print_board(&board);
winner = check_horizontal(&board) || check_vertical(&board) || check_diagnol(&board);
} else {
println!("invalid location, try another");
}
}
}
fn read_grid_location() -> (usize, usize) {
let mut buffer = String::new();
stdin().read_line(&mut buffer).unwrap();
let buffer = buffer.trim();
let splitted: Vec<&str> = buffer.split(' ').collect();
if splitted.len() < 2 {
panic!("enter data as `row col` ");
}
let r = splitted[0].parse::<usize>().unwrap();
let c = splitted[1].parse::<usize>().unwrap();
(r, c)
}
fn check_diagnol(board: &Array2d<Square>) -> bool{
let mid = &board[(1,1)];
if mid.data == '#'{
return false
}
if board[[0,0]].data == mid.data && mid.data == board[(2,2)].data{
return true
}
if board[[2,0]].data == mid.data && mid.data == board[(0,2)].data{
return true
}
false
}
fn check_vertical(board: &Array2d<Square>) -> bool {
for col in 0..3 {
let mut x_count = 0;
let mut o_count = 0;
for row in 0..3 {
match board[[row, col]].data {
'X' => x_count += 1,
'O' => o_count += 1,
_ => {}
}
}
if x_count == 3 || o_count == 3 {
return true;
}
}
false
}
fn check_horizontal(board: &Array2d<Square>) -> bool {
for row in board.iter_rows() {
let mut o_count = 0;
let mut x_count = 0;
for player in row {
match player.data {
'O' => o_count += 1,
'X' => x_count += 1,
_ => {}
}
}
if o_count == 3 || x_count == 3 {
return true;
}
}
false
}
fn print_board(board: &Array2d<Square>) {
for row in board.iter_rows() {
for square in row {
print!("{}", square.data);
}
println!();
}
}
许可协议
MIT