begin process at 2010 03 18 21:39:13
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

.Net

 > MORPION II

MORPION II


 Information sur la source

Note :
6 / 10 - par 1 personne
6,00 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
Catégorie :.Net Niveau :Débutant Date de création :29/06/2002 Date de mise à jour :03/07/2002 20:02:28 Vu / téléchargé :3 563 / 187

Auteur : Cal

Ecrire un message privé
Commentaire sur cette source (8)
Ajouter un commentaire et/ou une note

 Description

MORPION 2 en C

C'est mon deuxieme programme (et deuxième morpion aussi)
Cette fois vous jouez contre l'ordinateur.    

Source

  • //Morpion 2 permet de se mesurer contre l'ordinateur.
  • //Il est aussi plus joli que Morpion 1 (ya pas de mal...)
  • //A chaque nouvelle partie, celui qui à joué en premier joue en 2e.
  • //L'ordinateur deviens plus difficile à battre si le joueur atteint 3 points.
  • //A 5 points, bonne chance...
  • #include <stdio.h>
  • #include <conio.h>
  • #include <stdlib.h>
  • #include <windows.h>
  • #include <time.h>
  • #define MESSAGE_ERREUR { TEXTE(7, 25, 19, "Tu t'es plant\x82 quelque part ! Recommence :"); sleep(1500); }
  • void jeux_morpion(void);
  • void TEXTE(int couleur, int col, int ligne, char* texte);
  • void affiche(int couleur, int col, int ligne, int *tableau);
  • void intro(void);
  • void clear(void);
  • int verif_case(int *pgrille);
  • int verif_vainqueur(int joueur);
  • int coup_aleatoire(void);
  • int coup_secondaire(int joueur, int mode_pas_juste);
  • int coup_angle(void);
  • int coup_central(void);
  • int joueur1(void);
  • int ordinateur(int prems);
  • int grille[3][3] = {0}; //Grille du morpion
  • int cases[3][3] = {0, 1, 2, 3, 4, 5, 6, 7, 8}; //Pour faire son choix...
  • int *pgrille = &grille; //Pointeur pour selectionner la case choisie par le joueur
  • int *pcases = &cases; //Pointeur pour afficher le tableau "cases"
  • int rejouer; //Pour les nouvelles parties
  • int ok = 0; //Flag pour erreur
  • int v = 0; //Vainqueur
  • int x; //Selection du joueur
  • int c; //Compteur de coups
  • int score1 = 0;
  • int score2 = 0;
  • char selection;
  • int main()
  • {
  • jeux_morpion();
  • return 0;
  • }
  • void jeux_morpion(void)
  • {
  • int i, j;
  • int k = 0; //compteur de parties
  • //Ecran de presentation
  • intro();
  • TEXTE(7, 60, 19, "Par Cal");
  • TEXTE(8, 1, 24, "Entr\x82 \be pour jouer");
  • getch();
  • clrscr();
  • //Ecran de jeu
  • while(getchar() != '\n');
  • TEXTE(4, 32, 2, "MORPION II");
  • TEXTE(2, 4, 24, "Ton score : 0");
  • TEXTE(12, 51, 24, "Score de l'ordinateur : 0");
  • TEXTE(8, 4, 9, "Cases :");
  • affiche(8, 4, 11, pcases);
  • start :
  • rejouer = 0;
  • v = 0;
  • k++;
  • if(score1 >= 5)
  • TEXTE(4, 25, 5, "Mode \"c'est pas juste\" activ\x82...");
  • //Re-initialisation de la grille pour les nouvelles parties
  • for(i = 0; i < 3; i++)
  • {
  • for(j = 0; j <3; j++)
  • grille[i][j] = 0;
  • }
  • //Affichage de la grille
  • TEXTE(7, 32, 9, "Grille :");
  • affiche(7, 32, 11, pgrille);
  • //La partie peut commencer
  • //Si les 9 coups n'ont pas été joués (en fait ça s'arrete au 8e,
  • //mais si un joueur arrive au 9e coup, c'est un match nul)
  • for(c = 1; c < 9; c += 2)
  • {
  • if(!(k%2)) //Pour que l'ordinateur commence toutes les 2 parties
  • {
  • ordinateur(1);
  • if(rejouer)
  • goto start;
  • joueur1();
  • if(rejouer)
  • goto start;
  • }
  • else
  • {
  • joueur1();
  • if(rejouer)
  • goto start;
  • ordinateur(0);
  • if(rejouer)
  • goto start;
  • }
  • }
  • //Personne n'a gagné
  • while(getchar() != '\n');
  • clear();
  • TEXTE(7, 25, 19, "Match nul ! ");
  • TEXTE(7, 25, 20, "Une autre partie ? (o/n) :");
  • if((selection = getch()) == 'o')
  • {
  • while(getchar() != 'o');
  • goto start;
  • }
  • else
  • exit(0);
  • return;
  • } //Fin de jeu_morpion
  • //Affiche un tableau[3][3] (cases[3][3] ou grille[3][3] donc)
  • void affiche(int couleur, int col, int ligne, int *tableau)
  • {
  • int i, j;
  • int t = 0;
  • for(j = 0; j < 3; j++)
  • {
  • for(i = 0; i < 3; t++, i++)
  • {
  • tableau += t;
  • textcolor(couleur);
  • if((*tableau) && ((tableau) != (++pcases))) //Met de la couleur seulement sur grille[3][3]
  • (*tableau == 1) ? textcolor(2) : textcolor(12); //1 en vert, 2 en rouge et 0 en blanc
  • gotoxy(col + (i*5), ligne + (j*2)); //Place le curçeur au bon endroit
  • printf("%d", *tableau); //Affiche les chiffres
  • tableau -= t;
  • }
  • }
  • return;
  • }
  • //Pour vérifier si la case n'est pas déjà prise
  • int verif_case(int *pgrille)
  • {
  • if(*pgrille)
  • {
  • clear();
  • TEXTE(7, 25, 20, "Case d\x82j\x85 prise ! ");
  • sleep(1500);
  • ok = 0;
  • }
  • else
  • ok = 1;
  • return ok;
  • }
  • //Vérifie si chaque ligne ou chaque diagonale est égale à 3 ou 6 suivant le numero du joueur
  • //Mais il ne faut pas de 0 car 1 + 2 + 0 = 3
  • int verif_vainqueur(int joueur)
  • {
  • int s, t, u;
  • //Lignes
  • for(s = 0, t = 1, u = 2 ; u <= 8; s += 3, t += 3, u += 3) {
  • if((pgrille[s] && pgrille[t] && pgrille[u]) && (pgrille[s] + pgrille[t] + pgrille[u] == 3*joueur))
  • v = 1;
  • }
  • //Colones
  • for(s = 0, t = 3, u = 6; u <= 8; s++, t++, u++) {
  • if((pgrille[s] && pgrille[t] && pgrille[u]) && (pgrille[s] + pgrille[t] + pgrille[u] == 3*joueur))
  • v = 1;
  • }
  • //Diagonnales
  • for(s = 0, t = 4, u = 8; s <= 2; s += 2, u -=2) {
  • if((pgrille[s] && pgrille[t] && pgrille[u]) && (pgrille[s] + pgrille[t] + pgrille[u] == 3*joueur))
  • v = 1;
  • }
  • return v;
  • }
  • //L'ordinateur joue une case aléatoire (pour varier les parties)
  • int coup_aleatoire(void)
  • {
  • int r;
  • ok = 0;
  • do
  • {
  • srand((unsigned) time(NULL));
  • r = rand() % 8;
  • if(!pgrille[r])
  • {
  • pgrille[r] = 2;
  • ok = 1;
  • }
  • }
  • while(!ok);
  • sleep(500); //L'ordinateur réflechit...
  • return ok;
  • }
  • //L'ordinateur vérifie si le joueur ou lui peut gagner et agit en consequence
  • int coup_secondaire(int joueur, int mode_pas_juste)
  • {
  • int s, t, u;
  • ok = 0;
  • //La fonction vérifie si une ligne est égale à 2 ou 4 selon le joueur concerné
  • //et en faisant attention à ne pas confondre 1 + 1 + 0 et 2 + 0 + 0.
  • //Vérifie les lignes
  • for(s = 0, t = 1, u = 2; u <= 8; s += 3, t += 3, u += 3)
  • {
  • if(((pgrille[s] + pgrille[t] + pgrille[u]) == (2*joueur)) &&
  • (pgrille[s] != 2*joueur) &&
  • (pgrille[t] != 2*joueur) &&
  • (pgrille[u] != 2*joueur))
  • {
  • if(mode_pas_juste) { //Si le mode "c'est pas juste" est activé,
  • ok = 1; //Il n'y a pas de vérification, donc l'ordi joue 2 cases...
  • if(!pgrille[s])
  • pgrille[s] = 2;
  • else if(!pgrille[t])
  • pgrille[t] = 2;
  • else if(!pgrille[u])
  • pgrille[u] = 2;
  • else
  • ok = 0;
  • }
  • else if(!ok) {
  • ok = 1;
  • if(!pgrille[s])
  • pgrille[s] = 2;
  • else if(!pgrille[t])
  • pgrille[t] = 2;
  • else if(!pgrille[u])
  • pgrille[u] = 2;
  • else
  • ok = 0;
  • }
  • }
  • }
  • //Vérifie les colonnes
  • for(s = 0, t = 3, u = 6; u <= 8; s++, t++, u++)
  • {
  • if((pgrille[s] + pgrille[t] + pgrille[u] == 2*joueur) &&
  • (pgrille[s] != 2*joueur) &&
  • (pgrille[t] != 2*joueur) &&
  • (pgrille[u] != 2*joueur))
  • {
  • if(mode_pas_juste) {
  • ok = 1;
  • if(!pgrille[s])
  • pgrille[s] = 2;
  • else if(!pgrille[t])
  • pgrille[t] = 2;
  • else if(!pgrille[u])
  • pgrille[u] = 2;
  • else
  • ok = 0;
  • }
  • else if(!ok) {
  • ok = 1;
  • if(!pgrille[s])
  • pgrille[s] = 2;
  • else if(!pgrille[t])
  • pgrille[t] = 2;
  • else if(!pgrille[u])
  • pgrille[u] = 2;
  • else
  • ok = 0;
  • }
  • }
  • }
  • //Vérifie les diagonnales
  • for(s = 0, t = 4, u = 8; s <= 2; s += 2, u -=2)
  • {
  • if((pgrille[s] + pgrille[t] + pgrille[u] == 2*joueur) &&
  • (pgrille[s] != 2*joueur) &&
  • (pgrille[t] != 2*joueur) &&
  • (pgrille[u] != 2*joueur))
  • {
  • if(mode_pas_juste) {
  • ok = 1;
  • if(!pgrille[s])
  • pgrille[s] = 2;
  • else if(!pgrille[t])
  • pgrille[t] = 2;
  • else if(!pgrille[u])
  • pgrille[u] = 2;
  • else
  • ok = 0;
  • }
  • else if(!ok) {
  • ok = 1;
  • if(!pgrille[s])
  • pgrille[s] = 2;
  • else if(!pgrille[t])
  • pgrille[t] = 2;
  • else if(!pgrille[u])
  • pgrille[u] = 2;
  • else
  • ok = 0;
  • }
  • }
  • }
  • sleep(1000);
  • return ok;
  • }
  • //L'ordinateur joue l'un des 4 coins au hasard
  • int coup_angle(void)
  • {
  • int r;
  • ok = 0;
  • do
  • {
  • do
  • {
  • srand((unsigned) time (NULL));
  • r = rand() % 9;
  • }
  • while(!(r == 0 || r == 2 || r == 6 || r == 8));
  • if(!pgrille[r])
  • {
  • pgrille[r] = 2;
  • ok = 1;
  • }
  • }
  • while(!ok);
  • sleep(500);
  • return ok;
  • }
  • //L'ordinateur joue la case du milleu
  • int coup_central(void)
  • {
  • ok = 0;
  • pgrille += 4;
  • if(!*pgrille)
  • {
  • *pgrille = 2;
  • ok = 1;
  • }
  • pgrille -= 4;
  • sleep(400);
  • return ok;
  • }
  • //Les coups du joueur hummain
  • int joueur1(void)
  • {
  • int col, ligne;
  • do
  • {
  • clear();
  • TEXTE(7, 25, 19, "Tape ta case : ");
  • scanf("%d",&x);
  • if ((x >= 0) && (x <= 8)) //Si le joueur n'a pas fait d'erreur
  • {
  • pgrille += x; //Positionnement dans la case du tableau choisie
  • verif_case(pgrille);
  • if(ok) //Assigne la valeur 1 si la case n'est pas déjà prise
  • *pgrille = 1;
  • pgrille -= x; //Reviens au debut du tableau
  • }
  • else
  • {
  • MESSAGE_ERREUR
  • ok = 0;
  • }
  • }
  • while (!ok);
  • affiche(7, 32, 11, pgrille);
  • verif_vainqueur(1);
  • if(v) //Si le joueur a gagné
  • {
  • while(getchar() != '\n');
  • score1++;
  • clear();
  • TEXTE(2, 25, 19, "Bravo, tu as gagn\x82 !");
  • gotoxy(16, 24);
  • printf("%d", score1);
  • TEXTE(7, 25, 20, "Une autre partie ? (o/n) :");
  • if((selection = getch()) == 'o')
  • {
  • while(getchar() != 'o');
  • rejouer = 1;
  • }
  • else
  • exit(0);
  • }
  • return rejouer;
  • }
  • //Les coups de l'ordinateur
  • int ordinateur(int prems) //prems = l'ordinateur joue le premier
  • {
  • int m = 0; //Mode "c'est pas juste"
  • ok = 0;
  • if(score1 >= 5)
  • m = 1;
  • if(prems) {
  • if(c == 1 || c == 3)
  • coup_angle();
  • if(!ok)
  • coup_secondaire(2, m);
  • if(!ok)
  • coup_secondaire(1, m);
  • if(!ok)
  • coup_angle();
  • if(!ok)
  • coup_aleatoire();
  • }
  • else {
  • if(!ok && score1 >= 3 && c == 1) //ça deviens plus dur si le score1 est superieur à 3
  • coup_central();
  • if(!ok && c == 1)
  • coup_aleatoire();
  • if(!ok)
  • coup_secondaire(2, m);
  • if(!ok)
  • coup_secondaire(1, m);
  • if(!ok)
  • coup_aleatoire();
  • }
  • affiche(7, 32, 11, pgrille);
  • verif_vainqueur(2);
  • if(v) {
  • while(getchar() != '\n');
  • score2++;
  • clear();
  • TEXTE(12, 25, 19, "L'ordinateur \x85 gagn\x82 !");
  • gotoxy(75, 24);
  • printf("%d", score2);
  • TEXTE(7, 25, 20, "Une autre partie ? (o/n) :");
  • if((selection = getch()) == 'o') {
  • while(getchar() != 'o');
  • rejouer = 1;
  • }
  • else
  • exit(0);
  • }
  • return rejouer;
  • }
  • //Jolie intro
  • void intro(void)
  • {
  • int l, m, n, o;
  • sleep(500); //Faut bien prendre le temps d'admirer mon intro ;-)
  • for(l = n = 19, m = 1, o = 56; l >= 10 ; l--, m++, n--, o++)
  • {
  • clrscr();
  • TEXTE(m, l, 11, "|\\ /| __ ___ ___ * ___ | |");
  • TEXTE(m, m, 12, "| \\ / | | | |___| |___| | | | |\\ | | |");
  • TEXTE(m, n, 13, "| | |__| | \\ | | |___| | \\| _|___|_");
  • TEXTE(m, o, 10, "_______");
  • sleep(100);
  • }
  • return;
  • }
  • //Fonction pratique (merci cmarsc)
  • void TEXTE(int couleur, int col, int ligne, char* texte)
  • {
  • textcolor(couleur);
  • gotoxy(col, ligne);
  • printf("%s", texte);
  • return;
  • }
  • //Efface une partie de l'écran où se trouvent les messages
  • void clear(void)
  • {
  • int x, y;
  • for(y = 19; y <=20; y++)
  • {
  • for(x = 25; x <= 70; x++)
  • TEXTE(0, x, y, " ");
  • }
  • return ;
  • }
