static void event_jouer(struct state* state, SDL_Event event) { struct jouerdata* jouer = state->data; utiliser_event_textinput(jouer->nom_partie, event); if (jouer->nom_partie->active) { afficher_sauvegarder(jouer); return; // ne pas interférer entre la saisie et les raccourcis claviers } if (event.type == SDL_MOUSEMOTION) { jouer->hovered = get_position_depuis_ecran(jouer, event.motion.x, event.motion.y); } else if (event.type == SDL_MOUSEBUTTONUP) { int b = event.button.button; if (b == 1) { Position pos = get_position_depuis_ecran(jouer, event.motion.x, event.motion.y); if (position_est_valide(pos)) { s_Coup coup = {pos}; partie_jouer_coup(jouer->partie, coup); afficher_sauvegarder(jouer); } } else if (b == 2) { s_Coup coup; coup.position = POSITION_INVALIDE; partie_jouer_coup(jouer->partie, coup); afficher_sauvegarder(jouer); } else if (b == 4) { partie_annuler_coup(jouer->partie); afficher_sauvegarder(jouer); } else if (b == 5) { partie_rejouer_coup(jouer->partie); afficher_sauvegarder(jouer); } } else if (event.type == SDL_KEYDOWN) { if (event.key.keysym.sym == SDLK_p) { s_Coup coup = {POSITION_INVALIDE}; partie_jouer_coup(jouer->partie, coup); afficher_sauvegarder(jouer); } else if (event.key.keysym.sym == SDLK_a) { partie_annuler_coup(jouer->partie); afficher_sauvegarder(jouer); } else if (event.key.keysym.sym == SDLK_r) { partie_rejouer_coup(jouer->partie); afficher_sauvegarder(jouer); } } utiliser_event_bouton(jouer->passer_son_tour, event); utiliser_event_bouton(jouer->sauvegarder, event); utiliser_event_bouton(jouer->retour_menu, event); }
/** @ingroup test * @brief Teste l'annulation d'un coup * @param partie de test * @param inutilisé * @param inutilisé * @return valeur de retour de partie_annuler_coup */ bool handle_annuler(Partie partie, FILE* file, const char* arguments) { (void) file; (void) arguments; bool valide = partie_annuler_coup(partie); return valide; }
void cli_jouer_partie(Partie partie) { char choix; do { char label[32]; char rep[32]; while (!partie->finie) { enum CouleurJoueur couleur = partie_get_joueur(partie); if (partie->joueurs[couleur].type == HUMAIN) { snprintf(label, sizeof(label), "Au joueur %s de jouer", couleur == JOUEUR_BLANC ? "blanc" : "noir"); cli_demander_string(label, rep, sizeof(rep)); if (! strcmp(rep, "s")) { char filename[4096]; cli_demander_string("Sauvegarder la partie dans le fichier", filename, sizeof(filename)); if (! sauvegarder_partie_fichier(filename, partie)) perror("Erreur dans la sauvegarde de la partie"); continue; } else if (! strcmp(rep, "p")) { s_Coup passer = { POSITION_INVALIDE }; partie_jouer_coup(partie, passer); continue; } else if (! strcmp(rep, "a")) { partie_annuler_coup(partie); cli_afficher_plateau(partie->plateau); continue; } else if (! strcmp(rep, "r")) { partie_rejouer_coup(partie); cli_afficher_plateau(partie->plateau); continue; } else if (! strcmp(rep, "q")) { break; } bool valide; s_Coup coup = cli_convertir_coup(partie, rep, &valide); if (valide) { bool reussi = partie_jouer_coup(partie, coup); (void) reussi; // pour les erreurs de compilation en mode release gosh_debug("coup reussi: %s", reussi ? "oui" : "non"); cli_afficher_plateau(partie->plateau); } } else { partie_jouer_ordinateur(partie); cli_afficher_plateau(partie->plateau); } } if (partie->finie) { printf("Partie terminée !\n"); float scores[2]; partie_score_joueurs(partie, scores, VALEUR_KOMI_FRANCE); enum CouleurJoueur gagnant = scores[JOUEUR_NOIR] > scores[JOUEUR_BLANC] ? JOUEUR_NOIR : JOUEUR_BLANC; printf("Gagnant : %s (%s)\n", partie->joueurs[gagnant].nom, gagnant == JOUEUR_NOIR ? "noir" : "blanc"); printf("Score des noirs : %.1f\n", scores[JOUEUR_NOIR]); printf("Score des blancs : %.1f\n", scores[JOUEUR_BLANC]); } choix = cli_choisir_option("Que souhaitez-vous faire ?", 0, 'r', "rejouer la partie", 's', "sauvegarder la partie", 'q', "quitter", 0); if (choix == 's') { char filename[4096]; cli_demander_string("Sauvegarder la partie dans le fichier", filename, sizeof(filename)); if (! sauvegarder_partie_fichier(filename, partie)) perror("Erreur dans la sauvegarde de la partie"); } else if (choix == 'r') { reinitialisation_partie(partie); partie->finie = false; cli_afficher_plateau(partie->plateau); } } while (choix != 'q'); }