Jeu des 13 allumettes en JAVA

Fermé
baka no emily Messages postés 56 Date d'inscription dimanche 25 mars 2007 Statut Membre Dernière intervention 13 mai 2012 - 9 nov. 2011 à 23:08
KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 - 15 nov. 2011 à 14:05
Bonjour,

J'ai programmé le célèbre jeu des 13 allumettes de fort boyard en JAVA. Il compile, mais je n'arrive pas à faire alterner les joueurs ( en fait je n'arrive pas à faire jouer l'ordinateur ).
Si quelqu'un voyait pourquoi ... (je suis débutante de chez débutante).

Merci d'avance


Voici le code source :



/** Jouer au jeu des 13 allumettes contre l'ordinateur
* @author Emilie Abia
*/
class Allumettes {

public static void main(String[] args) {
// Demander l'identité de l'utilisateur
String nom;
System.out.println("Quel est votre nom ?");
nom = Console.readString();

// Saisir la difficulté souhaitée
char reponse;
char niveau;
System.out.println("Niveau de l'ordinateur (n)aïf, (d)istrait ou (e)xpert ?");
Console.skipWhite();
reponse = Console.readChar();
if (reponse == 'n' || reponse == 'N' || reponse == 'd' || reponse == 'D' || reponse == 'e' || reponse == 'E')
niveau = reponse;
else {
niveau = 'e';
System.out.println("Commande inconnue, nous passons en mode expert.");
}

// Déterminer qui commence la partie
char depart = 'o';
boolean tourHumain = false;
System.out.println("Est-ce que vous commencez (o/n) ?");
Console.skipWhite();
depart = Console.readChar();
if (depart =='o' || depart == 'O')
tourHumain = true; // L'utilisateur commence
else
tourHumain = false; // L'ordinateur commence

// Jouer une partie
int reste = 13;
do {
//Afficher le nombre d'allumettes restantes

for (int ligne = 1; ligne <= 3; ligne++) {
for (int colonne = 1; colonne <= reste; colonne++) {
System.out.print("| ");
if (colonne % 5 == 0) {
System.out.print(" ");
}
}
System.out.println(" ");
}
// Demander à un joueur le nombre d'allumettes prises
int choix;
char quitter;

// Demander à l'utilisateur le nombre d'allumettes prises
if (tourHumain = true) {
boolean choixCorrect = false;
System.out.println(nom + ", combien prenez-vous d'allumettes ?");
Console.skipWhite();
choix = Console.readInt();
if (choix > 3)
System.out.println("La prise est limitée à 3 allumettes maximum !");
else if (choix > reste)
System.out.println("Il reste seulement" + reste + "allumettes dans le tas");
else if (choix < 0)
System.out.println("saisie invalide");
else if (choix == 0) {
System.out.println("Voulez-vous vraiment quitter la partie ? (o/n)");
quitter = Console.readChar();
if (quitter == 'o' || quitter == 'O')
reste = 0;
else
{
System.out.println(nom + ", combien prenez-vous d'allumettes ?");
Console.skipWhite();
choix = Console.readInt();
}
} else {
choixCorrect = true;
reste = reste - choix; // Retirer les allumettes prises par l'utilisateur
tourHumain = false;
}

// Faire tirer des allumettes à l'ordinateur selon le niveau choisi
} else {
System.out.println("Ordinateur, combien prenez-vous d'allumettes ?");
switch (niveau)
{
case 'n':
case 'N':
if (reste >= 3)
choix = Generateur.nextInt(3) + 1;
else
choix = Generateur.nextInt(reste - 1) + 1;
break;
case 'd':
case 'D':
choix = Generateur.nextInt(3) + 1;
break;
default:
if (reste % 4 == 1)
choix = 1;
else
choix = (reste - 1) % 4;

}
reste = reste - choix; // Retirer les allumettes prises par l'ordinateur

}

} while (reste !=0);

// Afficher le vainqueur
if (tourHumain == true)
System.out.println("Félicitation, vous avez remporté la partie ! ");
else
System.out.println("Ordinateur a gagné ! ");

}
}




A voir également:

5 réponses

KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 3 015
Modifié par KX le 9/11/2011 à 23:23
Ton problème vient de ta condition if (tourHumain = true) vers la ligne 60
Tu dois mettre l'opérateur == sinon ce n'est pas un test que tu fais mais une affectation.
Remarque : vu que c'est un boolean tu peux directement écrire if (tourHumain)
La confiance n'exclut pas le contrôle
1
KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 3 015
12 nov. 2011 à 16:58
Je viens de regarder en détail ton code

1) tu n'utilises pas boolean choixCorrect, tu peux faire comme ça :

if (!choixCorrect)
	continue; // recommence le do


2) avant de finir ta boucle do, tu dois inverser le joueur, lorsque c'est l'ordinateur qui joue, à ce moment là il serait intéressant d'afficher combien l'ordinateur a enlevé d'allumettes.

reste = reste - choix; // Retirer les allumettes prises par l'ordinateur
tourHumain = true;
System.out.println(choix);


3) Je ne sais pas comment est faite la classe Generateur de ton prof, mais si elles sont faites comme les miennes, tu vas avoir une erreur si tu fais Generateur.nextInt(reste-1)+1; quand reste==1 car cela revient à choisir un nombre aléatoire entre 0 inclu et 0 exclu ce qui n'a pas de sens. Mais il suffit de gérer ce cas particulier pour passer outre cette erreur :