//Morpion 2 permet de se mesurer contre l'ordinateur.
//Il est aussi plus joli que Morpion 1 (ya pas de mal...)
//A chaque nouvelle partie, celui qui à joué en premier joue en 2e.
//L'ordinateur deviens plus difficile à battre si le joueur atteint 3 points.
//A 5 points, bonne chance...


#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <windows.h>
#include <time.h>

#define MESSAGE_ERREUR { TEXTE(7, 25, 19, "Tu t'es plant\x82 quelque part ! Recommence :"); sleep(1500); }

void jeux_morpion(void);
void TEXTE(int couleur, int col, int ligne, char* texte);
void affiche(int couleur, int col, int ligne, int *tableau);
void intro(void);
void clear(void);

int verif_case(int *pgrille);
int verif_vainqueur(int joueur);

int coup_aleatoire(void);
int coup_secondaire(int joueur, int mode_pas_juste);
int coup_angle(void);
int coup_central(void);
int joueur1(void);
int ordinateur(int prems);

int grille[3][3] = {0}; //Grille du morpion
int cases[3][3] = {0, 1, 2, 3, 4, 5, 6, 7, 8};     //Pour faire son choix...
int *pgrille = &grille; //Pointeur pour selectionner la case choisie par le joueur
int *pcases = &cases;   //Pointeur pour afficher le tableau "cases"
int rejouer;            //Pour les nouvelles parties
int ok = 0;             //Flag pour erreur
int v = 0;              //Vainqueur
int x;                  //Selection du joueur
int c;                  //Compteur de coups
int score1 = 0;
int score2 = 0;
char selection;



