aboutsummaryrefslogtreecommitdiff
path: root/src/game.rs
blob: 96f71b3a31b934e4cc9ab437440fcdff0883b70c (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
use crate::{board::{GameBoard, Turn}, player::Player};

pub struct GameHandler
{
	board: GameBoard,
}

impl Default for GameHandler
{
	fn default() -> Self
	{
		Self
		{
			board: GameBoard::default()
		}
	}
}

impl GameHandler
{
	// fn play_move<T: Player>(&mut self, player: &mut T)
	// {
	// 	let m = player.pick_move(self.board);
	// 	self.board.make_move(m).unwrap();
	// }

	/// Play until someone wins, with `p1` as the sheep and `p2` as the tigers. Returns the winner.
	pub fn play_game<T1: Player, T2: Player>(&mut self, p1: &mut T1, p2: &mut T2) -> Turn
	{
		let mut turn = Turn::Sheep;
		while !self.board.check_win(turn)
		{
			let m = match turn
			{
				Turn::Sheep => p1.pick_move(self.board, turn),
				Turn::Tiger => p2.pick_move(self.board, turn),
			};
			self.board.make_move(m).unwrap();
			turn = turn.next_turn();
		}
		// check_win runs before `turn`'s move, so whoever moved last has won.
		turn.next_turn()
	}
}