if (reste >= 3)
	choix = Generateur.nextInt(3) + 1;
else if (reste==1)
	choix = 1;
else
	choix = Generateur.nextInt(2)+1;

Pour information voici comment moi j'ai fait Console et Generateur pour tester ton code :

class Console
{
private static final java.util.Scanner sc = new java.util.Scanner(System.in);	
public static String readString() { return sc.nextLine(); }
public static void skipWhite() {}
public static char readChar() { return sc.nextLine().charAt(0);	}
public static int readInt() { return Integer.parseInt(sc.nextLine()); }	
}

class Generateur
{
private static final java.util.Random rd = new java.util.Random();	
public static int nextInt(int i) { return rd.nextInt(i); }
}
1
KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 3 015
Modifié par KX le 12/11/2011 à 17:08
4) Si ton ordinateur est en mode (d)istrait, il peut prendre plus d'allumettes qu'il n'en reste !
En fait ce mode ne sert à rien... Il fait pareil que (n)aïf mais les bugs en plus !
D'ailleurs, la partie se continue lorsque tu as un nombre négatif d'allumettes ! Il faudrait faire :

while (reste>0);
0
baka no emily Messages postés 56 Date d'inscription dimanche 25 mars 2007 Statut Membre Dernière intervention 13 mai 2012
13 nov. 2011 à 13:23
Merci beaucoup ! Je vais corriger tout ça
0
baka no emily Messages postés 56 Date d'inscription dimanche 25 mars 2007 Statut Membre Dernière intervention 13 mai 2012
13 nov. 2011 à 13:24
Pour le mode distrait il s'agit en fait de jouer en mode naïf ou en mode expert selon le niveau de distraction de l'ordinateur, je ne sais pas trop comment faire ça.
0
KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 3 015
13 nov. 2011 à 13:33
Une idée :

boolean intelligent;

switch (niveau)
{
    case 'n': case 'N': intelligent=false; break;
    case 'd': case 'D': intelligent=(Generateur.nextInt(2)==1); break;
    case 'e': case 'E': intelligent=true; break;
}

if (intelligent)
{
    if (reste % 4 == 1)
        choix = 1;
    else
        choix = (reste - 1) % 4;
}
else
{
    if (reste >= 3)
        choix = Generateur.nextInt(3) + 1;
    else if (reste==1)
        choix = 1;
    else
        choix = Generateur.nextInt(2)+1;
}
0
baka no emily Messages postés 56 Date d'inscription dimanche 25 mars 2007 Statut Membre Dernière intervention 13 mai 2012
13 nov. 2011 à 14:56
Intéressant ! Je vais méditer là dessus.
Ceci étant dit je n'ai pas compris la partie sur le choixCorrect (conseil 1) ) :
Dans mon code il "reçoit" faux au départ (je ne sais pas trop pourquoi d'ailleurs, conseil du prof) et donc je parcours un peu tous les cas d'erreur et ainsi si nous ne sommes dans aucun de ces cas de figure il reçoit vrai. Est-ce insuffisant ?
0
baka no emily Messages postés 56 Date d'inscription dimanche 25 mars 2007 Statut Membre Dernière intervention 13 mai 2012
9 nov. 2011 à 23:11
Houla désolé c'est imbuvable, j'ai perdu l'indentation.
0
KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 3 015
9 nov. 2011 à 23:20
Ne t'inquiètes pas on a l'habitude ^^

La prochaine fois tu utiliseras les balises de code :

<code>
    code indenté
</code>
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
baka no emily Messages postés 56 Date d'inscription dimanche 25 mars 2007 Statut Membre Dernière intervention 13 mai 2012
9 nov. 2011 à 23:36
Génial ! Merci beaucoup, réponse super rapide en plus.
Je ne peux pas vérifier si cela marche parce que mon mac ne reconnait pas "la classe Generateur" mais à l'école ça devrait marcher je pense et j'espère.

Bonne soirée
0
KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 3 015
10 nov. 2011 à 00:11
En effet, les classes Console, et Generateur n'existent pas dans la librairie standard, mais tu peux demander à ton prof de te passer la bibliothèque à ajouter pour l'utiliser chez toi.
Remarque : parfois il suffit de taper le nom du prof sur Google, pour trouver sa page web, et la bibliothèque qu'il utilise... d'autant que ce n'est pas forcément lui qui l'a faite ;-)
Tu peux aussi apprendre à te servir de l'API standard et ainsi ne pas avoir ce genre de problèmes, même si pour l'instant ton prof t'impose cette bibliothèque pour commencer en douceur avec Java :)
0
baka no emily Messages postés 56 Date d'inscription dimanche 25 mars 2007 Statut Membre Dernière intervention 13 mai 2012
12 nov. 2011 à 16:11
Oui je lui demanderai ça, pour ce qui est de la classe Console je l'ai ajouté et j'ai énormément galéré rien que pour ça ahah.

Ceci étant dit : Avant seul l'utilisateur pouvais jouer j'ai donc corrigé l'erreur comme vous me l'avez indiqué mais maintenant l'utilisateur ne peut faire que le premier coup ensuite seul l'ordinateur joue. J'ai réalisé qu'à la fin du tour ordinateur j'avais oublié un tourHumain donc je l'ai ajouté mais ça ne fonctionne quand même pas.

Si vous avez une idée ...
0