#include #include #include #include "solver.hpp" #include "gen.hpp" #include "validate.hpp" #include "format.hpp" using std::cout; using std::cin; using std::string; using std::vector; using std::getline; // To avoid typos #define BOT "bot" #define HUMAN "human" #define RANDOM "random" int main(void) { // Take game parameters cout << "Length of sequence (default=5) : "; string string_N; getline(cin, string_N); int N = (string_N == "") ? 5 : stoi(string_N); cout << "Number of colors (default=8) : "; string string_M; getline(cin, string_M); int M = (string_M == "") ? 8 : stoi(string_M); cout << "Who plays [" << UNDERLINE << HUMAN << BACK << "/" << BOT << "] : "; string player; getline(cin, player); if(player == "") player = HUMAN; bool learn = 0; if(player == HUMAN) { cout << "Do you want to know what bot learns [" << UNDERLINE << "y" << BACK << "/n] : "; string reply; getline(cin, reply); if(reply == "") reply = "y"; learn = (reply == "y"); } string gen = RANDOM; if(player == BOT) { cout << "Who generates the sequence [" << HUMAN << "/" << RANDOM << "]: "; cin >> gen; } // Generate the sequence auto sequence = vector(N); if(gen == RANDOM) sequence = generate(N, M); else if(gen == HUMAN) { cout << "Enter " << N << " space-separated numbers from 0 to " << M-1 << std::endl; for(int n = 0; n < N; n++) cin >> sequence[n]; } // Terminal clearing cout << std::endl; // Human info if(player == HUMAN) { cout << "Guesses are " << N << " space-separated numbers from 0 to " << M-1 << std::endl << "Responses are in format [correct out of place] / [correct in place]" << std::endl; cout << std::endl; } // Init solver Solver bot(N, M); // Guessing vector> history = {}; for(int guesses = 0; guesses < 10; guesses++) { vector guess(N), response; cout << "Guess " << history.size() << " : "; // Bot playing if(player == BOT) { guess = bot.guess(); cout << format_guess(guess); response = validate(sequence, guess); cout << format_response(response); bot.learn(guess, response); } // Human playing else if(player == HUMAN) { for(int n = 0; n < N; n++) cin >> guess[n]; response = validate(sequence, guess); cout << format_response(response); if(learn) { bot.learn(guess, response); bot.print(); } } history.push_back(guess); if(history.back() == sequence) break; } // Terminal clearing cout << std::endl; // Print game history cout << "History\n"; for(auto guess : history) cout << format_guess_history(sequence, guess) << std::endl; if(history.back() != sequence) cout << format_lost_sequence(sequence) << std::endl; return 0; }