parent
109220a3f9
commit
82f2713dca
@ -1,31 +1,157 @@ |
||||
use crate::game::{Move, Color, Roll}; |
||||
use rustyline::error::ReadlineError; |
||||
use failure::{Fallible, format_err}; |
||||
|
||||
mod game; |
||||
|
||||
fn main() { |
||||
let g = game::State::start(Some(Color::Black)); |
||||
let mut game = game::State::start(None); |
||||
|
||||
let g = g.spoof_roll(Roll::from_dice((3, 5))); |
||||
let mut rl = rustyline::Editor::<()>::new(); |
||||
|
||||
println!("{}", g); |
||||
let mut retry = false; |
||||
let mut filled = String::new(); |
||||
'input: loop { |
||||
if !retry { |
||||
filled.clear(); |
||||
} |
||||
|
||||
let g = g.apply_move(Color::Black, Move::InBoard { from: 23, to: 20 }).unwrap(); |
||||
let g = g.apply_move(Color::Black, Move::InBoard { from: 12, to: 7 }).unwrap(); |
||||
println!("BOARD:\n{}", game); |
||||
|
||||
// White turn
|
||||
let g = g.spoof_roll(Roll::from_dice((4, 6))); |
||||
println!("{}", g); |
||||
let (sn, color) = game.turn(); |
||||
let cmd = rl.readline_with_initial(&format!("{}> ", color), (&filled, "")); |
||||
retry = false; |
||||
match cmd { |
||||
Ok(line) => { |
||||
filled = line; |
||||
|
||||
let g = g.apply_move(Color::White, Move::InBoard { from: 23, to: 17 }).unwrap(); |
||||
let g = g.apply_move(Color::White, Move::InBoard { from: 7, to: 3 }).unwrap(); |
||||
let line = filled.trim(); |
||||
if line.is_empty() { |
||||
retry = true; |
||||
continue 'input; |
||||
} |
||||
|
||||
// Black turn, need to place the hit stone
|
||||
let g = g.spoof_roll(Roll::from_dice((1, 2))); |
||||
println!("{}", g); |
||||
match parse_input(line) { |
||||
Ok(moves) => { |
||||
println!("{:?}", moves); |
||||
let mut next = game.clone(); |
||||
for m in moves { |
||||
match next.apply_move(color, m) { |
||||
Ok(n) => { |
||||
next = n; |
||||
println!("{}", next); |
||||
} |
||||
Err(e) => { |
||||
println!("Move failed: {:?}", e); |
||||
retry = true; |
||||
continue 'input; |
||||
} |
||||
} |
||||
} |
||||
if next.turn().0 != sn { |
||||
game = next; |
||||
} else { |
||||
println!("Move NOT complete, reverting."); |
||||
retry = true; |
||||
} |
||||
}, |
||||
Err(e) => { |
||||
println!("Parsing failed: {}", e); |
||||
retry = true; |
||||
continue 'input; |
||||
}, |
||||
} |
||||
}, |
||||
// Err(ReadlineError::Interrupted) => {
|
||||
// // just clear the line and retry
|
||||
// retry = true;
|
||||
// continue 'input;
|
||||
// }
|
||||
Err(_) => { |
||||
break 'input; |
||||
}, |
||||
} |
||||
} |
||||
|
||||
let g = g.apply_move(Color::Black, Move::Enter(22)).unwrap(); |
||||
// let g = g.spoof_roll(Roll::from_dice((3, 5)));
|
||||
//
|
||||
// println!("{}", g);
|
||||
//
|
||||
// let g = g.apply_move(Color::Black, Move::InBoard { from: 0, to: 3 }).unwrap();
|
||||
// let g = g.apply_move(Color::Black, Move::InBoard { from: 11, to: 16 }).unwrap();
|
||||
//
|
||||
// // White turn
|
||||
// let g = g.spoof_roll(Roll::from_dice((4, 6)));
|
||||
// println!("{}", g);
|
||||
//
|
||||
// let g = g.apply_move(Color::White, Move::InBoard { from: 23, to: 17 }).unwrap();
|
||||
// let g = g.apply_move(Color::White, Move::InBoard { from: 7, to: 3 }).unwrap();
|
||||
//
|
||||
// // Black turn, need to place the hit stone
|
||||
// let g = g.spoof_roll(Roll::from_dice((1, 2)));
|
||||
// println!("{}", g);
|
||||
//
|
||||
// let g = g.apply_move(Color::Black, Move::Enter(1)).unwrap();
|
||||
//
|
||||
// let g = g.apply_move(Color::Black, Move::InBoard { from: 3, to: 4 }).unwrap();
|
||||
//
|
||||
// println!("{}", g);
|
||||
} |
||||
|
||||
|
||||
fn parse_input(line : &str) -> Fallible<Vec<Move>> { |
||||
let line = line.trim(); |
||||
|
||||
let mut moves = vec![]; |
||||
let fragments = line.split(','); |
||||
|
||||
// let mut moves = vec![];
|
||||
for f in fragments { |
||||
if !f.contains('/') { |
||||
return Err(format_err!("Bad syntax: \"{}\"", f)); |
||||
} |
||||
|
||||
let halves : Vec<&str> = f.split('/').collect(); |
||||
|
||||
if halves[0].is_empty() && halves[1].is_empty() { |
||||
return Err(format_err!("Bad syntax: \"{}\"", f)); |
||||
} |
||||
|
||||
if halves[0].is_empty() { |
||||
let to : u8 = halves[1].parse()?; |
||||
|
||||
if to == 0 || to > 24 { |
||||
return Err(format_err!("Out of range: {}", to)); |
||||
} |
||||
|
||||
moves.push(Move::Enter(to - 1)); |
||||
continue; |
||||
} |
||||
|
||||
if halves[1].is_empty() { |
||||
let to : u8 = halves[0].parse()?; |
||||
|
||||
if to == 0 || to > 24 { |
||||
return Err(format_err!("Out of range: {}", to)); |
||||
} |
||||
|
||||
moves.push(Move::BearOff(to - 1)); |
||||
continue; |
||||
} |
||||
|
||||
let from : u8 = halves[0].parse()?; |
||||
let to : u8 = halves[1].parse()?; |
||||
|
||||
if from == 0 || from > 24 { |
||||
return Err(format_err!("Out of range: {}", to)); |
||||
} |
||||
|
||||
if to == 0 || to > 24 { |
||||
return Err(format_err!("Out of range: {}", to)); |
||||
} |
||||
|
||||
let g = g.apply_move(Color::Black, Move::InBoard { from: 22, to: 21 }).unwrap(); |
||||
moves.push(Move::InBoard(from - 1, to - 1)); |
||||
} |
||||
|
||||
println!("{}", g); |
||||
Ok(moves) |
||||
} |
||||
|
Loading…
Reference in new issue