int main()
{
	jeux_morpion();
return 0;
}



void jeux_morpion(void)
{
    int i, j;
	int k = 0;  //compteur de parties

//Ecran de presentation
	intro();
	TEXTE(7, 60, 19, "Par Cal");
	TEXTE(8, 1, 24, "Entr\x82 \be pour jouer");
	getch();
	clrscr();

//Ecran de jeu
	while(getchar() != '\n');
	TEXTE(4, 32, 2, "MORPION II");
	TEXTE(2, 4, 24, "Ton score : 0");
	TEXTE(12, 51, 24, "Score de l'ordinateur : 0");
	TEXTE(8, 4, 9, "Cases :");
	affiche(8, 4, 11, pcases);


start :
	rejouer = 0;
	v = 0;
    k++;

	if(score1 >= 5)
		TEXTE(4, 25, 5, "Mode \"c'est pas juste\" activ\x82...");


//Re-initialisation de la grille pour les nouvelles parties
	for(i = 0; i < 3; i++)
       {
	    for(j = 0; j <3; j++)
			grille[i][j] = 0;
	   }
//Affichage de la grille
    TEXTE(7, 32, 9, "Grille :");
	affiche(7, 32, 11, pgrille);

//La partie peut commencer

//Si les 9 coups n'ont pas été joués (en fait ça s'arrete au 8e,
//mais si un joueur arrive au 9e coup, c'est un match nul)
	for(c = 1; c < 9; c += 2)
		{
	    if(!(k%2))  //Pour que l'ordinateur commence toutes les 2 parties
			{
			ordinateur(1);
		    if(rejouer)
		    	goto start;

		    joueur1();
		    if(rejouer)
			    goto start;
		    }
		else
			{
			joueur1();
			if(rejouer)
				goto start;

        	ordinateur(0);
			if(rejouer)
		    	goto start;
			}
	    }
//Personne n'a gagné
	while(getchar() != '\n');
	clear();
	TEXTE(7, 25, 19, "Match nul !         ");
    TEXTE(7, 25, 20, "Une autre partie ? (o/n) :");
       	if((selection = getch()) == 'o')
			{
    		while(getchar() != 'o');
            goto start;
			}
		else
		    exit(0);

return;
} //Fin de jeu_morpion



