CONNEXION
  • RetourJeux
    • Sorties
    • Hit Parade
    • Les + populaires
    • Les + attendus
    • Soluces
    • Tous les Jeux
    • Gaming
  • RetourActu Gaming
    • News
    • Astuces
    • Tests
    • Previews
    • Toute l'actu gaming
  • RetourBons plans
    • Bons plans
    • Bons plans Smartphone
    • Bons plans Hardware
    • Bons plans Image et Son
    • Bons plans Amazon
    • Bons plans Cdiscount
    • Bons plans Decathlon
    • Bons plans Fnac
    • Tous les Bons plans
  • RetourJVTech
    • Actus High-Tech
    • Intelligence Artificielle
    • Smartphones
    • Mobilité urbaine
    • Hardware
    • Image et son
    • Tutoriels
    • Tests produits High-Tech
    • Guides d'achat High-Tech
    • JVTech
  • RetourCulture
    • Actus Culture
    • Culture
  • RetourVidéos
    • A la une
    • Gaming Live
    • Vidéos Tests
    • Vidéos Previews
    • Gameplay
    • Trailers
    • Chroniques
    • Replay Web TV
    • Toutes les vidéos
  • RetourForums
    • Hardware PC
    • PS5
    • Switch 2
    • Xbox Series
    • Switch
    • Pokemon pocket
    • FC 25 Ultimate Team
    • League of Legends
    • Tous les Forums
  • PC
  • PS5
  • Xbox Series
  • Switch 2
  • PS4
  • One
  • Switch
  • iOS
  • Android
  • MMO
  • RPG
  • FPS
En ce moment Genshin Impact Valhalla Breath of the wild Animal Crossing GTA 5 Red dead 2
Liste des sujets

java.script exercice bataille navale-Contrainte du 2nd navire qui prend 2 cases

SetsunaFSeiei88
SetsunaFSeiei88
Niveau 2
06 septembre 2020 à 18:50:16

Bonjour,

Je pense avoir trouver une solution qui répond à la contrainte de choisir une case qui est à proximité de la 1er case et je ne comprends pas pourquoi elle ne fonctionne.

Si une personne pourrait m'aider à comprendre m'on erreur.

code main

System.out.println("Joueur 1, ou voulez-vous placer la 1er partie de votre croisseur (qui prend deux case): "); o=bougerPiece(); p=bougerPiece(); System.out.println(o+","+p); tab[o][p]=1; do{ System.out.println("ou voulez placer la 2nd partir de votre croisseur: "); m=bougerPiece(); n=bougerPiece(); if(m==o+1 || m==o-1){ if(n==0){ possible=true; } } if(n==p+1 || n==p-1){ if(m==0){ possible=true; } } }while(!possible);

code bougerPiece

 public static int bougerPiece(){
    int n=0;
    boolean correct;
    do{
      do{
        try{
          n=Terminal.lireInt();
          correct=true;
        }catch(TerminalException e){
          Terminal.ecrireString("Vous avez tapé autre chose qu’un entier");
          Terminal.ecrireStringln(" Veuillez recommencer");
          correct = false;
        }
      }while(n<0 || n>5); //Contrainte taille du tableau 
    }while(!correct);
    return n;
  }

Merci pour avoir lu ce roman.

lelouchvx
lelouchvx
Niveau 4
06 septembre 2020 à 21:36:04

Alors en information c'est que tu as un tableau à deux dimensions de taille 5x5.

Du coup, je te conseille de modifier ta fonction bougerPiece déjà en la renommant PoserPiece et de la faire de la manière suivante :

Tout d'abord créer une classe Position ou donne lui le nom que tu veux

 
public class Position(){
	
	public int i;
	public int j;
	
	Position(int x, int y) {
		this.i = x;
		this.j = y;
	}
}

Ensuite tu peux modifier ta fonction principale pour quel sois plus lisible et claire :


System.out.println("Joueur 1, ou voulez-vous placer la 1er partie de votre croisseur (qui prend deux case): ");
	
Position p1 = poserPremierePiece(tab, 1);
	
System.out.println("ou voulez placer la 2nd partir de votre croisseur: ");
	
poserPiece(tab, 1, p1);

