mirror of
https://github.com/coding-horror/basic-computer-games.git
synced 2025-12-29 06:05:36 -08:00
181 lines
4.3 KiB
Rust
181 lines
4.3 KiB
Rust
use crate::{
|
|
ai,
|
|
util::{self, prompt, PromptResult::*},
|
|
};
|
|
|
|
pub struct Game {
|
|
blocks: [u8; 64],
|
|
location: Option<u8>,
|
|
player_move: bool,
|
|
show_board: bool,
|
|
forfeit: bool,
|
|
}
|
|
|
|
impl Game {
|
|
pub fn new() -> Self {
|
|
let mut blocks = [0 as u8; 64];
|
|
|
|
let mut block = 91;
|
|
let mut i = 0;
|
|
|
|
for _ in 0..8 {
|
|
for _ in 0..8 {
|
|
block -= 10;
|
|
blocks[i] = block;
|
|
i += 1;
|
|
}
|
|
block += 91;
|
|
}
|
|
|
|
Game {
|
|
blocks,
|
|
location: None,
|
|
player_move: true,
|
|
show_board: false,
|
|
forfeit: false,
|
|
}
|
|
}
|
|
|
|
pub fn update(&mut self) -> bool {
|
|
let mut still_going = true;
|
|
|
|
if let Some(l) = self.location {
|
|
if self.show_board {
|
|
self.draw(l);
|
|
}
|
|
|
|
match self.player_move {
|
|
true => self.player_move(l),
|
|
false => {
|
|
std::thread::sleep(std::time::Duration::from_secs(1));
|
|
let loc = ai::get_computer_move(l);
|
|
println!("COMPUTER MOVES TO SQUARE {}", loc);
|
|
self.location = Some(loc);
|
|
}
|
|
}
|
|
|
|
still_going = self.check_location();
|
|
} else {
|
|
self.set_start_location();
|
|
}
|
|
self.player_move = !self.player_move;
|
|
still_going
|
|
}
|
|
|
|
fn set_start_location(&mut self) {
|
|
self.draw(0);
|
|
|
|
if let YesNo(yes) = prompt(Some(false), "UPDATE BOARD?") {
|
|
self.show_board = yes;
|
|
}
|
|
|
|
loop {
|
|
if let Numeric(n) = prompt(Some(true), "WHERE WOULD YOU LIKE TO START?") {
|
|
let n = n as u8;
|
|
|
|
if util::is_legal_start(n) {
|
|
self.location = Some(n);
|
|
break;
|
|
} else {
|
|
println!("PLEASE READ THE DIRECTIONS AGAIN.\nYOU HAVE BEGUN ILLEGALLY.\n")
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
fn player_move(&mut self, loc: u8) {
|
|
loop {
|
|
if let Numeric(n) = prompt(Some(true), "WHAT IS YOUR MOVE?") {
|
|
if n == 0 {
|
|
self.forfeit = true;
|
|
break;
|
|
}
|
|
|
|
let n = n as u8;
|
|
|
|
if util::is_move_legal(loc, n) {
|
|
self.location = Some(n);
|
|
break;
|
|
} else {
|
|
println!("Y O U C H E A T . . . TRY AGAIN? ");
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
fn check_location(&self) -> bool {
|
|
if self.location == Some(158) {
|
|
util::print_gameover(self.player_move, self.forfeit);
|
|
return false;
|
|
}
|
|
|
|
true
|
|
}
|
|
|
|
fn draw(&self, loc: u8) {
|
|
let draw_h_border = |top: Option<bool>| {
|
|
let corners;
|
|
|
|
if let Some(top) = top {
|
|
if top {
|
|
corners = ("┌", "┐", "┬");
|
|
} else {
|
|
corners = ("└", "┘", "┴");
|
|
}
|
|
} else {
|
|
corners = ("├", "┤", "┼");
|
|
}
|
|
|
|
print!("{}", corners.0);
|
|
|
|
for i in 0..8 {
|
|
let corner = if i == 7 { corners.1 } else { corners.2 };
|
|
|
|
print!("───{}", corner);
|
|
}
|
|
println!();
|
|
};
|
|
|
|
draw_h_border(Some(true));
|
|
|
|
let mut column = 0;
|
|
let mut row = 0;
|
|
|
|
for block in self.blocks.iter() {
|
|
let block = *block as u8;
|
|
|
|
let n = if block == loc {
|
|
format!("│{}", "*Q*".to_string())
|
|
} else {
|
|
let b = block.to_string();
|
|
|
|
if block > 99 {
|
|
format!("│{}", b)
|
|
} else {
|
|
format!("│{} ", b)
|
|
}
|
|
};
|
|
|
|
print!("{}", n);
|
|
|
|
column += 1;
|
|
|
|
if column != 1 && (column % 8) == 0 {
|
|
column = 0;
|
|
row += 1;
|
|
|
|
print!("│");
|
|
println!();
|
|
|
|
if row == 8 {
|
|
draw_h_border(Some(false));
|
|
} else {
|
|
draw_h_border(None);
|
|
}
|
|
}
|
|
}
|
|
|
|
println!();
|
|
}
|
|
}
|