-
Programme démineur java
Bonjour à tous ! J'ai commencé le java il y a très peu de temps et je dois créer un démineur. Le problème étant que je ne comprends pas ce que je dois modifier afin de réussir à le compiler. Si vous réussissiez à m'aider vous me seriez d'un grand secours. Merci d'avance ! :)
Voici le programme:
import java.util.Scanner;
public class Demi {
int lignes,colonnes; // lignes les lignes, colonnes les colonnes
int NMA; // Nombre de mines autour
int NbMines; // le nombre de mines choisi par le joueur
int choix; // le choix effectué par le joueur pour découvrir ou placer un drapeau
int nbCaseVue; // nombre de case dévoilée
Scanner sc = new Scanner(System.in);
char [][]t1 = new char [10][10];; // grille de jeu
char [][]t2 = new char [10][10]; // la grille avec les mines
/*
* FONCTION INITIALISATION
*/
public void Init()
{
for(lignes=0;lignes<10;lignes++)
{
for(colonnes=0;colonnes<10;colonnes++)
{
t1[lignes][colonnes]='-';//' 'implique case cachée
t2[lignes][colonnes]='0';
}
}
}
/*
* FONCTION PLACER LES MINES
*/
public void PlaceMines()
{
int CompteMines;//compteur de mines
for (CompteMines=0;CompteMines<NbMines;CompteMines++)
{
lignes=(int) (Math.random()%10);//on choisit la ligne de manière aléatoire
colonnes=(int) (Math.random()%10);//on choisit la colonne de manière aléatoire
if(t2[lignes][colonnes]=='0')//On vérifie que la case est libre
{
t2[lignes][colonnes]='M';//on place un M pour indiquer qu'il y a une mine
}
else
{
NbMines++;//Sinon, il y a déjà un M et il faut faire un tour de plus
}
}
}
/*
* FONCTION QUI REGARDE SI IL Y A UNE MINE
* Fonction qui permet de savoir il y a une mine sur la case donnée en paramètre
* retourne 1 si il y a une case sinon 0
*/
int RegarderMine(final int _lignes, final int _colonnes)
{
if( _lignes >= 0 && _lignes < 10 && _colonnes >= 0 && _colonnes < 10 && t2[_lignes][_colonnes]=='M')
return 1;
return 0;
}
/*
* FONCTION CALCULER LE NB DE MINES AUTOUR
* fonction équivalente à NbMinesAutour() mais qui prend les paramètres de position de case
* retourne le nombre de mine qui se trouve autour d'une position
*/
int NbMinesAutourBis(final int _lignes, final int _colonnes)
{
int NbMA = 0;
NbMA+=RegarderMine(_lignes+1, _colonnes);
NbMA+=RegarderMine(_lignes+1, _colonnes+1);
NbMA+=RegarderMine(_lignes, _colonnes+1);
NbMA+=RegarderMine(_lignes-1, _colonnes);
NbMA+=RegarderMine(_lignes-1, _colonnes-1);
NbMA+=RegarderMine(_lignes, _colonnes-1);
NbMA+=RegarderMine(_lignes+1, _colonnes-1);
NbMA+=RegarderMine(_lignes-1, _colonnes+1);
return NbMA;
}
/*
* FONCTION QUI CHERCHE LES CASES PROCHE DES MINES
* fonction appelé que si le nombre de mine qui se trouve autour d'elle est 0
* fonction récursive, qui demande a ses voisins de devoilé leur case
*/
public void DevoileCase(final int _lignes, final int _colonnes)
{
if( _lignes >= 0 && _lignes < 10 && _colonnes >= 0 && _colonnes < 10 && t1[_lignes][_colonnes]=='-')
{
int NbMA = NbMinesAutourBis(_lignes,_colonnes);
t1[_lignes][_colonnes]=(char) ('0'+NbMA);
++nbCaseVue;
if( NbMA == 0 ) // partie récursive
{
DevoileCase(_lignes+1,_colonnes);
DevoileCase(_lignes+1,_colonnes+1);
DevoileCase(_lignes,_colonnes+1);
DevoileCase(_lignes-1,_colonnes);
DevoileCase(_lignes-1,_colonnes-1);
DevoileCase(_lignes,_colonnes-1);
DevoileCase(_lignes-1,_colonnes+1);
DevoileCase(_lignes+1,_colonnes-1);
}
}
}
/*
* FONCTION AFFICHER LA GRILLE DE JEU
* affiche le tableau JEU
*/
public void AfficheJeu()
{
System.out.println("\n\n" );
System.out.println(" | 1 2 3 4 5 6 7 8 9 10\n" );
System.out.println("___|______________________________\n" );
for(lignes=0;lignes<10;lignes++)
{
if(lignes<9)
System.out.println(" %d | ",lignes+1);
else
System.out.println("%d | ",lignes+1);
for(colonnes=0;colonnes<10;colonnes++)
{
System.out.println("%c ",t1[lignes][colonnes]);
}
System.out.println("\n" );
}
}
/*
* FONCTION CALCULER LE NB DE MINES AUTOUR
* renvoie le nombre de mine autour d'une position qui se trouve en i j
* renvoie -1 si on se trouve sur une mine sinon le nombre de mine autour
*/
int NbMinesAutour()
{
NMA=0;
if(t2[lignes][colonnes]=='M') // on se trouve sur une mine
{
NMA = -1;
}
else
{
NMA+=RegarderMine(lignes+1, colonnes);
NMA+=RegarderMine(lignes+1, colonnes+1);
NMA+=RegarderMine(lignes, colonnes+1);
NMA+=RegarderMine(lignes-1, colonnes);
NMA+=RegarderMine(lignes-1, colonnes-1);
NMA+=RegarderMine(lignes, colonnes-1);
NMA+=RegarderMine(lignes+1, colonnes-1);
NMA+=RegarderMine(lignes-1, colonnes+1);
}
return NMA;
}
/*
* FONCTION JOUER
* dévoiler une case ou placer un drapeau
*/
public void Jouer()
{
switch (choix)
{
case 1 : // On dévoile une case
if( NbMinesAutour() != -1 ) // Si on est pas sur une mine
{
if( NMA == 0 ) // Si on n'a pas de mine comme voisin
DevoileCase(lignes,colonnes);
else // Sinon, si on a au moins une mine comme voisin
{
t1[lignes][colonnes]=(char) ('0'+NMA);
++nbCaseVue;
}
}
break;
case 2 : // On met un drapeau
t1[lignes][colonnes]='D';
break;
}
}
/*
* FONCTION CHOISIR
* On demande au joueur de choisir une case
*/
public void Choisir()
{
System.out.println("\n\nVeuillez entrer la case choisie (numero de ligne [espace] numero de colonne):\t" );
int T = sc.nextInt ();
Comptes = new double[T];("%d %d",&lignes,&colonnes);
System.out.println("Vous avez choisi la case (%d,%d).\n Que voulez-vous faire ?\n",lignes,colonnes);
lignes-=1;
colonnes-=1;
System.out.println("i : %d | j : %d\n",lignes,colonnes);
System.out.println("\t1. Decouvrir une case\n" );
System.out.println("\t2. Placer un drapeau" );
do
{
System.out.println("\t\tVotre choix : " );
int T = sc.nextInt ();
Comptes = new double[T];("%d",&choix);
}
while (choix!=1 && choix!=2); // faut pas se compliquer tu as que 2 choix donc que 2 comparaisons
}
/*
* Fonction main
* lancement du jeu
*/
int main()
{
sRand((time)Null);
//Afficher le début du jeu
System.out.println(" ________________________________\n" );
System.out.println("| |\n" );
System.out.println("| Démineur |\n" );
System.out.println("|________________________________|\n\n" );
Init();
do // Choisir le nombre de mine dans le demineur
{
System.out.println("\nCombien de mines voulez-vous ?(entre 1 et 50)\n\n" );
int T = sc.nextInt ();
Comptes = new double[T];("%d",&NbMines);
}
while(NbMines<=0 && NbMines>50); // nombre de mines comprise entre 1 et 50 sinon on redemande
System.out.println("D'accord, vous avez choisi de jouer avec %d mines\n\n",NbMines);
PlaceMines();
System.out.println("Voici la grille des mines pour controle:\n" );
for(lignes=0;lignes<10;lignes++)
{
System.out.println("\t\t\t" );
for(colonnes=0;colonnes<10;colonnes++)
{
System.out.println("%c ",t2[lignes][colonnes]);
}
System.out.println("\n" );
}
System.out.println("\n\nVoici votre grille : A vous de jouer !\n\n" );
nbCaseVue=0;
while( nbCaseVue<(100-NbMines) && NMA != -1 ) // On regarde si on a vu toutes les cases sans mines ou qu'on a touché une mine
{
AfficheJeu();
Choisir();
Jouer();
}
if( NMA != -1 ) // On a gagné
{
System.out.println("\n\n\t\tBravo vous avez gagné !" );
AfficheJeu();
}
else // On a perdu
{
System.out.println("Vous avez perdu !!!\n\n" );
System.out.println(" | 1 2 3 4 5 6 7 8 9 10\n" );
System.out.println("___|______________________________\n" );
for(lignes=0;lignes<10;lignes++)
{
if(lignes<9)
System.out.println(" %d | ",lignes+1);
else
System.out.println("%d | ",lignes+1);
for(colonnes=0;colonnes<10;colonnes++)
System.out.println("%c ",t2[lignes][colonnes]);
System.out.println("\n" );
}
}
System.out.println("pause" );
return 0;
}
}
-
Bonsoir,
Tout d'abord penses à utiliser la balise code pour poster des codes,
en inspectant ton code, j'ai relevé des points:
* Il faut revoir les paramètres passé à System.out.println dans les méthodes AfficheJeu(), Choisir() et main()
* Dans la méthode Choisir il y a une variables non définie: Comptes
* Dans ta méthode main() il y a la ligne:
Code:
sRand((time) Null);
je sais pas d'où vient time et Null??
-
Tout d'abord merci de ton aide. J'ai supprimé le srand qui était inutile. J'ai trouvé les erreurs dont tu m'as parlé c'est à cause des %c et %d que j'ai inséré dans le system.out.println, par contre je ne sais pas par quoi les remplacés.. Pourrais-tu m'aider ? Stp
-
Bonsoir, j'aimerai savoir que veut dire cette ligne:
Code:
System.out.println("i : %d | j : %d\n", lignes, colonnes);
Si ça tu veux dire par ça que le premier d prend la valeur de lignes et le second prend la valeur de colonnes, fait ceci :
Code:
System.out.println("i :"+lignes+"| j :"+colonnes+" \n");
L'erreur que tu fais c'est que la méthode println(), accepte un seul paramètre et toi tu lui passe plusieurs
-
Effectivement, je viens de vérifier et mon erreur concerne bien ce que tu viens de me signaler. Je vais essayé de voir ce que je peux faire pour corriger mon programme. En tout cas Merci ! :)