On va partir depuis le début.
Ton programme a été arrêté suite à une levée d'exception quelque part dans ton programme, de type std::logic_error.
Maintenant, on remarque dans la méthode "what()" que la chaine de caractère retournée est basic_string::_S_construct null is not valid.
Globalement, ce message d'erreur signifie que pour le constructeur de string, string(const char *), tu lui envoies la valeur NULL, hors, il ne peut pas copier une chaine de caractère qui est vide. (string n'est pas magique, au fond, ce n'est qu'une grosse surcouche des pointeurs sur char)
Donc pour éviter tout bug et/ou crash, il retourne une exception de type std::logic_error.
Tu as donc deux solutions, sois-tu catch l'erreur, en faisant ce style de code.
try
{
// Ton code original
}
catch (std::logic_error &/* */)
{
}
Soit, pour ce morceau de code donné.
string choixProg(0);
string choixJoueur(0);
Tu ne lui envoies pas zéro, mais sois-tu ne l'initialise pas, sois-tu lui envoies une chaine de caractère vide.
Pourquoi ? car en C++, 0 est l'équivalent de NULL.
D'ailleurs, simple conseil, mais évites d'assigner des variables à 0, hormis pour les types numériques, si tu veux initialiser un pointeur à 0, utilises plus nullptr.