void jouer_ui(jeu_s jeu, aff_s aff) { coup_s c; int erreur=0; int x, y; while(!is_end(jeu)) { maj_affichage(jeu, aff); if (jeu->participant[jeu->g->joueur].is_ai) c = choix_coup_ai(jeu); else c = saisir_coups(jeu, aff); erreur = jouer(jeu, c); if(!erreur == 0) { char buf[256]; snprintf(buf, sizeof buf, "%s %d|%d -> %d|%d", error[erreur-1], c->source[ORD], c->source[ABS], c->destination[ORD], c->destination[ABS]); afficher_message(aff, buf); } else { clear_message(aff); } } clear(); getmaxyx(stdscr, y, x); attron(A_BOLD | A_REVERSE); keypad(stdscr, FALSE); if (jeu->participant[TIGRE].score == 7) mvprintw((y/2), (x/2)-23, "Les tigres ont gagnés !"); else mvprintw((y/2), (x/2)-24, "Les chèvres ont gagnés !"); getch(); }
int main(int argc, char *argv[]) { if (argc != 2) { fprintf(stderr, "Usage: %s nombre\n", argv[0]); exit(3); } nombre_processus = atoi(argv[1]); int pid; int i, j; for (i = 2; i <= nombre_processus; i++) { // On bloque tous les sémaphores sauf le premier P(i); } // Exécution 5 fois de l'affichage for (i = 0; i < 5; i++) { // Forkons NOMBRE_PROCESSUS fois for (j = 1; j <= nombre_processus; j++) { pid = fork(); if (pid == 0) { // Processus enfant afficher_message(j); exit(0); // <== Important } } // Maintenant on les attends tous for (j = 0; j < nombre_processus; j++) { wait(NULL); } printf("\n"); // Pour mieux séparer } exit(0); }
coup_s saisir_coups(jeu_s jeu, aff_s aff) { int c; MEVENT event; mousemask(ALL_MOUSE_EVENTS, NULL); int clics_sont_valides = 0; int err; coup_s coup = malloc(sizeof(t_coup_s)); int second_click = 0; if (get_phase(jeu) == PHASE_PLACEMENT && get_joueur(jeu) == CHEVRE) { coup->source[ABS]=-1; coup->source[ORD]=-1; second_click = 1; wattron(aff->etat, A_REVERSE | A_BOLD); mvwprintw(aff->etat, 1, 2, "Positionnez une chèvre"); wattroff(aff->etat, A_REVERSE | A_BOLD); wrefresh(aff->etat); } if (get_phase(jeu) == PHASE_DEPLACEMENT && get_joueur(jeu) == CHEVRE) { wattron(aff->etat, A_REVERSE | A_BOLD); mvwprintw(aff->etat, 1, 2, "Déplacez une chèvre"); wattroff(aff->etat, A_REVERSE | A_BOLD); wrefresh(aff->etat); } if (get_joueur(jeu) == TIGRE) { wattron(aff->etat, A_REVERSE | A_BOLD); mvwprintw(aff->etat, 1, 2, "Déplacez un tigre"); wattroff(aff->etat, A_REVERSE | A_BOLD); wrefresh(aff->etat); } do { keypad(stdscr, TRUE); c = getch(); if (c == KEY_MOUSE) if(getmouse(&event) == OK) if(event.bstate & BUTTON1_CLICKED) { wmove(aff->etat, 1, 2); wclrtoeol(aff->etat); wmove(aff->etat, 2, 2); wclrtoeol(aff->etat); wmove(aff->etat, 3, 2); wclrtoeol(aff->etat); if (second_click) { wattron(aff->etat, A_BOLD); mvwprintw(aff->etat, 3, 2, "FAIRE SELECTION"); wattroff(aff->etat, A_BOLD); wrefresh(aff->etat); err = coord_aff_vers_jeu(aff, event.y, event.x, &(coup->destination[ABS]), &(coup->destination[ORD])); if (!err) { clics_sont_valides = 1; wmove(aff->etat, 2, 2); wclrtoeol(aff->etat); mvwprintw(aff->etat, 2, 2, "DX: "); wattroff(aff->etat, A_BOLD); wattron(aff->etat, A_BOLD); wprintw(aff->etat, "%d ", coup->destination[ABS]); wattroff(aff->etat, A_BOLD); wprintw(aff->etat, "DY: "); wattron(aff->etat, A_BOLD); wprintw(aff->etat, "%d", coup->destination[ORD]); wattroff(aff->etat, A_BOLD); wrefresh(aff->etat); } else { wattron(aff->etat, A_REVERSE | A_BOLD); mvwprintw(aff->etat, 2, 2, "Clic invalide, cliquez sur un pion!"); wattroff(aff->etat, A_REVERSE | A_BOLD); wrefresh(aff->etat); } } else { wattron(aff->etat, A_BOLD); mvwprintw(aff->etat, 3, 2, "CHOIX DE LA DESTINATION"); wattroff(aff->etat, A_BOLD); wrefresh(aff->etat); err = coord_aff_vers_jeu(aff, event.y, event.x, &(coup->source[ABS]), &(coup->source[ORD])); if (!err) { second_click = 1; wmove(aff->etat, 1, 2); wclrtoeol(aff->etat); wmove(aff->etat, 2, 2); wclrtoeol(aff->etat); mvwprintw(aff->etat, 1, 2, "SX: "); wattroff(aff->etat, A_BOLD); wattron(aff->etat, A_BOLD); wprintw(aff->etat, "%d ", coup->source[ABS]); wattroff(aff->etat, A_BOLD); wprintw(aff->etat, "SY: "); wattron(aff->etat, A_BOLD); wprintw(aff->etat, "%d", coup->source[ORD]); wattroff(aff->etat, A_BOLD); wrefresh(aff->etat); } else { wmove(aff->etat, 1, 2); wclrtoeol(aff->etat); wmove(aff->etat, 2, 2); wclrtoeol(aff->etat); wattron(aff->etat, A_REVERSE | A_BOLD); mvwprintw(aff->etat, 1, 2, "Clic invalide, cliquez sur un pion!"); wattroff(aff->etat, A_REVERSE | A_BOLD); wrefresh(aff->etat); } } } if (c == 's') { sauvegarder(jeu); afficher_message(aff, "Partie sauvegarder dans save.txt"); } else if (c == 'c') { charger(jeu); maj_affichage(jeu, aff); afficher_message(aff, "Partie save.txt chargé"); } else if (c == 'u') { jeu = undo(jeu); maj_affichage(jeu, aff); afficher_message(aff, "Action précedente annulée"); } } while (!clics_sont_valides); coup->type=get_joueur(jeu); return coup; }
int menu_clic(SDL_Surface *screen, Menu *menu, int *page, Curseur c, Plateau *p, bool *tourJ1, Item *items[], TTF_Font *font, SDL_Color *color, Item** message, bool* game, int* mode) { for (int i = 0; i < menu[*page]->size; i++) { if (mnit_is_over(menu[*page]->items[i], &c)) { switch (*page) { case 0: switch (i) { case 0: menu[0]->on_screen = false; menu[1]->on_screen = true; *page = 1; return 1; case N_MAINMENU - 1: return 0; default: break; } break; case 1: switch (i) { case 0: menu[1]->on_screen = false; menu[2]->on_screen = true; *page = 2; return 1; case 1: new_game(p); int res = save_charger(p, tourJ1, "./saves/save.txt", mode); if (res != 0) { menu[0]->on_screen = true; menu[1]->on_screen = false; res_placer_pion(*p, res-1, tourJ1, message, game, NULL, *mode); *page = 0; if (res >= 2) { afficher_message(message, res+1); *game = false; } else *game = true; } return 1; default: break; } break; case 2: switch (i) { case 0: *game = true; *tourJ1 = true; menu[0]->on_screen = true; menu[2]->on_screen = false; *page = 0; for (i = 0; i < N_ITEM; i++) items[i]->on_screen = true; new_game(p); return 2; case 1: menu[2]->on_screen = false; menu[3]->on_screen = true; *page = 3; return 1; default: break; } break; case 3: *game = true; *tourJ1 = true; switch (i) { case 0: menu[0]->on_screen = true; menu[3]->on_screen = false; *page = 0; *mode = 1; for (i = 0; i < N_ITEM; i++) items[i]->on_screen = true; new_game(p); return 2; case 1: menu[0]->on_screen = true; menu[3]->on_screen = false; *page = 0; *mode = 2; for (i = 0; i < N_ITEM; i++) items[i]->on_screen = true; new_game(p); return 2; default: break; } break; default: break; } break; } } return true; }