Programmation d'un jeu : BUG ! - Java - Programmation
Marsh Posté le 15-05-2013 à 13:01:34
Bonjour,
La réponse est simple: pour un tableau de nbLig elements, les indices valables vont de 0 inclus à nbLig exclus.
Tes boucles for de deplacerH/B/D/G sont donc correctes à priori. Or dans ces boucles il t'arrive de vérifier soit i-1/+1 ou j -1/+1 ce qui causes un accès en dehors des bornes pour i/j=0 ou i/j= nbLig/nbCol.
pour deplacer H/B tu as le bon garde fou:
if (i-1 >= 0...)
mais pour deplacer G/D, ton garde fou est incorrect! il devrait être
if (j+1<nbCol...
au lieu de if
(j+1<=nbCol...
dans deplacerG le while(i-1 est incorrect sachant qu'ensuite tu accède a grille[i][j-1] (fait gaffe a l'indentation, ce while n'est pas dans ton if( j-1!) (idem pour deplacerD!)
Bref revois les bornes de tes conditions....
Marsh Posté le 12-07-2013 à 08:27:37
Up.
A mon tour de vous parler de mon problème.
Je suis GROS débutant sous Java. J'ai rapidement lu Java for Dummies ces deux derniers mois et je vous avoue ne pas avoir fait tout les exercices
Je me suis attelé, comme exercice "perso", à la conversion en Java d'un jeu que j'avais commencé à programmer en QBASIC... Néanmoins, ça compile pas. J'ai pu résoudre/détourner la majeure partie des erreurs, mais celle ci m'échappe.
code source
Citation : |
et erreur dans la console d'Eclipse
Citation : |
WTF?
Merci à l'avance de toute aide que vous pourriez m'apporter.
Marsh Posté le 19-07-2013 à 13:32:25
Yop,
C'est tout bete, t'as oublié un break; à la fin de ton case 'A':
(sinon le debug dans eclipse reste ton MEILLEUR AMI)
Marsh Posté le 15-05-2013 à 11:21:45
Bonjour !
Je suis en terminale S dans une spécialité Information et Sciences du Numérique (ISN) et je dois préparer un projet pour passer un oral poru le bac.
On a seulement commencé à apprendre le Java cette année, autant dire que c'est grave la galère, sachant que ce jeu doit être réalisée en Java :$ (mon jeu consiste juste à déplacer un personnage sur une grille et rencontre des monstres pour les attaquer)
J'ai pas mal taffer dessus, c'est loin d'être parfait, mais je rencontre un bug lorsque j'associe les déplacements aux combats.
Les déplacement Haut et Bas fonctionnent très très bien avec les attaques, mais lorsque j'essaye les deplacements Gauches et Droites, un message d'erreur s'affiche :
"Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 10
at Grille.deplacerD(Grille.java:243)
(ou at Grille.deplacerG)
at Main.main(Main.java:48)"
J'ai fais quelques recherches pour résoudre ça mais rien n'y fais, je n'arrive pas à débloqué ! Pourtant, avant ces déplacements marchaient très bien..
Merci d'avance pour vos réponses !
Je vous envoie mon programme Grille (si vous avez besoin des parties Main, Personnage et monstre, je vous les enverrais aussi)
import java.util.*;
public class Grille {
// Attributs
private int nbLig;
private int nbCol;
private char [][] grille;
// Constructeurs
public Grille(int n, int p){
nbLig = n;
nbCol = p;
grille = new char[nbLig][nbCol];
/* i++ : augmenter la valeur de un à chaque fois (i+1)*/
for(int i=0; i<nbLig; i++){
for(int j=0; j<nbCol; j++){
grille[i][j] = '-';
}
}
}
// Acesseurs
public char getCase(int l, int c){
return grille[l-1][c-1];
}
//Methodes
public void afficher(){
System.out.println();
for(int i=0; i<nbLig; i++){
for(int j=0; j<nbCol; j++){
System.out.print(" | " + grille[i][j]);
}
System.out.println(" | " );
}
System.out.println();
}
// Placer
public void placer(int l, int c, char t){ /* placer(ligne, colonne, type) */
l = l-1;
c = c-1;
if (l<0 || c<0 || l>nbLig || c>nbCol){
System.out.print("Erreur de déplacement !" );
return;
}
grille[l][c] = t;
}
Personnage p1 = new Personnage();
Monstre m1 = new Monstre();
public int Combat(){
System.out.println("Début du combat..." );
if(p1.getvie() > 0 && m1.getvie() > 0){
System.out.println("\nVoulez-vous attaquez ? \n1: Oui \n2: Non" );
Scanner sc2 = new Scanner(System.in);
int nb = sc2.nextInt();
switch (nb){
case 1 : System.out.println("\nVous lancez une attaque !" );
m1.setvie(m1.getvie() - p1.attaquer());
System.out.println();
System.out.println("Caractéristiques de l'adversaire : " + m1.tostring());
System.out.println();
System.out.println("Vous êtes attaqué !" );
System.out.println();
p1.settvie(p1.getvie() - m1.attaquer()) ;
System.out.println("Vos caractéristiques : " + p1.tostring());
afficher();
break;
case 2 : System.out.println("Fuite.. Pas de dégâts infligés." );
afficher();
}}
else{ System.out.println("\nFin du Combat... " );
if(p1.getvie() <= 0 && m1.getvie() > 0){
System.out.println("\nFin du Combat... " );
System.out.print("Vous avez perdu. Fin du jeu." ); }
if(p1.getvie() >0 && m1.getvie() < 0){
char tmp;
System.out.println("\nFin du Combat... " );
System.out.print("Vous avez gagné !" );
for(int i=0; i<nbLig; i++){
for(int j=0; j<nbCol; j++){
if(grille[i][j] == 'J'){
if(i+1 <= nbLig && grille[i+1][j] == 'M'){
tmp = grille[i][j];
grille[i][j] = '-';
grille[i+1][j] = tmp;
return 1;
}}
if(grille[i][j] == 'J'){
if(i-1 >= 0 && grille[i-1][j] == 'M'){
tmp = grille[i][j];
grille[i][j] = '-';
grille[i-1][j] = tmp;
return 1;
}}
if(grille[i][j] == 'J'){
if(j+1 <= nbCol && grille[i][j+1] == 'M'){
tmp = grille[i][j];
grille[i][j] = '-';
grille[i][j+1] = tmp;
return 1;
}}
if(grille[i][j] == 'J'){
if(j-1 >= 0 && grille[i][j-1] == 'M'){
tmp = grille[i][j];
grille[i][j] = '-';
grille[i][j-1] = tmp;
return 1;
}}
}}
}
}
return 0; }
public int deplacerH(){ /* deplacerH = deplacer vers le haut le personnage */
char tmp;
/*i++ * augmenter la valeur de un à chaque fois (i+1)*/
for(int i=0; i<nbLig; i++){
for(int j=0; j<nbCol; j++){
if(grille[i][j] == 'J'){ //On cherche le joueur
if(i-1 >= 0 && grille[i-1][j] == '-'){ //On teste la position
tmp = grille[i][j]; //On copie le perso
grille[i][j] = '-'; //On vide la case
grille[i-1][j] = tmp; //Et on deplace le perso
return 1;
}}
//S'il y a un monstre
while(i-1 >= 0 && grille[i-1][j] == 'M'){
Combat();
}
}
}
return 0; }
public int deplacerB(){
char tmp; //variable temporaire//
/* i++ : augmenter la valeur de un à chaque fois (i+1)*/
for(int i=0; i<nbLig; i++){
for(int j=0; j<nbCol; j++){
if(grille[i][j] == 'J'){ //On cherche le joueur
if(i+1 <= nbLig && grille[i+1][j] == '-'){ //On teste la position
tmp = grille[i][j]; //On copie le perso
grille[i][j] = '-'; //On vide la case
grille[i+1][j] = tmp; //Et on deplace le perso
return 1;
}}
//S'il y a un monstre
while(i+1 <= nbLig && grille[i+1][j] == 'M'){
Combat();
}
}
}
return 0; }
public int deplacerD(){
char tmp; //variable temporaire//
/* i++ : augmenter la valeur de un à chaque fois (i+1)*/
for(int i=0; i<nbLig; i++){
for(int j=0; j<nbCol; j++){
if(grille[i][j] == 'J'){ //On cherche le joueur
if(j+1 <= nbCol && grille[i][j+1] == '-'){ //On teste la position
tmp = grille[i][j]; //On copie le perso
grille[i][j] = '-'; //On vide la case
grille[i][j+1] = tmp; //Et on deplace le perso
return 1; }}
//S'il y a un monstre
while(j+1 <= nbCol && grille[i][j+1] == 'M'){
Combat(); }
}
}
return 0; }
public int deplacerG(){ /* deplacerH = deplacer vers le haut le personnage */
char tmp; //variable temporaire//
/* i++ : augmenter la valeur de un à chaque fois (i+1)*/
for(int i=0; i<nbLig; i++){
for(int j=0; j<nbCol; j++){
if(grille[i][j] == 'J'){ //On cherche le joueur
if(j-1 >= 0 && grille[i][j-1] == '-'){ //On teste la position
tmp = grille[i][j]; //On copie le perso
grille[i][j] = '-'; //On vide la case
grille[i][j-1] = tmp; //Et on deplace le perso
return 1; }}
//S'il y a un monstre
while(i-1 >= 0 && grille[i][j-1] == 'M'){
Combat();
}
}
}
return 0; }
}