//Affiche un tableau[3][3] (cases[3][3] ou grille[3][3] donc)
void affiche(int couleur, int col, int ligne, int *tableau)
{
	int i, j;
    int t = 0;

	for(j = 0; j < 3; j++)
 		{
		for(i = 0; i < 3; t++, i++)
			{
			tableau += t;
			textcolor(couleur);
			if((*tableau) && ((tableau) != (++pcases))) //Met de la couleur seulement sur grille[3][3]
		    	(*tableau == 1) ? textcolor(2) : textcolor(12); //1 en vert, 2 en rouge et 0 en blanc
			gotoxy(col + (i*5), ligne + (j*2));  //Place le curçeur au bon endroit
			printf("%d", *tableau);   //Affiche les chiffres
			tableau -= t;
    		}
		}

return;
}



//Pour vérifier si la case n'est pas déjà prise
int verif_case(int *pgrille)
{

	if(*pgrille)
		{
		clear();
		TEXTE(7, 25, 20, "Case d\x82j\x85 prise !   ");
		sleep(1500);
	    ok = 0;
		}
	else
	    ok = 1;
return ok;
}



//Vérifie si chaque ligne ou chaque diagonale est égale à 3 ou 6 suivant le numero du joueur
//Mais il ne faut pas de 0 car 1 + 2 + 0 = 3
int verif_vainqueur(int joueur)
{
	int s, t, u;

//Lignes
	for(s = 0, t = 1, u = 2 ; u <= 8; s += 3, t += 3, u += 3) {
		if((pgrille[s] && pgrille[t] && pgrille[u]) && (pgrille[s] + pgrille[t] + pgrille[u] == 3*joueur))
        	v = 1;
	    }

//Colones
	for(s = 0, t = 3, u = 6; u <= 8; s++, t++, u++) {
		if((pgrille[s] && pgrille[t] && pgrille[u]) && (pgrille[s] + pgrille[t] + pgrille[u] == 3*joueur))
        	v = 1;
		}

//Diagonnales
	for(s = 0, t = 4, u = 8;  s <= 2;  s += 2, u -=2) {
		if((pgrille[s] && pgrille[t] && pgrille[u]) && (pgrille[s] + pgrille[t] + pgrille[u] == 3*joueur))
        	v = 1;
		}

return v;
}



