begin process at 2012 05 29 05:54:45
  Trouver un code source :
 
dans
 
Accueil > Forum > 

Archive C/C++

 > 

Archives

 > 

Maths & Algorithmes

 > 

faite svp ce puissance 4 un peu spécial il est super compliké pr moi ki est novice en programmation si qql me donne un code en c++kii marche alors chapeau pcq c pa évident


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

faite svp ce puissance 4 un peu spécial il est super compliké pr moi ki est novice en programmation si qql me donne un code en c++kii marche alors chapeau pcq c pa évident

jeudi 1 décembre 2005 à 13:14:57 | faite svp ce puissance 4 un peu spécial il est super compliké pr moi ki est novice en programmation si qql me donne un code en c++kii marche alors chapeau pcq c pa évident

qsdfgh

Soit une matrice 7×7 d’entiers, initialisée à 0. On vous demande de gérer un jeu de puissance 4 dans
cette matrice : à tour de rôle, les joueurs entrent un numéro de colonne entre 1 et 7, et un pion (symbolisé
par le numéro du joueur) est placé à la dernière position libre, i.e. celle d’indice le plus élevé, de la colonne
choisie (si cette colonne est déjà remplie, un message d’erreur doit signaler au joueur qu’un autre numéro
est attendu). Le jeu s’achève quand un joueur aligne 4 pions portant son numéro, ou quand la grille est
complètement remplie.
Votre programme doit d’une part gérer la partie, et d’autre part gérer l’intelligence artificielle d’un des
joueurs au moyen des règles suivantes :
– si un coup lui assure la victoire, ce coup (coup gagnant) est effectué :
1 0 0 0 0 0 0 0
2 0 0 0 0 0 0 0
3 0 0 0 0 0 0 0
4 0 0 0 0 0 0 0
5 0 0 0 0 0 0 0
6 1 0 0 2 2 2 0
7 1 2 1 2 1 1 1
1 2 3 4 5 6 7
dans ce cas, l’ordinateur (joueur 2) placera son pion dans la colonne d’indice 3, ce coup le faisant
gagner ;
– si un coup donne à l’adversaire un coup gagnant, ce coup (coup perdant) n’est pas effectué, dans la
mesure du possible :
1 0 0 0 0 0 0 0
2 0 0 0 0 0 0 0
3 0 0 0 0 0 0 0
4 0 0 0 0 0 0 0
5 0 0 0 0 0 0 0
6 0 0 0 1 1 1 0
7 2 1 0 2 1 2 2
1 2 3 4 5 6 7
dans ce cas, l’ordinateur (joueur 2) ne placera pas son pion en colonne 3, puisque ce coup permettrait
au joueur 1 de gagner (en plaçant son pion en colonne 3) ;
– si un coup oblige l’adversaire à jouer un coup perdant, ce coup est effectué.
1 0 0 0 0 0 0 0
2 0 0 0 0 0 0 0
3 0 0 0 0 0 0 0
4 0 0 0 0 0 0 0
5 0 0 0 0 0 0 0
6 0 0 0 2 2 0 0
7 1 1 2 1 1 2 1
1 2 3 4 5 6 7 1

dans ce cas, l’odinateur (joueur 2) placera son pion en colonne 3 puisque, quel que soit le coup
suivant du joueur 1, ce coup sera perdant.
Si ces règles n’ont pas permis à l’ordinateur de déterminer un coup à jouer, celui-ci devra le tirer au sort
parmi les coups possibles (voir ci-dessous pour la génération de nombres aléatoires). Nous vous conseillons
d’écrire une fonction pour chacune de ces règles, et à minimiser la duplication de code. Vous pouvez utiliser
des vecteurs de travail, à condition de justifier leur utilité de façon convaincante.
Nombres aléatoires La génération de nombres aléatoires en C++ peut se faire au moyen de la fonction
int rand() qui renvoie un entier aléatoire compris entre 0 et RAND_MAX (une constante définie dans le
fichier stdlib.h que vous devez inclure au début de votre programme). Pour que rand() donne des
résultats plus réalistes, il convient d’initialiser la suite des nombres aléatoires en début de programme, au
moyen de la fonction void srand(int), à laquelle on fournit un entier arbitraire. Cet entier arbitraire est
en général extrait de l’horloge de la machine en appelant srand(time(NULL)) par exemple (pour ce faire,
vous devez aussi inclure time.h). Voici un exemple de programme qui affiche un nombre compris en 1 et
10 inclus.
#include <iostream>
#include <stdlib.h>
#include <time.h>
using namespace std ;
int main ()
{
int j ;
/* initialisation des nombres aléatoires */
srand ( time(NULL) ) ;
/* On fait appel à rand, puis on normalise le résultat
pour obtenir un nombre dans [1,..., 10] */
j = 1 + (int) (10.0 * (rand() / (RAND_MAX + 1.0))) ;
cout<< j ;
}
merci d'avance,
jeudi 1 décembre 2005 à 15:05:50 | Re : faite svp ce puissance 4 un peu spécial il est super compliké pr moi ki est novice en programmation si qql me donne un code en c++kii marche alors chapeau pcq c pa évident

