cli start game

This commit is contained in:
Henri Bourcereau 2024-02-17 12:55:36 +01:00
parent 7cf8cd1c46
commit 782a6dce87
3 changed files with 129 additions and 22 deletions

View file

@ -1,10 +1,11 @@
use store::GameState;
// Application. // Application.
#[derive(Debug, Default)] #[derive(Debug, Default)]
pub struct App { pub struct App {
// should the application exit? // should the application exit?
pub should_quit: bool, pub should_quit: bool,
// counter pub game: GameState,
pub counter: u8,
} }
impl App { impl App {
@ -13,8 +14,14 @@ impl App {
Self::default() Self::default()
} }
// Constructs a new instance of [`App`].
pub fn start(&mut self) {
self.game = GameState::new();
}
pub fn input(&mut self, input: &str) { pub fn input(&mut self, input: &str) {
println!("'{}'", input); println!("'{}'", input);
println!("'{}'", self.display());
if input == "quit" { if input == "quit" {
self.quit(); self.quit();
} }
@ -25,33 +32,55 @@ impl App {
self.should_quit = true; self.should_quit = true;
} }
pub fn increment_counter(&mut self) { pub fn display(&mut self) -> String {
if let Some(res) = self.counter.checked_add(1) { let mut board = "
self.counter = res; 24 23 22 21 20 19 18 17 16 15 14 13
} -------------------------------------------------------------------"
} .to_owned();
board = board
+ "-------------------------------------------------------------------
1 2 3 4 5 6 7 8 9 10 11 12 ";
pub fn decrement_counter(&mut self) { // ligne 1 à 8 : positions 24 à 13
if let Some(res) = self.counter.checked_sub(1) { // ligne 9 nombre exact
self.counter = res; // ligne 10 ---
} // lignes 11 à 18 : positions 1 à 12
board
// self.game.to_string()
} }
} }
#[cfg(test)] #[cfg(test)]
mod tests { mod tests {
use super::*; use super::*;
#[test]
fn test_app_increment_counter() {
let mut app = App::default();
app.increment_counter();
assert_eq!(app.counter, 1);
}
#[test] #[test]
fn test_app_decrement_counter() { fn test_display() {
let expected = "
24 23 22 21 20 19 18 17 16 15 14 13
-------------------------------------------------------------------
| | | X |
| | | X |
| | | X |
| | | X |
| | | X |
| | | X |
| | | X |
| | | X |
| | | 15 |
|------------------------------ | | ------------------------------|
| | | 15 |
| | | O |
| | | O |
| | | O |
| | | O |
| | | O |
| | | O |
| | | O |
| | | O |
-------------------------------------------------------------------
1 2 3 4 5 6 7 8 9 10 11 12 ";
let mut app = App::default(); let mut app = App::default();
app.decrement_counter(); assert_eq!(app.display(), expected);
assert_eq!(app.counter, 0);
} }
} }

View file

@ -11,7 +11,7 @@ fn main() -> Result<()> {
// Start the main loop. // Start the main loop.
while !app.should_quit { while !app.should_quit {
println!("what?>"); println!("whot?>");
let mut input = String::new(); let mut input = String::new();
let _bytecount = io::stdin().read_line(&mut input)?; let _bytecount = io::stdin().read_line(&mut input)?;
app.input(input.trim()); app.input(input.trim());

View file

@ -31,9 +31,87 @@ cf. https://blessed.rs/crates
* go : https://bgammon.org/blog/20240101-hello-world/ * go : https://bgammon.org/blog/20240101-hello-world/
- protocole de communication : https://code.rocket9labs.com/tslocum/bgammon/src/branch/main/PROTOCOL.md - protocole de communication : https://code.rocket9labs.com/tslocum/bgammon/src/branch/main/PROTOCOL.md
* ocaml : https://github.com/jacobhilton/backgammon?tab=readme-ov-file
cli example : https://www.jacobh.co.uk/backgammon/
* lib rust backgammon * lib rust backgammon
- https://github.com/carlostrub/backgammon - https://github.com/carlostrub/backgammon
- https://github.com/marktani/backgammon - https://github.com/marktani/backgammon
* network webtarot * network webtarot
* front ? * front ?
## cli examples
### GnuBackgammon
(No game) new game
gnubg rolls 3, anthon rolls 1.
GNU Backgammon Positions ID: 4HPwATDgc/ABMA
Match ID : MIEFAAAAAAAA
+12-11-10--9--8--7-------6--5--4--3--2--1-+ O: gnubg
| X O | | O X | 0 points
| X O | | O X | Rolled 31
| X O | | O |
| X | | O |
| X | | O |
^| |BAR| | (Cube: 1)
| O | | X |
| O | | X |
| O X | | X |
| O X | | X O |
| O X | | X O | 0 points
+13-14-15-16-17-18------19-20-21-22-23-24-+ X: anthon
gnubg moves 8/5 6/5.
### jacobh
Move 11: player O rolls a 6-2.
Player O estimates that they have a 90.6111% chance of winning.
Os borne off: none
24 23 22 21 20 19 18 17 16 15 14 13
-------------------------------------------------------------------
| v v v v v v | | v v v v v v |
| | | |
| X O O O | | O O O |
| X O O O | | O O |
| O | | |
| | X | |
| | | |
| | | |
| | | |
| | | |
|------------------------------| |------------------------------|
| | | |
| | | |
| | | |
| | | |
| X | | |
| X X | | X |
| X X X | | X O |
| X X X | | X O O |
| | | |
| ^ ^ ^ ^ ^ ^ | | ^ ^ ^ ^ ^ ^ |
-------------------------------------------------------------------
1 2 3 4 5 6 7 8 9 10 11 12
Xs borne off: none
Move 12: player X rolls a 6-3.
Your move (? for help): bar/22
Illegal move: it is possible to move more.
Your move (? for help): ?
Enter the start and end positions, separated by a forward slash (or any non-numeric character), of each counter you want to move.
Each position should be number from 1 to 24, "bar" or "off".
Unlike in standard notation, you should enter each counter movement individually. For example:
24/18 18/13
bar/3 13/10 13/10 8/5
2/off 1/off
You can also enter these commands:
p - show the previous move
n - show the next move
<enter> - toggle between showing the current and last moves
help - show this help text
quit - abandon game