#bitboard #tic-tac-toe #xo

bitboard_xo

使用最小内存使用量实现的XO游戏

5个版本 (2个稳定版)

1.1.0 2020年1月7日
1.0.0 2019年12月8日
0.2.0 2019年12月7日
0.1.1 2019年12月6日
0.1.0 2019年11月26日

#436 in 游戏

MIT许可证

32KB
422

Build Status

bitboard_xo

一个专注于最小内存使用(不牺牲性能)的XO(又称井字棋/圈叉棋)库。

通过使用位图(棋类游戏中常见的数据结构),适应XO游戏来实现最小内存使用。

当前XO类型的sizeof为32位,小于大多数机器的指针。

示例

use bitboard_xo::*;

use std::error::Error;
use std::io::{stdin, stdout, Write};

/// try read a u8 from console
fn read_u8() -> Result<u32, Box<dyn Error>> {
    let mut user_input = String::new();
    stdin().read_line(&mut user_input)?;
    Ok(user_input.trim().parse()?)
}

/// prompt user for input to get xo position
fn get_xo_pos() -> XOPos {
    fn try_get_xo_pos() -> Result<XOPos, Box<dyn Error>> {
        // prompt user and read row from console
        print!("Input row : ");
        stdout().flush()?;
        let row = read_u8()?;

        // prompt user and read col from console
        print!("Input col : ");
        stdout().flush()?;
        let col = read_u8()?;

        // parse row, col into XOPos
        Ok(XOPos::row_col(row, col)?)
    };

    loop {
        match try_get_xo_pos() {
            Ok(xo_pos) => break xo_pos,
            Err(err) => println!("{}", err),
        }
    }
}

fn main() -> Result<(), XOError> {
    // create new XO game
    let mut game = XO::new();

    loop {
        println!("{}", game);
        // get position from user's input
        let input_xo_pos = get_xo_pos();

        // play at that position and match the returned game state
        match game.play(input_xo_pos) {
            // game end
            Ok(Some(game_result)) => {
                println!("{}", game);
                println!("game result => {:?}", game_result);
                break;
            }
            // game continue
            Ok(None) => println!("game continue..."),
            // some game error occurred
            Err(xo_err) => println!("Error: {}", xo_err),
        }
    }

    Ok(())
}

许可证:MIT

依赖项

~48KB