Ma proposition de fonction poserPremierePiece avec en parametre ton tableau et la valeur de la pièce (s'il y a plusieurs joueur peut être donner une valeur différente serait cool). Donc cette fonction permet de poser la premiere piece puis de retourner à quel position ça a été posé. Bien sûr, il se peut qu'une position initiale ne sois pas adapté, exemple tu poses un bateau en diagonale dans le coin supérieur gauche, donc ça condamne une case. A toi de rajouter des conditions pour que ça marche dans tous les cas.


public static Position poserPremierePiece(int[][] tab, int valeurPiece)
{
	boolean isCorrect = false;
	
	int i = -1;
	int j = -1;
	
	while(!isCorrect)
	{
		try{
			i = Terminal.lireInt();
			j = Terminal.lireInt();
			
			if(tab[i][j] == 0)
			{
				correct = true;
				tab[i][j] == valeurPiece;
			}
				
			
		} catch(TerminalException e){
			Terminal.ecrireString("Vous avez tapé autre chose qu’un entier");
			Terminal.ecrireStringln(" Veuillez recommencer");
		} catch(ArrayIndexOutOfBoundsException e){
			Terminal.ecrireString("La position i,j que vous avez choisi n'existe pas au sein du plateau");
			Terminal.ecrireStringln(" Veuillez recommencer");
		}
	}
	
	return Position(i,j);
}

Et enfin la fonction poserPiece qui prend en parametre ton tableau, la valeur de la pièce et la position de la pièce initiale :


public static void poserPiece(int[][] tab, int valeurPion, Position p){
	
	boolean isCorrect = false;
	
	int i = -1;
	int j = -1;
	
	while(!isCorrect)
	{
		try{
			i = Terminal.lireInt();
			j = Terminal.lireInt();
			
			if(tab[i][j] == 0)
			{
				if(verifierProximiterPiece(p, Position(i,j))
				{
					tab[i][j] = valeurPion;
					isCorrect = true;
				} else {
					Terminal.ecrireString("Votre pièce est trop éloignée !");
					Terminal.ecrireStringln(" Veuillez recommencer");
				}
			}
				
			
		} catch(TerminalException e){
			Terminal.ecrireString("Vous avez tapé autre chose qu’un entier");
			Terminal.ecrireStringln(" Veuillez recommencer");
		} catch(ArrayIndexOutOfBoundsException e){
			Terminal.ecrireString("La position i,j que vous avez choisi n'existe pas au sein du plateau");
			Terminal.ecrireStringln(" Veuillez recommencer");
		}
	}
}

Je pense que ça peut être pas mal, tu n'es pas obligé de reprendre à 100% mon code mais voici une approche que je trouve un peu plus correcte. Et dans mon cas tu dois coder toi même la fonction verifierProximiterPiece qui prend en parametre la position initiale de ta pièce et la position de la seconde piece et renvoie true ou false.

En tout cas, je pense que ça pourra te donner pas mal d'idée. Bonne chance

lelouchvx
lelouchvx
Niveau 4
06 septembre 2020 à 21:45:14

J'ai oublié de rajoute une condition else, quand la case choisi n'est pas égale à 0. Tu devras dire à l'utilisateur que cette case est déjà prise dans la fonction poserPremierePiece et de recommencer

Pseudo supprimé
Pseudo supprimé 07 septembre 2020 à 00:04:12

Salut, je pense que ton soucis vient des if(n==0) et if(m==0). Ça devrait être if(n==p) et if(m==o) plutôt non ?

SetsunaFSeiei88
SetsunaFSeiei88
Niveau 2
07 septembre 2020 à 00:14:15

Merci pour ces réponses précise et clair.

Je compte faire un programme lourd de base pour ensuite l'affiné après, car au moment présent quand j'essaye de faire complexe je multiplie les erreurs :).

Mais merci beaucoup pour cette solution beaucoup plus lisible lelouchvx.

SetsunaFSeiei88
SetsunaFSeiei88
Niveau 2
07 septembre 2020 à 00:21:54

Yllid effectivement tu as ciblé l'erreur ^^.

Je suis un peu gêné de voir mon aveuglement face à cette erreur :|.

Pseudo supprimé
Pseudo supprimé 08 septembre 2020 à 01:15:10

Ça nous arrive à tous, c'est le manque de recul. On est tellement dedans qu'ont finit par voir ce qu'on a en tête et plus ce qu'on a écrit. Ça veut dire que c'est le moment de prendre une pause :noel:

Sous forums
  • Aide à l'achat Mac
  • Internet
  • Macintosh
  • Création de sites web
  • Création de Jeux
  • Linux
  • Programmation
  • Steam Deck
  • Hardware
La vidéo du moment