Add existing files to Git
This commit is contained in:
49
src/game.rs
49
src/game.rs
@@ -1,5 +1,4 @@
|
||||
use crate::{agent::Agent, board::Board};
|
||||
use std::time::Duration;
|
||||
|
||||
pub struct Game {
|
||||
players: [Box<dyn Agent>; 2],
|
||||
@@ -29,31 +28,59 @@ impl Game {
|
||||
}
|
||||
}
|
||||
|
||||
// Handle when a move is made
|
||||
pub fn step(&mut self, player_i: usize) {
|
||||
let player_move = self.players[player_i].next_move(&self.board);
|
||||
if let Some((i, j)) = player_move {
|
||||
if let Ok(()) = self.board.place(i, j, self.players[player_i].color()) {
|
||||
let player_color = self.players[player_i].color();
|
||||
|
||||
loop {
|
||||
let player_move = self.players[player_i].next_move(&self.board);
|
||||
|
||||
if let Some((i, j)) = player_move {
|
||||
match self.board.place(i, j, player_color) {
|
||||
// Check if its a valid move
|
||||
Ok(_) => {
|
||||
println!("Player {} placed at ({}, {})", player_i, i, j);
|
||||
break;
|
||||
}
|
||||
|
||||
// Lets the player try again if the move is invalid
|
||||
// Now we dont need to restart the game if we mess up
|
||||
Err(err) => {
|
||||
println!("Invalid move by Player {}: {}. Try again.", player_i, err);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
todo!("handle invalid player move");
|
||||
println!("Player {} did not make a move!", player_i);
|
||||
return; // No valid move available
|
||||
}
|
||||
} else {
|
||||
panic!("player {} did not make a move", player_i);
|
||||
}
|
||||
}
|
||||
|
||||
// TODO! make this loop good
|
||||
pub fn game_loop(&mut self) {
|
||||
let mut i = 0;
|
||||
let mut current_player: usize = 0;
|
||||
|
||||
loop {
|
||||
// alternate which player plays
|
||||
i += 1;
|
||||
i %= self.players.len();
|
||||
current_player += 1;
|
||||
current_player %= self.players.len();
|
||||
|
||||
println!("{}", self);
|
||||
|
||||
self.step(i);
|
||||
// Check if the game is over
|
||||
if self.board.game_over() == true {
|
||||
break;
|
||||
}
|
||||
|
||||
self.step(current_player);
|
||||
|
||||
// std::thread::sleep(Duration::from_millis(200));
|
||||
}
|
||||
// Print Game Over Screen
|
||||
println!("{}", self);
|
||||
match self.board.get_winner() {
|
||||
Some(winner) => println!("Game Over! {} Wins!", winner.text()),
|
||||
None => print!("It's a tie!! You either both suck or are both really good..."),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user