//L'ordinateur joue une case aléatoire (pour varier les parties)
int coup_aleatoire(void)
{
	int r;
	ok = 0;

	do
	   {
		srand((unsigned) time(NULL));
		r = rand() % 8;

		if(!pgrille[r])
		   {
			pgrille[r] = 2;
			ok = 1;
		   }

	   }
     while(!ok);

	 sleep(500);  //L'ordinateur réflechit...

return ok;
}



//L'ordinateur vérifie si le joueur ou lui peut gagner et agit en consequence
int coup_secondaire(int joueur, int mode_pas_juste)
{
	int s, t, u;

	ok = 0;

//La fonction vérifie si une ligne est égale à 2 ou 4 selon le joueur concerné
//et en faisant attention à ne pas confondre 1 + 1 + 0 et 2 + 0 + 0.

//Vérifie les lignes
	for(s = 0, t = 1, u = 2;  u <= 8;  s += 3, t += 3, u += 3)
		{
		if(((pgrille[s] + pgrille[t] + pgrille[u]) == (2*joueur)) &&
	       (pgrille[s] != 2*joueur) &&
       	   (pgrille[t] != 2*joueur) &&
       	   (pgrille[u] != 2*joueur))
	   	 	{
	   	  	if(mode_pas_juste) {    //Si le mode "c'est pas juste" est activé,
				ok = 1;             //Il n'y a pas de vérification, donc l'ordi joue 2 cases...
		    	if(!pgrille[s])
	   	   			pgrille[s] = 2;
				else if(!pgrille[t])
					pgrille[t] = 2;
	   	    	else if(!pgrille[u])
				 	pgrille[u] = 2;
				else
						ok = 0;
					}

			else if(!ok) {
				ok = 1;
		    	if(!pgrille[s])
	   	   			pgrille[s] = 2;
				else if(!pgrille[t])
					pgrille[t] = 2;
	   	    	else if(!pgrille[u])
				 	pgrille[u] = 2;
				else
					ok = 0;
					}
	   	    }
		}

//Vérifie les colonnes
	for(s = 0, t = 3, u = 6;  u <= 8;  s++, t++, u++)
		{
		if((pgrille[s] + pgrille[t] + pgrille[u] == 2*joueur) &&
	       (pgrille[s] != 2*joueur) &&
       	   (pgrille[t] != 2*joueur) &&
       	   (pgrille[u] != 2*joueur))
	   	 	{
	   	  	if(mode_pas_juste) {
				ok = 1;
		    	if(!pgrille[s])
	   	   			pgrille[s] = 2;
				else if(!pgrille[t])
					pgrille[t] = 2;
	   	    	else if(!pgrille[u])
				 	pgrille[u] = 2;
				else
						ok = 0;
					}

			else if(!ok) {
				ok = 1;
		    	if(!pgrille[s])
	   	   			pgrille[s] = 2;
				else if(!pgrille[t])
					pgrille[t] = 2;
	   	    	else if(!pgrille[u])
				 	pgrille[u] = 2;
				else
					ok = 0;
					}
	   	    }
		}

//Vérifie les diagonnales
	for(s = 0, t = 4, u = 8;  s <= 2;  s += 2, u -=2)
		{
		if((pgrille[s] + pgrille[t] + pgrille[u] == 2*joueur) &&
		   (pgrille[s] != 2*joueur) &&
 	       (pgrille[t] != 2*joueur) &&
		   (pgrille[u] != 2*joueur))
		    {
		    if(mode_pas_juste) {
				ok = 1;
		    	if(!pgrille[s])
	   	   			pgrille[s] = 2;
				else if(!pgrille[t])
					pgrille[t] = 2;
	   	    	else if(!pgrille[u])
				 	pgrille[u] = 2;
				else
						ok = 0;
					}

			else if(!ok) {
				ok = 1;
		    	if(!pgrille[s])
	   	   			pgrille[s] = 2;
				else if(!pgrille[t])
					pgrille[t] = 2;
	   	    	else if(!pgrille[u])
				 	pgrille[u] = 2;
				else
					ok = 0;
					}
	   	    }
		}
	sleep(1000);

return ok;
}



