Algorithme " Boucle "

Résolu/Fermé
Jiko-java Messages postés 186 Date d'inscription dimanche 25 septembre 2016 Statut Membre Dernière intervention 22 juillet 2017 - 23 févr. 2017 à 22:31
Jiko-java Messages postés 186 Date d'inscription dimanche 25 septembre 2016 Statut Membre Dernière intervention 22 juillet 2017 - 27 févr. 2017 à 23:41
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 :
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;
   } 

}

1 réponse

KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 3 015
24 févr. 2017 à 07:05
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.
0
Jiko-java Messages postés 186 Date d'inscription dimanche 25 septembre 2016 Statut Membre Dernière intervention 22 juillet 2017
24 févr. 2017 à 20:23
D'accord je vais essayé Mais Sinon pour l'algorithme C'est Bien Où C'est possible de l'améliorer ? Parce que je trouve le code assez conséquent , chargé :/
0
Jiko-java Messages postés 186 Date d'inscription dimanche 25 septembre 2016 Statut Membre Dernière intervention 22 juillet 2017
25 févr. 2017 à 01:06
Voilà j'ai fait mon possible pour évité de re écrire un peut partout des Systems et des scanners cependant je me suis aperçu qu'en touchant trop aux codes... . Sa changeais le rendu de mon programme . Je comprends le principe du passages en paramètre ,Mais j'ai encore du mal a visualisé ou mettre mes System mes Scanner tout en gardant un cohérence dans l'affichage de mon programme :/ ...


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;
   } 

}

0
KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 3 015
25 févr. 2017 à 13:59
Ci-dessous un exemple de code inspiré de ce que tu voulais faire :

À 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();
    }
}
0
Jiko-java Messages postés 186 Date d'inscription dimanche 25 septembre 2016 Statut Membre Dernière intervention 22 juillet 2017
25 févr. 2017 à 16:41
D'accord Merci Beaucoup pour ces remarques , j'essaierais d'en tenir comptes Mais j'ai encore beaucoup de mal à
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.
0
Jiko-java Messages postés 186 Date d'inscription dimanche 25 septembre 2016 Statut Membre Dernière intervention 22 juillet 2017
25 févr. 2017 à 20:13
Re Bonjours, Voilà je viens de faire un Programme de Jeu de Combat entre 2 Dieu grec : Hermes , Zeus , Les 2 Dieux Se frapperont à tour de rôles jusqu’à ce que l'un d'entre eux meurt , Si Hermes Sent que sa Vie bascule il peut choisir de battre en retrait , Pour ce faire je me suis inspiré de votre code en ce qui concerne l'affichage cependant , Mon affichage n'est pas encore en point et je ne vois pas le problème :/ Je voulais aussi savoir a quoi sert le %d , Voici mon code , Si Mon code peut être plus clair et plus concis faites le moi savoir s'il vous plait j'en serais ravis:



 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();
    }
   }
 
0