logik/main.cpp

95 lines
2 KiB
C++

#include <iostream>
#include <string>
#include <vector>
#include "solver.hpp"
#include "gen.hpp"
#include "validate.hpp"
using std::cout;
using std::cin;
using std::string;
using std::vector;
// To avoid typos
#define BOT "bot"
#define HUMAN "human"
#define RANDOM "random"
int main(void) {
// Take game parameters
cout << "Length of sequence : ";
int N; cin >> N;
cout << "Number of colors : ";
int M; cin >> M;
cout << "Who plays [" << HUMAN << "/" << BOT << "] : ";
string player; cin >> player;
string gen = RANDOM;
if(player == BOT) {
cout << "Who generates the sequence [" << HUMAN << "/" << RANDOM << "]: ";
cin >> gen;
}
// Generate the sequence
auto sequence = vector<int>(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<vector<int>> history = {};
for(int guesses = 0; guesses < 10; guesses++) {
vector<int> guess(N), response;
// 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);
}
history.push_back(guess);
if(response[1] == N) break;
}
// Terminal clearing
cout << std::endl;
// Print game statistics
cout << "How did the game go\n";
for(auto guess : history)
cout << format_guess_history(sequence, guess) << std::endl;
return 0;
}