Skip to content
Snippets Groups Projects
game.hpp 1.84 KiB
Newer Older
#ifndef __GAME_HPP__
#define __GAME_HPP__

#include <string>
#include <cstdint>
#include <random>
#include <memory>
#include <set>

namespace game
{
  template <typename State>
  struct game
  {
    virtual bool end_of_game() const = 0;
    virtual int value(std::uint8_t player) const = 0;
    int value_for_current_player() const;
    virtual bool won(std::uint8_t player) const = 0;
    virtual bool lost(std::uint8_t player) const = 0;
    virtual bool draw(std::uint8_t player) const = 0;
    virtual uint8_t current_player() const = 0;
    virtual std::uint16_t number_of_moves() const = 0;
    virtual void play(std::uint16_t m) = 0;
    virtual void undo(std::uint16_t m) = 0;
    virtual std::string player_to_string(std::uint8_t player) const = 0;
    virtual std::string move_to_string(std::uint16_t m) const = 0;
    virtual std::string to_string() const = 0;
    virtual void playout(std::mt19937& engine, int max_depth = -1);
    virtual std::set<int> to_input_vector() const = 0; 
    virtual void from_input_vector(const std::set<int>& input) = 0;
    virtual State get_state() = 0;
    virtual void set_state(const State& state) = 0;
    virtual std::shared_ptr<game<State>> do_copy() const = 0;
    virtual std::uint64_t hash(std::uint16_t m) const = 0;
    virtual std::uint64_t hash() const = 0;
    virtual ~game() {}
  };
  template<typename Game> std::shared_ptr<Game> copy(const Game& g)
  {
    return std::dynamic_pointer_cast<Game>(g.do_copy());
  }
  template<typename State> int game<State>::value_for_current_player() const
  {
    return value(current_player());
  }
  template<typename State> void game<State>::playout(std::mt19937& engine, int max_depth)
  {
    while (!end_of_game())
      {
	std::uniform_int_distribution<uint16_t> distribution(0, number_of_moves() - 1);
	std::uint16_t move = distribution(engine);
  	play(move);
      }
  }