Crates.io | curses-game-wrapper |
lib.rs | curses-game-wrapper |
version | 0.0.4 |
source | src |
created_at | 2018-01-26 02:57:49.511369 |
updated_at | 2018-01-28 08:19:35.496229 |
description | wrapper for curses games to make game AI |
homepage | |
repository | |
max_upload_size | |
id | 48338 |
size | 59,861 |
This library is wrapper of curses games for AI making. What this crate provie is
extern crate curses_game_wrapper as cgw;
use cgw::{ActionResult, AsciiChar, GameSetting, Reactor};
use std::time::Duration;
fn main() {
struct EmptyAI {
loopnum: usize,
};
impl Reactor for EmptyAI {
fn action(&mut self, _screen: ActionResult, turn: usize) -> Option<Vec<u8>> {
let mut res = Vec::new();
match turn {
val if val == self.loopnum - 1 => res.push(AsciiChar::CarriageReturn.as_byte()),
val if val == self.loopnum - 2 => res.push(b'y'),
val if val == self.loopnum - 3 => res.push(b'Q'),
_ => {
let c = match (turn % 4) as u8 {
0u8 => b'h',
1u8 => b'j',
2u8 => b'k',
_ => b'l',
};
res.push(c);
}
};
Some(res)
}
}
let loopnum = 50;
let gs = GameSetting::new("rogue")
.env("ROGUEUSER", "EmptyAI")
.lines(24)
.columns(80)
.debug_file("debug.txt")
.max_loop(loopnum + 1)
.draw_on(Duration::from_millis(100));
let game = gs.build();
let mut ai = EmptyAI { loopnum: loopnum };
game.play(&mut ai);
}
You can run above code by
cargo run --example rogue
and you can stop viewer by Ctrl-C
(signal handling is incomplete, but works well unless the AI get caught in an infinite loop).
See my rogue-ai repo and asciinema.
https://ttssh2.osdn.jp/manual/ja/about/ctrlseq.html
https://www.xfree86.org/current/ctlseqs.html
https://www.vt100.net/docs/vt100-ug/contents.html
https://github.com/jwilm/alacritty