//L'ordinateur joue l'un des 4 coins au hasard
int coup_angle(void)
{
	int r;
	ok = 0;

	do
		{
		do
			{
			srand((unsigned) time (NULL));
			r = rand() % 9;
		    }
		while(!(r == 0 || r == 2 || r == 6 || r == 8));

		if(!pgrille[r])
			{
			pgrille[r] = 2;
			ok = 1;
			}
		}
	while(!ok);

	sleep(500);

return ok;
}



//L'ordinateur joue la case du milleu
int coup_central(void)
{
	ok = 0;

	pgrille += 4;
	if(!*pgrille)
		{
		*pgrille = 2;
		ok = 1;
	    }
    pgrille -= 4;

	sleep(400);

return ok;
}



//Les coups du joueur hummain
int joueur1(void)
{
    int col, ligne;

	do
	   {
	    clear();
		TEXTE(7, 25, 19, "Tape ta case  : ");
	   	scanf("%d",&x);


		if ((x >= 0) && (x <= 8))     //Si le joueur n'a pas fait d'erreur
   	   	   {
   	        pgrille += x;             //Positionnement dans la case du tableau choisie
			verif_case(pgrille);
		    	if(ok)                //Assigne la valeur 1 si la case n'est pas déjà prise
			    	*pgrille = 1;
				pgrille -= x;         //Reviens au debut du tableau
		   }
  		else
			{
			MESSAGE_ERREUR
		    ok = 0;
			}
	    }
	 while (!ok);

	 affiche(7, 32, 11, pgrille);
     verif_vainqueur(1);
	 if(v) //Si le joueur a gagné
			     {
				 while(getchar() != '\n');
			     score1++;
			     clear();
				 TEXTE(2, 25, 19, "Bravo, tu as gagn\x82 !");
				 gotoxy(16, 24);
				 printf("%d", score1);
				 TEXTE(7, 25, 20, "Une autre partie ? (o/n) :");
			 	 	 if((selection = getch()) == 'o')
        				 {
						 while(getchar() != 'o');
                         rejouer = 1;
					     }
					 else
					     exit(0);
				}

return rejouer;
}



