/* Fonction qui retourne 1 s'il existe au moins un coup valide pour un joueur, 0 sinon */ int peut_jouer(matrice M, int joueur) { int i, j; int nb_coups_jouables=0; for (i=0; i<8; i++) { for (j=0; j<8; j++) { nb_coups_jouables+=coup_valide(M, i, j, joueur); } } if (nb_coups_jouables == 0) { return 0; } else return 1; }
matrice partie(matrice M, char *nom, int joueur) { char coup[2]; char *ordi="l\'ordinateur"; int i, j; while ( peut_jouer(M, 1) || peut_jouer(M, 2)) { if (!peut_jouer(M, joueur)) { printf("%s ne peut pas jouer", (joueur==1)?nom:ordi); joueur=changer_joueur(joueur); } else { printf("Au tour de %s : \n", (joueur==1)?nom:ordi); do { affiche_matrice(M); printf("Rentrez un coup :\n"); fscanf(stdin, "%s", coup); if (verif_coup(coup)) { if (verif_coup(coup) == 1) { i=convertir(coup[0]); j=convertir(coup[1]); } else { j=convertir(coup[0]); i=convertir(coup[1]); } } } while (!coup_valide(M, i, j, joueur)); M=changer(M, i, j, joueur); joueur=changer_joueur(joueur); purger(); clear(); } } return M; }
void button_jouer (int *menu, bool *continuer,int clicX, int clicY,int *i, int *nb_tour, int *retour_bouton, int qui_commence,int contre_IA) { static SDL_Rect posPionTemp; static int t,l,j; static int l_bot=0,c_bot=0; int r=15,h=5,s=20; int test=*i; if(clicX >=38 && clicX<=204 && clicY >= 100 && clicY <=135) *menu=5; /*historique*/ else if(clicX >=21 && clicX<=228 && clicY >= 200 && clicY <=235) { save(test); /*Save*/ }else if(clicX >=51 && clicX<=164 && clicY >= 300 && clicY <=327) { *menu = 7; *retour_bouton=1; /*retour*/ } else if(clicX >=47 && clicX<=162 && clicY >= 400 && clicY <=432) *menu = 7; /*quitter*/ else if(clicX >=601 && clicX<=678 && clicY >= 501 && clicY <=519) { /*valider*/ //coup_valide=1; }else if(clicX >=401 && clicX<=455 && clicY >= 501 && clicY <=521) { if (test>0) *i-=1; /*undo*/ } else { l=(clicY-154)/(h+s); t=((clicX-274-(l*r)))/(2*r); if (t >= 0 && t <= 10 && l >= 0 && l <= 10 && coup_valide(test,l,t)) { if (l % 2) posPionTemp.x=274+(t+l/2)*2*r+2*r-11; else posPionTemp.x=274+(t+l/2)*2*r+r-11; posPionTemp.y=154+l*(h+s)+h+(s/2)-11; plateau[test].posPions=posPionTemp; if (!qui_commence) if (test % 2) plateau[test].player=1; else plateau[test].player=0; else if (test % 2) plateau[test].player=0; else plateau[test].player=1; plateau[test].coordinates.ligne=l; plateau[test].coordinates.colonne=t; if (plateau[test].player) if (t == 0) plateau[test].bord=2; else if (t == 10) plateau[test].bord=4; else plateau[test].bord=0; else if (l == 0) plateau[test].bord=1; else if (l == 10 ) plateau[test].bord=3; else plateau[test].bord=0; printf("test =%d\n",test); *i+=1; *nb_tour+=1; if(contre_IA) { if (test == 0) { l_bot =0; c_bot =0; } test=*i; l=l_bot; t=c_bot; if (!qui_commence) if (test % 2) plateau[test].player=1; else plateau[test].player=0; else if (test % 2) plateau[test].player=0; else plateau[test].player=1; if(!coup_valide(test,l,t)) if (!plateau[test].player) { c_bot++; l_bot--; }else { l_bot++; c_bot--; } l=l_bot; t=c_bot; if (t >= 0 && t <= 10 && l >= 0 && l <= 10 && coup_valide(test,l,t)) { printf("normal\n"); if (l % 2) posPionTemp.x=274+(t+l/2)*2*r+2*r-11; else posPionTemp.x=274+(t+l/2)*2*r+r-11; posPionTemp.y=154+l*(h+s)+h+(s/2)-11; plateau[test].posPions=posPionTemp; if (!qui_commence) if (test % 2) plateau[test].player=1; else plateau[test].player=0; else if (test % 2) plateau[test].player=0; else plateau[test].player=1; plateau[test].coordinates.ligne=l; plateau[test].coordinates.colonne=t; if (plateau[test].player) if (t == 0) plateau[test].bord=2; else if (t == 10) plateau[test].bord=4; else plateau[test].bord=0; else if (l == 0) plateau[test].bord=1; else if (l == 10 ) plateau[test].bord=3; else plateau[test].bord=0; if (plateau[test].player) c_bot++; else l_bot++; *i+=1; } } } } }
int main (int argc, char * argv[]) { Coord_SDL clic; s_Menu menu; s_Interface interface; s_Board board; interface = Init(); board = load_Board(interface); menu = load_Menu(interface); SDL_Event event; Plateau board_tab; Coordonnees_tab coord_tab; Couleur joueur_courant = bleu, dernier_joueur = bleu; menu.actualMenu = menu.mainMenu; bool quit = false, premier_coup = true, IA = false; int choix; coord_tab.abscisse = 0; coord_tab.ordonnee = 0; while (!quit) //Boucle des évènements { SDL_WaitEvent(&event); if (IA) if (joueur_courant == rouge) { event.button.button = SDL_BUTTON_LEFT; event.type = SDL_MOUSEBUTTONDOWN; } switch (event.type) { case SDL_QUIT: quit = true; break; case SDL_MOUSEBUTTONDOWN: //On clique sur la souris if (event.button.button == SDL_BUTTON_LEFT) { clic.CoordX = event.motion.x; clic.CoordY = event.motion.y; choix = choix_Menu(clic, menu); /********************* Menus ***********************/ if (menu.actualMenu == menu.mainMenu) //Menu principal { if (choix == 1) { menu.actualMenu = menu.playMenu; MaJ_Menu(menu, interface, nbPlayMenuChoice); } if (choix == 2) { initialiser_plateau(board_tab); chargement(board_tab); MaJ_Board(board, interface, board_tab); menu.actualMenu = menu.inGameMenu; MaJ_Menu(menu, interface, nbinGameMenuChoice); premier_coup = false; } if (choix == 3) { quit = true; } } else if (menu.actualMenu == menu.playMenu) //Menu de sélection de partie { if (choix == 0) { menu.actualMenu = menu.inGameMenu; MaJ_Menu(menu, interface, nbinGameMenuChoice); nouvelle_partie(board_tab); MaJ_Board(board, interface, board_tab); joueur_courant = bleu; premier_coup = true; IA = false; MaJ_Infos(menu, interface, joueur_courant, premier_coup); } if (choix == 1) { menu.actualMenu = menu.inGameMenu; MaJ_Menu(menu, interface, nbinGameMenuChoice); nouvelle_partie(board_tab); MaJ_Board(board, interface, board_tab); joueur_courant = bleu; premier_coup = true; IA = true; MaJ_Infos(menu, interface, joueur_courant, premier_coup); } if (choix == 2) { menu.actualMenu = menu.inGameMenu; MaJ_Menu(menu, interface, nbinGameMenuChoice); nouvelle_partie(board_tab); MaJ_Board(board, interface, board_tab); joueur_courant = bleu; premier_coup = true; IA = true; MaJ_Infos(menu, interface, joueur_courant, premier_coup); } if (choix == 3) { if (premier_coup == true) menu.actualMenu = menu.mainMenu; else menu.actualMenu = menu.inGameMenu; MaJ_Menu(menu, interface, nbMenuChoice); } } else if (menu.actualMenu == menu.inGameMenu) //Menu en jeu { if (choix == 0) { menu.actualMenu = menu.playMenu; MaJ_Menu(menu, interface, nbPlayMenuChoice); } if (choix == 1) { board_save(board_tab); } if (choix == 2) { if (joueur_courant != dernier_joueur) { if (!premier_coup) { annuler(board_tab); MaJ_Board(board, interface, board_tab); MaJ_Infos(menu, interface, joueur_courant, premier_coup); joueur_courant = changer_joueur(joueur_courant); } } } if (choix == 3) { quit = true; } /********************* Tour de jeu *********************/ if (!IA) //Partie humain vs humain { if (clic_on_board(clic, board)) { coord_tab = pos_pion_tab(clic, board); if (coup_valide(board_tab, coord_tab)) { placer_pion(board, coord_tab, joueur_courant, interface, board_tab); if (joueur_courant == bleu) dernier_joueur = bleu; else dernier_joueur = rouge; historique(premier_coup, coord_tab, joueur_courant); premier_coup = false; MaJ_Infos(menu, interface, joueur_courant,premier_coup); if (verify_win(board_tab[coord_tab.abscisse][coord_tab.ordonnee], board_tab)) { affiche_vainqueur(menu, interface, joueur_courant); menu.actualMenu = menu.mainMenu; MaJ_Menu(menu, interface, nbMenuChoice); joueur_courant = neutre; } joueur_courant = changer_joueur(joueur_courant); } } } else if (IA) //Partie humain vs IA { if (joueur_courant == bleu) coord_tab = pos_pion_tab(clic, board); else { coord_tab = coup_IA1 (board_tab); SDL_Delay(500); } if (coup_valide(board_tab, coord_tab)) { placer_pion(board, coord_tab, joueur_courant, interface, board_tab); historique(premier_coup, coord_tab, joueur_courant); premier_coup = false; MaJ_Infos(menu, interface, joueur_courant,premier_coup); if (verify_win(board_tab[coord_tab.abscisse][coord_tab.ordonnee], board_tab)) { affiche_vainqueur(menu, interface, joueur_courant); menu.actualMenu = menu.mainMenu; MaJ_Menu(menu, interface, nbMenuChoice); joueur_courant = neutre; } joueur_courant = changer_joueur(joueur_courant); } } } } break; case SDL_KEYDOWN: switch (event.key.keysym.sym) { case SDLK_ESCAPE: //On appuie sur la touche ECHAP quit = true; break; } break; } //Met à jour l'écran SDL_UpdateWindowSurface(interface.window); } return 0; }