Flux rss
Rechercher : dans
Par : Pertinence Date Nom d'utilisateur
Statut : Non résolu

Puissance 4

renaudh, le mercredi 11 mai 2005 à 17:54:03
Bonjour,

Je dois réaliser un puissance 4 en c++ mais seulement à l'exécution, j'ai une erreur de débordement de tableau pourtant, j'ai bon revérifier, je ne vois pas où je pourrais déborder. Voici mes sources:
myfct.cpp (définition des fonctions):
#include "myheader.h"

int i=0,j=0,tab[I][J],cpt,pionsalignesj,pionsaligneso,cpt2;
char gagnant,joueur1,joueur2,nul;

int initialisation (int tab[I][J], int i, int j){

	i=0;
	j=0;
	while (i<=5){
		while (j<=6){
			tab[i][j]=0;
			j++;}
		i++;
		j=0;
	}

	return tab[I][J];
}

void imprimegrille (int tab[I][J], int i, int j){

	i=0;
	j=0;
	while (i<=5){
		printf("-----------------------------------------\n");
		while (j<=6){
			printf("| %d | ",tab[i][j]);
			j++;}
		printf("\n");
		i++;
		j=0;
	}
	printf("-----------------------------------------\n");
}


void saisiej (int tab[I][J], int i, int j){

	i=5;
	j=0;
	printf("Entrer la colonne\n");
	scanf("%d",&j);
	j--;
	while ((j<0) || (j>6)){
		printf("Entrer la colonne\n");
		scanf("%d",&j);
		j--;
	}
	while (tab[i][j]!=0){
		while ((i>0)&&(tab[i][j]!=0)){
			i--;}
		if ((i==0)&&(tab[i][j]!=0)){
			i=5;
			while ((j<0)||(j>6)){
			printf("Entrer la colonne\n");
			scanf("%d",&j);
			j--;
			}
		}
	}
	tab[i][j]=1;
}

	
void verifj (int pionsalignesj, int i, int j){

	int k=i,l=j,cpt2=1;

	while ((tab[k][l]==1)||(l>0)||(cpt2<4)){
		l--;
		incrcptj();}
	gagnantj();
	if (cpt2!=0){
		l=j;
		while ((tab[k][l]==1)||(l<6)||(cpt2<4)){
			l++;
			incrcptj();}
		gagnantj();
		if (cpt2!=0){
			cpt2=1;
			k=i;
			while ((tab[k][l]==1)||(k>0)||(cpt2<4)){
				k--;
				incrcptj();}
			gagnantj();
			if (cpt2!=0){
				k=i;
				while ((tab[k][l]==1)||(k<5)||(cpt2<4)){
					k++;
					incrcptj();}
				gagnantj();
				if (cpt2!=0){
					cpt2=1;
					k=i;
					l=j;
					while ((tab[k][l]==1)||(k>0)||(l>0)){
						k--;
						l--;
						incrcptj();}
					gagnantj();
					if (cpt2!=0){
						k=i;
						l=j;
						while ((tab[k][l]==1)||(k<5)||(l<6)){
							k++;
							l++;
							incrcptj();}
						gagnantj();
						if (cpt2!=0){
							cpt2=1;
							k=i;
							l=j;
							while ((tab[k][l]==1)||(k>0)||(l<6)){
								k--;
								l++;
								incrcptj();}
							gagnantj();
							if (cpt2!=0){
								k=i;
								l=j;
								while ((tab[k][l]==1)||(k<5)||(l>0)){
									k++;
									l--;
									incrcptj();}
								gagnantj();
							}
						}
					}
				}
			}
		}
	}
}

void saisieo (int tab[I][J], int i, int j){

	i=5;
	j=0;
	printf("Entrer la colonne\n");
	scanf("%d",&j);
	j--;
	while ((j<0)||(j>6)){
		printf("Entrer la colonne\n");
		scanf("%d",&j);
		j--;
	}
	while (tab[i][j]!=0){
		while ((i>0)&&(tab[i][j]!=0)){
			i--;}
		if ((i==0)&&(tab[i][j]!=0)){
			i=5;
			while ((j<0)||(j>6)){
			printf("Entrer la colonne\n");
			scanf("%d",&j);
			j--;
			}
		}
	}
	tab[i][j]=2;
}