MrdJack

c'est super simple, tu vas dans google, tu tapes cours c/c++ et tu potasses un peu les bases.
car ce cahier des charges n'est pas bien dur a réaliser si on connais les petites bases du c/c++.
il n'y a que des conditions  ( if(...) {  }//au cas où tu n'en serais pas encore là), un tableau et pour finir, des boucles . le reste n'est pas sorcier non plus, quelques variables et voilà.

pour finir, rien n'est impossible en c/c++. donc si tu trouves que c'est compliqué, heureusement que tu ne t'attaques pas a un jeu d'echec..... sinon je vois le carnage sur le forum... (SVP:FAITES MOI UN ALGO D'UN JEU D'ECHEC AVEC IA)

pour info, l'IA que tu veux implementer dans ton puissance 4 n'est pas tres evolué, en gros c'est juste une suite de conditions, je te conseille meme d'utiliser la récursivité situ souhaite faire une analyse sur plusieurs tours (comme ca ton ia n'est pas trop bete...)

voila, ptete que tu auras plus de chance avec quelqu'un d'autre, mais ca ne serait pas la meilleure solution pour toi.

@++

vendredi 2 décembre 2005 à 11:01:53 | Re : faite svp ce puissance 4 un peu spécial il est super compliké pr moi ki est novice en programmation si qql me donne un code en c++kii marche alors chapeau pcq c pa évident

qsdfgh



tricheur









MASSART
lundi 5 décembre 2005 à 13:06:17 | Re : faite svp ce puissance 4 un peu spécial il est super compliké pr moi ki est novice en programmation si qql me donne un code en c++kii marche alors chapeau pcq c pa évident

ymca2003

Réponse acceptée !

Have fun...

/****************************************************************************************
 *
 */

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>

/*=======================================================================================
 *
 */
#define CX   7
#define CY   6
#define CONNECT  4
#define PLAYER1  1
#define PLAYER2  2
#define HUMAN  1
#define CPU   2

/*=======================================================================================
 *
 */
#define OTHER_PLAYER(player) ((player == PLAYER1) ? PLAYER2 : PLAYER1)

/*=======================================================================================
 *
 */
typedef struct GRID_TAG
{
 int matrix[CX][CY];
 int columns[CX];
 int count;
}GRID;

/*=======================================================================================
 *
 */
typedef int (*PFN_IA)(const GRID*, int);

/*=======================================================================================
 *
 */
int get_winner(const GRID* grid);
int can_play(const GRID* grid, int x);
void play(GRID* grid, int x, int player);
int ia1(const GRID* grid, int player);
int ia2(const GRID* grid, int player);
int ia3(const GRID* grid, int player);
int get_player(int player);
int get_choice(const GRID* grid, int player, int type);
void display_grid(const GRID* grid);

/****************************************************************************************
 *
 */
int get_winner(const GRID* grid)
{
 int x = 0, y = 0, cx = 0, cy = 0, xn = 0, yn = 0;
 int i = 0, j = 0, score = 0, winner = 0;
 int dep[4][2] = {{1, 0}, {0, 1}, {1, 1}, {1, -1}};
 int ok = 0, player = 0;

 for(i = 0; i < 4; i++)
 {
  cx = dep[i][0];
  cy = dep[i][1];

  for(x = 0; winner == 0 && x < CX; x++)
  {
   for(y = 0; winner == 0 && y < CY; y++)
   {
    ok = 1;
    score = 0;
    player = grid->matrix[x][y];
    for(j = 0; ok && player != 0 && j < CONNECT; j++)
    {
     xn = x+cx*j;
     yn = y+cy*j;
     ok = (xn >= 0 && xn < CX && yn >= 0 && yn < CY);
     ok = ok && (grid->matrix[xn][yn] == player);
     if(ok)
      score += grid->matrix[xn][yn];
    }

    if(ok && player != 0 && score == CONNECT*player)
     winner = player;
   }
  }
 }
 
 return winner;
}

/****************************************************************************************
 *
 */
int can_play(const GRID* grid, int x)
{
 return (grid->columns[x] < CY);
}

/****************************************************************************************
 *
 */
void play(GRID* grid, int x, int player)
{
 grid->matrix[x][grid->columns[x]++] = player;
 grid->count++;
}

/****************************************************************************************
 *
 */
int is_full(const GRID* grid)
{
 return (grid->count == CX*CY);
}

/****************************************************************************************
 *
 */
int ia1(const GRID* grid, int player)
{
 GRID testgrid = {0};
 int x = 0, choice = -1;

 for(x = 0; choice == -1 && x < CX; x++)
 {
  memcpy(&testgrid, grid, sizeof(GRID));
  if(can_play(&testgrid, x))
  {
   play(&testgrid, x, player);
   if(get_winner(&testgrid) == player)
    choice = x;
  }
 }

 return choice;
}

/****************************************************************************************
 *
 */
int ia2(const GRID* grid, int player)
{
 GRID testgrid = {0};
 int xother = 0, choice = -1;

 for(xother = 0; choice == -1 && xother < CX; xother++)
 {
  memcpy(&testgrid, grid, sizeof(GRID));
  if(can_play(&testgrid, xother))
  {
   play(&testgrid, xother, OTHER_PLAYER(player));
   if(get_winner(&testgrid) == OTHER_PLAYER(player))
    choice = xother;
  }
 }

 return choice;
}

/****************************************************************************************
 *
 */
int ia3(const GRID* grid, int player)
{
 GRID testgrid = {0};
 GRID testgrid2 = {0};
 int x = 0, xother = 0, choice = -1;

 for(x = 0; choice == -1 && x < CX; x++)
 {
  memcpy(&testgrid, grid, sizeof(GRID));
  if(can_play(&testgrid, x))
  {
   play(&testgrid, x, player);
   choice = x;
   for(xother = 0; choice == x && xother < CX; xother++)
   {
    memcpy(&testgrid2, &testgrid, sizeof(GRID));
    if(can_play(&testgrid2, xother))
    {
     play(&testgrid2, xother, OTHER_PLAYER(player));
     if(ia1(&testgrid2, player) != player)
      choice = -1;
    }
   }
  }
 }

 return choice;
}

/****************************************************************************************
 *
 */
int get_player(int player)
{
 int type = 0;
 do
 {
  printf("Player %d (%d : Human, %d : CPU) : ", player, HUMAN, CPU);
  scanf("%d", &type);
 }while(type != HUMAN && type != CPU);
 return type;
}

/****************************************************************************************
 *
 */
int get_choice(const GRID* grid, int player, int type)
{
 int choice = 0, i = 0;
 PFN_IA ia[3] = {&ia1, &ia2, &ia3};

 if(type == HUMAN)
 {
  do
  {
   printf("Player %d (%c) : ", player, (player == PLAYER1) ? 'X' : 'O');
   scanf("%d", &choice);
   choice--;
  }while(choice < 0 || choice >= CX || !can_play(grid, choice));
 }
 else
 {
  choice = -1;
  for(i = 0; choice == -1 && i < 3; i++)
   choice = (*ia[i])(grid, player);
  
  if(choice == -1)
  {
   do
   {
    choice = rand()%CX;
   }while(!can_play(grid, choice));
  }
 }

 return choice;
}

/****************************************************************************************
 *
 */
void display_grid(const GRID* grid)
{
 int x = 0, y = 0;

 printf("\n");
 for(x = 0; x < CX; x++)
  printf(" %2d ", x+1);
 printf("\n");

 for(y = CY-1; y >= 0; y--)
 {
  for(x = 0; x < CX; x++)
   printf("----");
  printf("-\n");
  for(x = 0; x < CX; x++)
  {
   switch(grid->matrix[x][y])
   {
    case PLAYER1 : printf("| X "); break;
    case PLAYER2 : printf("| O "); break;
    default : printf("|   "); break;
   }
  }
  printf("|\n");
 }

 for(x = 0; x < CX; x++)
  printf("----");
 printf("-\n");
}

/****************************************************************************************
 *
 */
int main()
{
 int players[2] = {0, 0};
 GRID grid = {0};
 int stop = 0, currentplayer = 0, currenttype = 0, winner = 0, choice = 0;
 char c = 0;

 srand(time(NULL));
 do
 {
  printf("\n\nPuissance %d\n\n", CONNECT);
  players[0] = get_player(PLAYER1);
  players[1] = get_player(PLAYER2);

  memset(&grid, 0, sizeof(GRID));
  currentplayer = (rand()%2 == 0) ? PLAYER1 : PLAYER2;
  do
  {
   display_grid(&grid);
   currenttype = ((currentplayer == PLAYER1) ? players[0] : players[1]);
   choice = get_choice(&grid, currentplayer, currenttype);
   play(&grid, choice, currentplayer);
   winner = get_winner(&grid);
   currentplayer = OTHER_PLAYER(currentplayer);
  }while(winner == 0 && !is_full(&grid));

  display_grid(&grid);
  if(winner == 0)
   printf("Nobody won\n");
  else
   printf("Player %d won\n", winner);

  printf("Continue (Y/N) ? ");
  fflush(stdin);
  scanf("%c", &c);
  stop = (c != 'Y' && c != 'y');
 }while(!stop);

 return 0;
}



Cette discussion est classée dans : colonne, rand, joueur, coup, pion


Répondre à ce message

Sujets en rapport avec ce message

(Hors Sujet) Petit coup de gueule [ par Jo ] Bonjour,Deajs je voudrai m'excuser d'utiliser le forum pour faire passer ce petit message, qui n'a rien a voir avec une demande d'aide ou de conseil d COUD DE GUEULE [ par Jo ] Bonsoir tous le monde,Oui encore moi, je sais ce que vous aller tous dire "il ne sais faire que ca pousser des coup de gueule celui la", mais bon je s COUP DE GUEULE ( bis ) [ par GoldenEye ] Sérieusement j'en ai assez de voir pleins de crétins en tout genre débarquer sur ce site pourtant très agréable.Avis à la population: cessez de mettre ECORE UN COUP DE GUEULE [ par Jo ] Salut,Oui !! encore un coup degueule, pourquoi cette fois ?Et bien tout simpelemtn pour la meme chose que la derniere fois, mon coup de gueulke est pa Coup de pouce sy you plait [ par Toobad ] J'ai deja envoyer un message sur ce sujet, les fenetres et leur procedures de message. On m'a dit qu'il ne fallait pas détruire la fenetre apres WM_D programer le port serie sous builder [ par aziz ] bonjour,je voulais vous demander si c'est possible de me donner un coup de main sur la programmation du port sériemon pb est le suivant: je dois relie je suis desespere... je cherche un puissance 4 en mode 1 joueur IA [ par scorpiwolf ] Si quelqu'un a un puissance 4 avec intelligence artificielle donc mode 1 joueur, j'aimerai l'avoir come exemple, je vous remercie... MSHFlexgrid figer une colonne ou une ligne [ par fieldy8 ] Bonjour,je suis en train de chercher un moyen pour figer une colonne ou un ligne sous visual c++ pour l'activeX mshflexgrid (comme dans excel)si qqn p trie et comparaison dans un tableau pour un jeu [ par cats ] J'ai un devoir à faire et j'ai besoin d'aide. Mon programme est un petit jeu des Maîtres de la Lande. En gros voici mon problème! Dans le jeu, il a de Probleme rand() et for [ par vanpet ] je suis nouveau en C++ (je migre de VB6) et il y a quelques petites choses que l'aide de Microsoft ne parvient pas a me faire comprendre... (pourquoi


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
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 : 1,076 sec (3)

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