Algorithme " Boucle "
Résolu
Jiko-java
Messages postés
189
Statut
Membre
-
Jiko-java Messages postés 189 Statut Membre -
Jiko-java Messages postés 189 Statut Membre -
Bonjours , voilà j'ai fait un ptit programme qui consiste a deviner un nombre de 0 à 100 et "l'ordinateur " doit essayer de le trouver , voilà mais je trouve mon code assez lourds , chargé , et j'ai l'impression utiliser beaucoup de référence mémoire pour rien , je sais que je commet encore beaucoup d'erreur comme le fait d'utiliser Des System et des Scanner dans mes méthodes mais je ne trouve pas d'autre altérnatives :/ .. Quelqu'un peut il m'aider à l'améliorer tant au niveaux du code , qu'au niveaux algorithmique Merci !.
Voici mon code :
Voici mon code :
public class C4 {
public static java.util.Scanner scanner = new java.util.Scanner(System.in);
public static void main(String[]args){
System.out.println("Penser à un nombre je vais essayer de le trouver ");
int nombreMyst = nombreMystere();
System.out.println("j'ai mis " + nombreMyst + " tentatives pour trouver votre nombre " );
}
public static int nombreMystere(){
int valMin = 0;
int valMax = 100;
char carac;
int nombreOrdi;
int cmt = 0;
do{
System.out.println("Est-ce votre nombre ?");
nombreOrdi = unEntierAuHasardEntre(valMin,valMax);
if(nombreOrdi == valMin && valMin < 100){
if(valMax == valMin){
System.out.println("Vous etes un mauvais joueur");
return nombreOrdi;
}
valMin = (nombreOrdi + 1);
nombreOrdi = valMin;
}
if(nombreOrdi == valMax && valMax < 100){
if(valMax == valMin){
System.out.println("Vous etes un mauvais joueur");
return nombreOrdi;
}
valMax = (nombreOrdi - 1);
nombreOrdi = valMax;
}
System.out.println(nombreOrdi);
carac = lirecarac();
if(carac == '+'){
valMin = nombreOrdi;
}
if(nombreOrdi == valMax){
valMax = (nombreOrdi+1);
}
if(carac == '-'){
valMax = nombreOrdi;
}
cmt++;
}while(carac != '=');
return cmt;
}
public static char lirecarac(){
char reponse;
do{
reponse = scanner.next().charAt(0);
if(reponse != '+' && reponse != '-' && reponse != '='){
System.out.println("Veuillez + , - ou = ");
}
if(reponse == '+'){
return reponse;
}
if(reponse == '-'){
return reponse;
}
if(reponse == '='){
return reponse;
}
}while(reponse != '+' && reponse != '-' && reponse != '=');
return reponse;
}
public static int unEntierAuHasardEntre (int valeurMinimale, int valeurMaximale){
double nombreReel;
int resultat;
nombreReel = Math.random();
resultat = (int) (nombreReel * (valeurMaximale - valeurMinimale + 1))
+ valeurMinimale;
return resultat;
}
}
A voir également:
- Algorithme " Boucle "
- Logiciel algorithme euromillion - Télécharger - Loisirs créatifs
- Ecrire un algorithme qui permet de resoudre ax²+bx+c=0 pdf - Forum Algorithmes / Méthodes
- Tv orange chargement en boucle ✓ - Forum TV & Vidéo
- Algorithme application pc - Télécharger - Édition & Programmation
- Xiaomi s'éteint tout seul et se rallume en boucle - Forum Xiaomi
1 réponse
Bonjour,
je sais que je commet encore beaucoup d'erreur comme le fait d'utiliser Des System et des Scanner dans mes méthodes mais je ne trouve pas d'autre altérnatives :/
Tu as déjà des exemples dans tes discussions précédentes. Il faut découper ton code en méthodes, leur rajouter des paramètres, et faire de la transmission de paramètres d'une méthode à l'autre.
Le bon découpage pour moi, c'est de n'avoir aucun System/Scanner dans les même méthodes que les if/while.
je sais que je commet encore beaucoup d'erreur comme le fait d'utiliser Des System et des Scanner dans mes méthodes mais je ne trouve pas d'autre altérnatives :/
Tu as déjà des exemples dans tes discussions précédentes. Il faut découper ton code en méthodes, leur rajouter des paramètres, et faire de la transmission de paramètres d'une méthode à l'autre.
Le bon découpage pour moi, c'est de n'avoir aucun System/Scanner dans les même méthodes que les if/while.
public class C4 { public static java.util.Scanner scanner = new java.util.Scanner(System.in); public static void main(String[]args){ System.out.println("Penser à un nombre je vais essayer de le trouver "); int valMin = 0; int valMax = 100; char carac = ' '; int nombreOrdi = 0; int cmt = 0; int nombreMyst = 0; char reponse = ' '; System.out.println("Est-ce votre nombre ?"); nombreMyst = nombreMystere(valMin , valMax , carac , nombreOrdi , cmt , reponse); System.out.println("j'ai mis " + nombreMyst + " tentatives pour trouver votre nombre " ); } public static int nombreMystere(int valMin , int valMax , char carac , int nombreOrdi, int cmt , char reponse){ do{ nombreOrdi = unEntierAuHasardEntre(valMin,valMax); if(nombreOrdi == valMin && valMin < 100){ valMin = (nombreOrdi + 1); nombreOrdi = valMin; } if(nombreOrdi == valMax && valMax < 100){ valMax = (nombreOrdi - 1); nombreOrdi = valMax; } System.out.println(nombreOrdi); carac = lirecarac(reponse); if(carac == '+'){ valMin = nombreOrdi; } if(nombreOrdi == valMax){ valMax = (nombreOrdi+1); } if(carac == '-'){ valMax = nombreOrdi; } cmt++; }while(carac != '='); return cmt; } public static char lirecarac(char reponse){ do{ reponse = scanner.next().charAt(0); if(reponse != '+' && reponse != '-' && reponse != '='){ System.out.println("Veuillez + , - ou = "); } if(reponse == '+'){ return reponse; } if(reponse == '-'){ return reponse; } if(reponse == '='){ return reponse; } }while(reponse != '+' && reponse != '-' && reponse != '='); return reponse; } public static int unEntierAuHasardEntre (int valeurMinimale, int valeurMaximale){ double nombreReel; int resultat; nombreReel = Math.random(); resultat = (int) (nombreReel * (valeurMaximale - valeurMinimale + 1)) + valeurMinimale; return resultat; } }À noter qu'au delà de la séparation de System.out et Scanner dans des méthodes différentes je les ai même basculé dans des classes différentes.
Dans de vrai programmes Java ces classes là pourraient même être dans des modules différents pour marquer l'architecture n-tiers de Java. Il pourrait d'ailleurs y avoir plusieurs classes Message (ou mécanisme équivalent) pour gérer plusieurs langues.
import java.util.Scanner; class Message { public static final String REGLE_JEU = "Pensez à un nombre entre %d et %d."; public static final String COMMENCER = "Appuyez sur Entrée pour commencer."; public static final String PROPOSITION = "Est-ce que %d est votre nombre ?"; public static final String CHOIX_1_EGAL = "1) Oui, c'est bien %d"; public static final String CHOIX_2_PLUS = "2) Non, c'est plus que %d"; public static final String CHOIX_3_MOINS = "3) Non, c'est moins que %d"; public static final String VICTOIRE = "J'ai trouvé votre nombre en %d tours !"; public static final String MAUVAIS_JOUEUR = "Vous êtes un mauvais joueur, vos réponses ne sont pas cohérentes !"; public static void afficher(String message, Object... parametres) { System.out.printf(message + "\n", parametres); } } class Clavier { private static final Scanner scanner = new Scanner(System.in); public static String lireLigne() { return scanner.nextLine(); } public static int lireEntier(int min, int max) { while (true) { try { int n = Integer.parseInt(scanner.nextLine()); if (n >= min && n <= max) return n; System.err.println(n); } catch (Exception e) { System.err.println(e); } } } } public class PlusMoins { private final int minimumUtilisable, maximumUtilisable; private int minimumPossible, maximumPossible; private int nombrePropositions; private int dernierNombreChoisi; private boolean partieEnCours; public PlusMoins(int min, int max) { minimumUtilisable = min; maximumUtilisable = max; } public void jouer() { nouvellePartie(); introduction(); while (partieEnCours) { proposerNombre(); int reponse = demanderResultat(); reflechir(reponse); } } private void nouvellePartie() { partieEnCours = true; nombrePropositions = 0; minimumPossible = minimumUtilisable; maximumPossible = maximumUtilisable; } private void introduction() { Message.afficher(Message.REGLE_JEU, minimumUtilisable, maximumUtilisable); Message.afficher(Message.COMMENCER); Clavier.lireLigne(); } private void proposerNombre() { nombrePropositions++; dernierNombreChoisi = (minimumPossible + maximumPossible) / 2; Message.afficher(Message.PROPOSITION, dernierNombreChoisi); } private int demanderResultat() { Message.afficher(Message.CHOIX_1_EGAL, dernierNombreChoisi); Message.afficher(Message.CHOIX_2_PLUS, dernierNombreChoisi); Message.afficher(Message.CHOIX_3_MOINS, dernierNombreChoisi); return Clavier.lireEntier(1, 3); } private void reflechir(int reponse) { switch (reponse) { case 1: partieEnCours = false; Message.afficher(Message.VICTOIRE, nombrePropositions); break; case 2: minimumPossible = dernierNombreChoisi + 1; break; case 3: maximumPossible = dernierNombreChoisi - 1; break; } if (minimumPossible > maximumPossible) { Message.afficher(Message.MAUVAIS_JOUEUR); partieEnCours = false; } } public static void main(String[] args) { PlusMoins jeu = new PlusMoins(0, 100); jeu.jouer(); } }concevoir et à comprendre cette forme d'architecture , cela étant certainement dû au fait que je n'ai encore jamais manipulé autant de méthode et de classe simultanément , j'essaierais de m'en inspiré de tant à autres pour mes prochains programmes Merci encore.
import java.util.Scanner; class Message { public static final String HERMES = "Hermes"; public static final String ZEUS = "Zeus"; public static final String MESSAGE_JEU = "Bienvenue Au Combat de DIEU GREC ENTRE Hermes et Zeus !"; public static final String JEU_COMMENCE = "C'est Hermes qui commence a frapée"; public static final String DEGAT_INFLIGER = " inflige %d Points de dégât à."; public static final String POINT_VIE = "Il lui reste %d Points de vie."; public static final String VIE_ENDANGER = "Sa sera à votre Tour de frapper Mais sa vie est en Danger !"; public static final String MORT = " est mort."; public static final String ARRETER = "Voulez vous Arreter le combat (O/N)"; public static final String STOP = "Vous avez Stopper le combat"; public static void afficher(String message, Object... parametres) { System.out.printf(message + "\n", parametres); } } class Clavier { private static final Scanner scanner = new Scanner(System.in); public static char lireCarac(){ return scanner.next().charAt(0); } } public class Jeu{ private int vieHermes; private int vieZeus; private int degat; private char choix; public Jeu(int vieHermes, int vieZeus , int degat , char choix) { this.vieHermes = vieHermes; this.vieZeus = vieZeus; this.degat = degat; this.choix = choix; } public void jouer() { Message.afficher(Message.MESSAGE_JEU ); Message.afficher(Message.JEU_COMMENCE , Message.HERMES); do{ if(vieHermes > 0){ degat = unEntierAuHasardEntre(1,6); vieZeus = vieZeus - degat; Message.afficher(Message.HERMES, Message.DEGAT_INFLIGER , degat , Message.ZEUS); if(vieZeus > 0){ Message.afficher(Message.POINT_VIE , vieZeus); } } if(vieZeus > 0){ degat = unEntierAuHasardEntre(1,6); vieHermes = vieHermes - degat; Message.afficher(Message.ZEUS, Message.DEGAT_INFLIGER , degat , Message.HERMES); if(vieHermes > 0){ Message.afficher(Message.POINT_VIE , vieHermes); } } if(vieHermes < vieZeus){ choix = seRetirerDuCombat(vieHermes, vieZeus); if(choix == 'O'){ Message.afficher(Message.STOP); return; } } }while(vieHermes > 0 && vieZeus > 0); if(vieHermes > 0){ Message.afficher(Message.ZEUS , Message.MORT); } else{ Message.afficher(Message.HERMES , Message.MORT); } } public char seRetirerDuCombat(int vieCogneDure , int vieFrappeFort){ char reponse = ' '; do{ Message.afficher(Message.VIE_ENDANGER); Message.afficher(Message.ARRETER); reponse = Clavier.lireCarac(); }while(reponse != 'O' && reponse != 'N'); return reponse; } private void introduction(){ Message.afficher(Message.MESSAGE_JEU, Message.HERMES , Message.ZEUS); Message.afficher(Message.JEU_COMMENCE); } public int unEntierAuHasardEntre (int valeurMinimale, int valeurMaximale){ double nombreReel; int resultat; nombreReel = Math.random(); resultat = (int) (nombreReel * (valeurMaximale - valeurMinimale + 1)) + valeurMinimale; return resultat; } public static void main(String[]args){ Jeu jeu = new Jeu(25,25,0,' '); jeu.jouer(); } }