void verifo (int pionsaligneso, int i, int j){

	int k=i,l=j,cpt2=1;

	while ((tab[k][l]==2)||(l>0)||(cpt2<4)){
		l--;
		incrcpto();}
	gagnanto();
	if (cpt2!=0){
		l=j;
		while ((tab[k][l]==2)||(l<6)||(cpt2<4)){
			l++;
			incrcpto();}
		gagnanto();
		if (cpt2!=0){
			cpt2=1;
			k=i;
			while ((tab[k][l]==2)||(k>0)||(cpt2<4)){
				k--;
				incrcpto();}
			gagnanto();
			if (cpt2!=0){
				k=i;
				while ((tab[k][l]==2)||(k<5)||(cpt2<4)){
					k++;
					incrcpto();}
				gagnanto();
				if (cpt2!=0){
					cpt2=1;
					k=i;
					l=j;
					while ((tab[k][l]==2)||(k>0)||(l>0)){
						k--;
						l--;
						incrcpto();}
					gagnanto();
					if (cpt2!=0){
						k=i;
						l=j;
						while ((tab[k][l]==2)||(k<5)||(l<6)){
							k++;
							l++;
							incrcpto();}
						gagnanto();
						if (cpt2!=0){
							cpt2=1;
							k=i;
							l=j;
							while ((tab[k][l]==2)||(k>0)||(l<6)){
								k--;
								l++;
								incrcpto();}
							gagnanto();
							if (cpt2!=0){
								k=i;
								l=j;
								while ((tab[k][l]==2)||(k<5)||(l>0)){
									k++;
									l--;
									incrcpto();}
								gagnanto();
							}
						}
					}
				}
			}
		}
	}
}
void incrcptj (){

	if (tab[i][j]==1)
		cpt2=cpt2+1;
}

void gagnantj (){

	if (cpt2==4)
		pionsalignesj=1;
}

void incrcpto (){

	if (tab[i][j]==2)
		cpt2=cpt2+1;
}

void gagnanto (){

	if (cpt2==4)
		pionsaligneso=1;
}

void resultat (char gagnant){

	if (pionsalignesj==1)
		gagnant=joueur1;
	else
		if (pionsaligneso==1)
			gagnant=joueur2;
		else
			gagnant=nul;
}


mymain.cpp (programme principal):
#include "myheader.h"

void main (void){

	int i=0,j=0,tab[I][J],cpt,pionsalignesj=0,pionsaligneso=0;
	char gagnant,joueur1[30],joueur2[30],nul;

	printf("Bienvenue dans le puissance 4\n");
	printf("Joueur 1, entrez votre nom\n");
	scanf("%s",&joueur1);
	printf("Joueur 2, entrez votre nom\n");
	scanf("%s",&joueur2);	

	tab[I][J]=initialisation(tab,i,j);
	cpt=0;
	while ((cpt<42)||(pionsalignesj==0)||(pionsaligneso==0))
	{
		imprimegrille(tab,i,j);
		saisiej(tab,i,j);
		verifj(pionsalignesj,i,j);
		saisieo(tab,i,j);
		verifo(pionsaligneso,i,j);
		cpt=cpt+2;
	}
	resultat(gagnant);
}


myheader.h (déclaration des fonctions):
#include <stdio.h>
#define I 5
#define J 6

int initialisation (int [I][J], int, int);
void imprimegrille (int [I][J], int, int);
void saisiej (int [I][J], int, int);
void verifj (int, int, int);
void saisieo (int [I][J], int, int);
void verifo (int, int, int);
void resultat (char);
void incrcptj ();
void incrcpto ();
void gagnantj ();
void gagnanto ();


Donc, j'ai une grille de 6 lignes sur 7 colonnes, les fonctions dont le nom se termine par j sont celles pour le premier joueur et celles avec o pour le 2ème joueur, voyez-vous une erreur de débordement ou autre là-dedans?

Merci pour votre aide.
Répondre à renaudh  Signaler ce message aux modérateurs Aller au dernier message

1


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
kij_82, le mercredi 11 mai 2005 à 19:41:27
Tu crois qu'on va se taper tout ton truc à mater... c'est un peu long franchement... je te conseil de faire un trace de ton programme pour voir exactement à quel endroit et quel moment tu as le débordement de mémoire et quand tu as trouvé tu revient nous voir en nous le disant car la.... j'te dit c'est bien trop long.

++ ~ iclic @ gauch,iclic, iclic @ droate, iclic, iclic
et ya pas de bôg môsieu ! ~
Répondre à kij_82

2


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
TLa, le mercredi 11 mai 2005 à 22:16:37
j'ai pas tout lu mais I et J ne sont pas conformes au 5 et 6 qui trainent dans le code

en C les tableaux c'est de 0 à N exclu, pour tab[N]

#include <stdio.h>

#define I 6
#define J 7

int tableau[I][J];

void imprimegrille (int tab[I][J])
{
	int i,j;

	for(i=0;i<I;i++)
	{
		for(j=0;j<J;j++)
			printf("+---");
		printf("+\n");
		for(j=0;j<J;j++)
		{
			printf("| %d ",tab[i][j]);
		}
		printf("|\n");
	}
	for(j=0;j<J;j++)
		printf("+---");
	printf("+\n");
}

int main(int argc,char **argv)
{
	imprimegrille(tableau);
	return 0;
}
Répondre à TLa

3


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
renaudh, le jeudi 12 mai 2005 à 16:09:16
L'erreur se fait à la saisie de la colonne donc ce paragraphe-ci:
void saisiej (int tab[I][J], int i, int j){

	i=I-1;
	j=0;
	printf("Entrer la colonne\n");
	scanf("%d",&j);
	j--;
	while ((j<0) || (j>J-1)){
		printf("Entrer la colonne\n");
		scanf("%d",&j);
		j--;
	}
	while (tab[i][j]!=0){
		while ((i>0)&&(tab[i][j]!=0)){
			i--;}
		if ((i==0)&&(tab[i][j]!=0)){
			i=I-1;
			while ((j<0)||(j>J-1)){
			printf("Entrer la colonne\n");
			scanf("%d",&j);
			j--;
			}
		}
	}
	tab[i][j]=1;
}

