From 15cf6dda7be4e26117c68e158a2d41602742e507 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adrien=20Gast=C3=A9?= <adrien.gaste@insa-rennes.fr> Date: Fri, 12 Feb 2016 12:39:30 +0100 Subject: [PATCH] Bases du jeu pingouins. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Makefile et main modifiés, fichiers .hpp et .cpp crées --- Makefile | 4 +- doc/Representation_Pingouins.txt | 2 + src/game/penguin.cpp | 158 +++++++++++++++++++++++++++++++ src/game/penguin.hpp | 70 ++++++++++++++ src/main/main.cpp | 7 +- 5 files changed, 238 insertions(+), 3 deletions(-) create mode 100644 src/game/penguin.cpp create mode 100644 src/game/penguin.hpp diff --git a/Makefile b/Makefile index c414ab9..d413f60 100644 --- a/Makefile +++ b/Makefile @@ -1,9 +1,9 @@ -CC=g++-4.9 +CC=g++ BIN=bin INCLUDE=-I src/game -I src/util -I src/monte_carlo -I src/mcts -I src/minmax CFLAGS=-g -O3 -ffast-math -fopenmp -c -Wall -std=c++11 $(INCLUDE) LDFLAGS=-fopenmp -std=c++11 #-lprofiler -Wl,-no_pie -SOURCES=omp_util.cpp fast_log.cpp display_node.cpp connect4.cpp morpion.cpp test_two_players_game.cpp test_connect4.cpp monte_carlo.cpp test_monte_carlo.cpp test_fast_log.cpp\ +SOURCES=omp_util.cpp fast_log.cpp display_node.cpp penguin.cpp connect4.cpp morpion.cpp test_two_players_game.cpp test_connect4.cpp monte_carlo.cpp test_monte_carlo.cpp test_fast_log.cpp\ statistics.cpp node.cpp allocator.cpp test_allocator.cpp openings.cpp mcts_two_players.cpp test_mcts_two_players.cpp test_minmax.cpp\ bits.cpp test_bits.cpp main.cpp OBJECTS=$(addprefix $(BIN)/, $(SOURCES:.cpp=.o)) diff --git a/doc/Representation_Pingouins.txt b/doc/Representation_Pingouins.txt index 4bae3b3..33b5852 100644 --- a/doc/Representation_Pingouins.txt +++ b/doc/Representation_Pingouins.txt @@ -23,3 +23,5 @@ Bitboard obstacles : 1 s'il y a un obstacle 0 sinon ==> ~Bitboard eau (OR 1 << Pos. pingouin1) (OR 1 << Pos. pingouin2)...(OR 1 << Pos. pingouin8) + +==> Le premier joueur est Red diff --git a/src/game/penguin.cpp b/src/game/penguin.cpp new file mode 100644 index 0000000..6940cf7 --- /dev/null +++ b/src/game/penguin.cpp @@ -0,0 +1,158 @@ +#include "penguin.hpp" +#include <sstream> + +using namespace std; + +namespace game +{ + penguin::penguin() + { + } + + shared_ptr<game<penguin_state>> penguin::do_copy() const + { + return shared_ptr<penguin>(new penguin(*this)); + } + + penguin_state penguin::get_state() + { + return state; + } + + void penguin::set_state(const penguin_state& s) + { + state = s; + } + + bool penguin::end_of_game() const + { + return false; + //return state.first_player_win || state.second_player_win || state.total_moves == 9; + } + + bool penguin::won(std::uint8_t player) const + { + return false; + //if (player == CROSS) return state.first_player_win; + //return state.second_player_win; + } + + bool penguin::lost(std::uint8_t player) const + { + return false; + /*if (player == CIRCLE) return state.first_player_win; + return state.second_player_win;*/ + } + + bool penguin::draw(std::uint8_t player) const + { + return false; + /*if (state.first_player_win || state.second_player_win) return false; + return state.total_moves == 9;*/ + } + + uint8_t penguin::current_player() const + { + return 0; + /*return state.total_moves & 1 ? CIRCLE : CROSS; // CROSS even, CIRCLE odd*/ + } + + int penguin::value(uint8_t player) const + { + /*if (player == CROSS) { + return state.first_player_win ? 1 : (state.second_player_win ? -1 : 0); + } + else if (player == CIRCLE) { + return state.second_player_win ? 1 : (state.first_player_win ? -1 : 0); + } + return 0;*/ + return 0; + } + + /* Number of moves that you can play */ + uint16_t penguin::number_of_moves() const + { + //return 9 - state.total_moves; + return 0; + } + + //Play the mth move in the possible moves list. + void penguin::play(uint16_t m) + { + /*uint64_t possible_moves = state.possible_moves; + possible_moves = possible_moves >> 4*m; //A move is coded with 4 bit + uint16_t move = possible_moves & 15; //15 = 1111 + //cout << "You choose the possible move number " << m << endl; + //cout << "You choose move " << move << endl; + if (current_player() == CROSS) + state.cross_bitboard |= (((uint16_t) 1) << move); + else + state.circle_bitboard |= (((uint16_t) 1) << move); + + //State update + state.total_moves++; + update_win(); + update_moves(); + return;*/ + } + + string penguin::player_to_string(uint8_t player) const + { + //return player == CROSS ? "X" : (player == CIRCLE ? "O" : " "); + return "TODO"; + } + + + string penguin::move_to_string(uint16_t m) const + { + //return std::to_string((state.possible_moves >> (4 * m)) & 0xf); + return "TODO"; + } + + set<int> penguin::to_input_vector() const + { + return set<int>(); + } + + void penguin::from_input_vector(const std::set<int>& input) + { + } + + string penguin::to_string() const + { + /*string result = "-------\n"; + for (int row = 2; row >= 0; row--) + { + result += "|"; + for (int col = 2; col >= 0; col--) + { + if(((state.cross_bitboard >> (3*row)) >> col) & 1) + result += player_to_string(CROSS)+"|"; + else if (((state.circle_bitboard >> (3*row)) >> col) & 1) + result += player_to_string(CIRCLE)+"|"; + else + result += std::to_string(row * 3 + col) + "|"; + } + result += "\n-------\n"; + } + return result; + */ + return "TODO"; + } + + std::uint64_t penguin::hash() const + { + return 0; + } + + std::uint64_t penguin::hash(std::uint16_t m) const + { + return 0; + } + + ostream& operator<<(ostream& os, const penguin& pen) + { + os << pen.to_string() << endl; + return os; + } +} diff --git a/src/game/penguin.hpp b/src/game/penguin.hpp new file mode 100644 index 0000000..620c6e6 --- /dev/null +++ b/src/game/penguin.hpp @@ -0,0 +1,70 @@ +#ifndef __PENGUIN_HPP__ +#define __PENGUIN_HPP__ + +#include "game.hpp" +#include <random> +#include <array> +#include <iostream> +#include <memory> + +namespace game +{ + struct penguin_state + { + uint64_t one_fish = 0x7F59398348146BD; //Position of one-fish tiles (bitboard) + uint64_t two_fish = 0x86C628366B102; //Position of two-fish tiles (bitboard) + uint64_t three_fish = 0x802000548180840; //Position of three-fish tiles (bitboard) + + //Penguins + uint32_t p1_red = 0; + uint32_t p2_red = 1; + uint32_t p3_red = 8; + uint32_t p4_red = 9; + uint32_t p1_blue = 51; + uint32_t p2_blue = 52; + uint32_t p3_blue = 58; + uint32_t p4_blue = 59; + + bool red_player_win = false; + bool blue_player_win = false; + + int score_red = 0; + int score_blue = 0; + + bool current_player_red = true; //True if red must play now + }; + + class penguin : public game<penguin_state> + { + public: + penguin(); + penguin(const penguin& pen) = default; + penguin& operator=(const penguin& pen) = default; + bool end_of_game() const; //Is the game ended? (draw or won) + int value(std::uint8_t player) const; //Returns if the player win, loose or nothing + bool won(std::uint8_t player) const; + bool lost(std::uint8_t player) const; + bool draw(std::uint8_t player) const; + uint8_t current_player() const; //The player that has to play next (at the beginning, the first player) + std::uint16_t number_of_moves() const; //Number of moves that you can play + void play(std::uint16_t m); //Play the move m (updates the state). + void undo(std::uint16_t m) {} + std::string player_to_string(std::uint8_t player) const; //String representation of a player + std::string move_to_string(std::uint16_t m) const; //String representation of a move (for example, A1) + std::string to_string() const; //String representation of the entire game + std::set<int> to_input_vector() const; + void from_input_vector(const std::set<int>& input); + penguin_state get_state(); //Return the state + void set_state(const penguin_state& state); //Replace the current state with the one passed as a parameter + std::shared_ptr<game<penguin_state>> do_copy() const; + std::uint64_t hash(std::uint16_t m) const; + std::uint64_t hash() const; + + private: + penguin_state state; + + }; + std::ostream& operator<<(std::ostream& os, const penguin& pen); +} + +#endif diff --git a/src/main/main.cpp b/src/main/main.cpp index fe3a17b..19f8c24 100644 --- a/src/main/main.cpp +++ b/src/main/main.cpp @@ -1,6 +1,7 @@ #include "test_connect4.hpp" #include "connect4.hpp" #include "morpion.hpp" +#include "penguin.hpp" #include "test_two_players_game.hpp" #include "test_monte_carlo.hpp" #include "test_fast_log.hpp" @@ -24,7 +25,11 @@ int main(int argc, char *argv[]) //mcts::run_test_mcts_two_players(game::connect4()); //game::run_test_two_players_game(game::morpion()); - mcts::run_test_mcts_two_players(game::morpion()); + //mcts::run_test_mcts_two_players(game::morpion()); + + game::run_test_two_players_game(game::penguin()); + //mcts::run_test_mcts_two_players(game::penguin()); + // minmax::test_minmax(); //util::test_bits(200000000); -- GitLab