//Les coups de l'ordinateur
int ordinateur(int prems)   //prems = l'ordinateur joue le premier
{
	int m = 0;  //Mode "c'est pas juste"

	ok = 0;

	if(score1 >= 5)
	    m = 1;

		if(prems) {
			if(c == 1 || c == 3)
				coup_angle();
			if(!ok)
				coup_secondaire(2, m);
			if(!ok)
				coup_secondaire(1, m);
			if(!ok)
				coup_angle();
			if(!ok)
				coup_aleatoire();
			}
		else  {
	    	if(!ok && score1 >= 3 && c == 1) //ça deviens plus dur si le score1 est superieur à 3
				coup_central();
			if(!ok && c == 1)
				coup_aleatoire();
			if(!ok)
				coup_secondaire(2, m);
    	    if(!ok)
			    coup_secondaire(1, m);
			if(!ok)
				coup_aleatoire();
			}

		affiche(7, 32, 11, pgrille);
        verif_vainqueur(2);
		if(v) {
			while(getchar() != '\n');
			score2++;
		    clear();
			TEXTE(12, 25, 19, "L'ordinateur \x85 gagn\x82 !");
			gotoxy(75, 24);
			printf("%d", score2);
			TEXTE(7, 25, 20, "Une autre partie ? (o/n) :");
			   	 if((selection = getch()) == 'o') {
					 while(getchar() != 'o');
                     rejouer = 1;
				     }
				 else
				     exit(0);
			}

return rejouer;
}



//Jolie intro
void intro(void)
{
    int l, m, n, o;

	sleep(500); //Faut bien prendre le temps d'admirer mon intro ;-)

    for(l = n = 19, m = 1, o = 56; l >= 10 ; l--, m++, n--, o++)
    	{
		clrscr();
		TEXTE(m, l, 11, "|\\     /|   __    ___     ___   *    ___                |   |");
        TEXTE(m, m, 12, "|  \\ /  |  |  |  |___|   |___|  |   |   |   |\\  |       |   |");
		TEXTE(m, n, 13, "|       |  |__|  |    \\  |      |   |___|   |  \\|      _|___|_");
		TEXTE(m, o, 10, "_______");
		sleep(100);
        }

return;
}


//Fonction pratique (merci cmarsc)
void TEXTE(int couleur, int col, int ligne, char* texte)
{
	textcolor(couleur);
	gotoxy(col, ligne);
	printf("%s", texte);

return;
}