J'ai modifié les define avec 6 et 7 et changer les conditions dans imprimetableau mais bon apparemment, cette fonction allait déjà auparavant.
Merci pour votre aide.
Répondre à renaudh

4


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
 renaudh, le vendredi 13 mai 2005 à 18:52:58
Mon programme va un peu mieux, la saisie fonctionne mais pas la vérification des 4 pions alignés. Voici les entêtes, appels et prototypes des fonctions:
saisie:
entête:
void saisiej (int tab[I][J])

appel:
saisiej(tab);

prototype:
void saisiej (int [I][J]);


vérification:
entête:
void verifj (int pionsalignesj)

appel:
verifj(pionsalignesj);

prototype:
void verifj (int);


Donc à la saisie, j'entre la colonne et le programme met 1 dans la case du tableau, ensuite quand je sors de la fonction "saisiej", la valeur de la case se remet à 0 et donc la vérification n'a pas lieu, ke dois-je corriger svp?
Répondre à renaudh

Résultats pour Puissance 4

Mackie SRM 450 V2 Blue V 2,Sono,400 Watt,Sensibilité: ,Type(Bass-reflex/Closed/Ukd): ,Page web du produit:Anglais,Basses: ,Dimensions (LxHxP):39x66x37.6 cm,Divers: ,Impédance: ,Poids:18.14 kg,Couleur:Blue,Isolement magnétique: ,Puissance:400... www.commentcamarche.net/guide-achat/mackie-srm-450-v2-blue-1073791-fiche-technique
Alto PS 4HA Black 4 HA,Enceinte principale,410 Watt,Couleur:Black,Isolement magnétique: ,Nombre d'éléments:2 voies,Type:Enceinte principale,Aigus:3.4 cm,Basses:31.8 cm,Dimensions (LxHxP):39.6x66x38.4 cm,Divers: ,Impédance:4 Ohms,Poids:23.38 kg,Puissance:410... www.commentcamarche.net/guide-achat/alto-ps-4ha-black-538829-fiche-technique
Inter-m QD-4240 Stereo,Canaux:Stereo,Dimensions (HxLxP):48.2x8.8x36.9 cm,Poids:11.5 kg,Puissance:40/4 Ohm,60/8 Ohm Watt,Type:Ampli de puissance,Fiche produit au format PDF:Anglais,Page web du produit:Anglais www.commentcamarche.net/guide-achat/inter-m-qd-4240-754163-fiche-technique

Résultats pour Puissance 4

[KDE] Les applications KDEIntroduction Le gestionnaire de bureau KDE comporte de nombreux logiciels préinstallés (pour les versions complètes) ou installables facilement grâce à votre gestionnaire de paquetage. Une fois installés, la plupart de ces logiciels se... www.commentcamarche.net/faq/sujet-4789-kde-les-applications-kde

Résultats pour Puissance 4

Alimentation pour ATI Radeon HD 4870 (Résolu)Bonjour, Voilà je poser ces quelques questions car j'aurais besoin de votre aide. Pour commencer, voilà ma configuration actuelle qui est très vieille: Boitier CoolerMaster Centurion5 Alimentation Xilence Power 450W Disque dur Western Digital... www.commentcamarche.net/forum/affich-8196279-alimentation-pour-ati-radeon-hd-4870

Résultats pour Puissance 4

Ecler MPA-4-80Multi-Canal,Canaux:Multi-Canal,Compatible DVD-Audio: ,Dimensions (HxLxP): ,Divers: ,Poids:9.3 kg,Puissance:4x53 Watt,Type:Ampli de puissance,Télécommande: ,Page web du produit:Anglais www.commentcamarche.net/guide-achat/ecler-mpa-4-80-744220-fiche-technique
Yamaha XM-4080Multi-Canal,Type:Ampli de puissance,Télécommande,Poids:9.8 kg,Puissance:4x180/8 Ohms,4x80/8 Ohms,4x90/8 Ohms,4x120/4,2x240/8 Ohms,4x80/8 Ohms,4x115/4 Ohms,2x230/8 Ohms Watt,Divers: ,Dimensions (HxLxP):48.0x8.8x41.2 cm,Canaux:Multi... www.commentcamarche.net/guide-achat/yamaha-xm-4080-1089758-fiche-technique
Marantz PM-4001 Silver/BlackStereo,Dimensions (HxLxP):44x34.3x16.1 cm,Poids:6.0 kg,Télécommande,Type:Amplificateur,Puissance:40 Watt,Poids:6.0 kg,Divers: ,Dimensions (HxLxP):44x34.3x16.1 cm,Compatible DVD-Audio: ,Canaux:Stereo www.commentcamarche.net/guide-achat/marantz-pm-4001-silver-black-464754-fiche-technique