Struct Opponent

Source
pub struct Opponent { /* private fields */ }
Expand description

Provides a computer controlled AI opponent.

This can be used to create single player games or implement a hint system for human users.

Implementations§

Source§

impl Opponent

Source

pub fn new(difficulty: Difficulty) -> Self

Constructs a new AI opponent using the provided difficulty.

§Examples

Construct a hard AI opponent:

use open_ttt_lib::ai;

let hard_opponent = ai::Opponent::new(ai::Difficulty::Hard);

Construct an AI opponent that randomly picks positions:

use open_ttt_lib::ai;

let rando = ai::Opponent::new(ai::Difficulty::None);
Source

pub fn get_move(&self, game: &Game) -> Option<Position>

Gets the position the AI opponent wishes to move based on the provided game.

None is returned if the game is over. The AI opponent never tries to select an invalid position, that is a position that is not free.

§Examples
use open_ttt_lib::ai;
use open_ttt_lib::game;

let game = game::Game::new();
let ai_opponent = ai::Opponent::new(ai::Difficulty::Medium);

match ai_opponent.get_move(&game) {
    Some(position) => assert!(game.can_move(position)),
    None => panic!("The game is over so the AI opponent cannot do a move."),
};
Source

pub fn evaluate_game(&self, game: &Game) -> HashMap<Position, Outcome>

Evaluates each free position in the provided game.

Each free position in the game is mapped to an outcome for the AI opponent. If the game is over an empty map is returned.

This functionality is useful if you wish to examine how the AI opponent viewed the game. E.g. this can be helpful for creating a hint system to help human players pick a position or when fine-tuning the AI difficulty settings.

§Examples
use open_ttt_lib::ai;
use open_ttt_lib::game;

let game = game::Game::new();
let ai_opponent = ai::Opponent::new(ai::Difficulty::Medium);

let outcomes = ai_opponent.evaluate_game(&game);

// Display the outcome for each position.
for (position, outcome) in outcomes {
    assert!(game.can_move(position));
    println!("position: {:?} outcome: {:?}", position, outcome);
}

Trait Implementations§

Source§

impl Clone for Opponent

Source§

fn clone(&self) -> Opponent

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for Opponent

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Hash for Opponent

Source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where H: Hasher, Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
Source§

impl PartialEq for Opponent

Source§

fn eq(&self, other: &Opponent) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, and should not be overridden without very good reason.
Source§

impl StructuralPartialEq for Opponent

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> ToOwned for T
where T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<V, T> VZip<V> for T
where V: MultiLane<T>,

Source§

fn vzip(self) -> V