//Efface une partie de l'écran où se trouvent les messages
void clear(void)
{
	int x, y;

	for(y = 19; y <=20; y++)
		{
		for(x = 25; x <= 70; x++)
			TEXTE(0, x, y, " ");
		}

return ;
}

 Conclusion

La mise en forme est pas térible ici, téléchargez le zip pour voir la source plus clairement

J'ai développé ce programme avec LCC Win32.

Si vous avez des remmarques, des conseils ou des idées pour améliorer ce programme,
n'ésitez pas.
    

 Fichier Zip

Les Membres Club peuvent télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !
  • Morpion 2.CTélécharger ce fichier [Réservé aux membres club]Voir ce fichier11 809 octets
  • Morpion 2.exeTélécharger ce fichier [Réservé aux membres club]34 932 octets

Télécharger le zip


 Sources du même auteur

Source avec Zip MORPION EN C

 Sources de la même categorie

Source avec Zip Source avec une capture MAP_MAKER_JEU par seekplus
Source avec Zip Source avec une capture Source .NET (Dotnet) EMISSION D'UN OCTET SUR LE PORT SÉRIE - CLASSE SERIALPORT par jmchatelet01
Source avec Zip Source .NET (Dotnet) RESOLV EQU DE DEGRES N par darckangel731
Source avec Zip Source avec une capture Source .NET (Dotnet) INTEROP XCHAT / .NET : CHARGEUR DE PLUGINS MANAGÉS par TeBeCo
Source avec Zip Source avec une capture Source .NET (Dotnet) SCANNER D'ADRESSES MAILS PRÉSENTENT SUR GOOGLE par Zaltez

Commentaires et avis

Commentaire de kjus le 01/07/2002 00:30:03

pas mal.
mais il y a quelques bugs :
- quand je met une mauvaise case (comme -1), il detecte une erreur (tu t'es planté...) mais il ne me laisse pas jouer.
- a un moment donné j'ai eu un gros bug d'affichage (le morpion affiché ne correspondait pas a la réalité), mais je n'arrive pas a le reproduire.
- de plus, fait des clrsrc() après l'affichage de tes messages paske ya des restes sur l'écran..

Commentaire de Cal le 01/07/2002 00:37:24

ok merci, je vais assayer d'arranger ça.

Commentaire de Cal le 01/07/2002 15:39:40

Voilà, j'ai réglé le problème d'affichage, tout con en fait il ne fallait pas réafficher la grille quand une case est prise.
J'ai aussi rajoutté une fonction pour éffacer les messages, on voit le curceur qui se déplace mais c'est pas génant (en fait ça donne un effet sympas)
J'ai aussi amélioré la fonction coup_secondaire : plus compacte (3 blocs au lieu de 7)
Je ne trouve plus de bug, alors si vous en trouvez un n'esitez pas

Commentaire de kjus le 01/07/2002 15:59:42

c mieux g pas vu de bug
sinon, meme après 3 points, il perd face a la technique suivante :
je joue case 1
&gt;&gt; il joue milieu
je joue case 8
&gt;&gt; il joue 7
je joue case 2 et la il a perdu.
(ca marche ds tous les sens)

Commentaire de Cal le 01/07/2002 16:08:12

hum,

Je vais rendre l'ordi plus coriace si tu atteint 5 point

Commentaire de Cal le 03/07/2002 20:08:18

Voilà, j'ai rajoutté un niveau 3, je te laisse le découvrir (à partir de 5 pts).
J'ai pas testé, il y à peut être de nouveaux bugs.

Commentaire de kjus le 04/07/2002 10:52:38

j'ai pris connaissance du niveau 3 (c'est pas juste)

tout d'abord, je pense que c'est peut-etrep lus naturel de numéroté les cases de 1 à 9 (pour les humains..)
aussi, lorsque qu'a "voulez-vous continuer", l'on répond avec un O en majuscule, le programme quitte.

et en mode c'est pas juste, lorsqu'on arrive a lui tendre un piège, il joue deux cases !!
donc impossible de gagner... (et le pc fait tjrs la meme technique facile a déjouer)

enfin, je pense que le temps de sleep pourrait etre raccourci.
apparemment il n'y a pas de nouveau bug..

Commentaire de jipe32 le 09/12/2005 22:18:51

moi aussi je pense que ne numéroter les cases de 1 à 9 serait pas mal

 Ajouter un commentaire




Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Mars 2010
LMMJVSD
1234567
891011121314
15161718192021
22232425262728
293031    

Consulter la suite du CalendriCode

Photothèque

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,874 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales