[java] apprentissage difficile!

Bonsoir,

j essaye d’apprendre le java par des programme simple

voila mon premier :
un lancé de dé (10 lancés) et si la somme des 2 dés fait 7, on ajoute 10 points au score


/*
 * Main.java
 *
 * Created on 26 mars 2007, 19:02
 *
 * To change this template, choose Tools | Template Manager
 * and open the template in the editor.
 */

package nfe114chap01jeudede;

/**
 *
 * @author Florent
 */
public class Main {
 

    /** Creates a new instance of Main */
    public Main() 
    {
    public String name;
    int score;
    int Facevalue;
    int random1;
    int random2;
    }
    
    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        // TODO code application logic here
    System.out.println("Entrez votre Nom:");
    name = new InputStreamReader(System.in);

    for(i=0;i<10;i++)
        {
        System.out.println("Nombre de lancement des dés" +i);
        System.out.println("Lancement du premier dé");  
        random1 = new Random(); 

        System.out.println("Lancement du deuxième dé");  
        random2 = new Random(); 
    
         if((random1+random2)==7)
            score=score+10;
        }
    
     System.out.println("Bravo, vous etes dans les meilleurs scores");  
        
    }
    
}

mais il y a plein d erreur, notamment a la declaration de ma variable string! et je ne comprends pas trop pourquoi…

merci d’avance

Apparemment tu n’es pas habitue’ aux objets :wink:
Les variables doivent etre dans ta classe et pas dans ton constructeur. Il sert juste a les initialiser, pas a les declarer. :non:
Essaye ca:


/*
 * Main.java
 *
 * Created on 26 mars 2007, 19:02
 *
 * To change this template, choose Tools | Template Manager
 * and open the template in the editor.
 */

package nfe114chap01jeudede;

/**
 *
 * @author Florent
 */
public class Main {
 
    private String name;
    private  int score;
    private  int Facevalue;
    private int random1;
    private int random2;
    /** Creates a new instance of Main */
    public Main() 
    {
      /* initialise ici */
    }
    
    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        // TODO code application logic here
    System.out.println("Entrez votre Nom:");
    name = new InputStreamReader(System.in);

    for(i=0;i<10;i++)
        {
        System.out.println("Nombre de lancement des dés" +i);
        System.out.println("Lancement du premier dé");  
        random1 = new Random(); 

        System.out.println("Lancement du deuxième dé");  
        random2 = new Random(); 
    
         if((random1+random2)==7)
            score=score+10;
        }
    
     System.out.println("Bravo, vous etes dans les meilleurs scores");  
        
    }
    
}

Private fait que la variable ne sera visible que a l’interieur de ta classe.
Et public comme son nom l’indique indique que ta variable pourra etre appele’ sans etre a l’interieur de ta classe.

Je te propose d’aller ici pour apprendre java et les objets car si je me souviens bien, en java tout ou presque est objet.

Pour le reste ton code semble bon, je suis faineant ce soir j’ai pas trop regarde’ la logique. :ane:
Bonne chance :super:

autre chose qui me choque. Tu créé 2 objet Random que tu additionnes par la suite. En gros ça revient à additionner leur adresse (=pointeur en C).

Dans la classe Math, tu as une méthode random() qui te renvoie un float entre 0.0 et 1.0
Pour ton prog, il suffirait de faire
int lancer1 = (int)(Math.random()*6)

Ouaip, puis pour bien commencer avec l’objet, il vaut mieux faire ton code dans les méthode d’instance de la classe plutôt que dans le main ou les méthodes statiques en général.
donc tu crée une instance de Main, et tu lance un Main.uneMethode() et tu ne fait rien d’autre dans le main: quand tu commencera à faire du polymorphisme (de la surcharge de méthode etc.) ça t’évitera des problèmes.

petit détail, le nommage en Java est important: le nom de classe doit représenter ce qu’elle fait et “Main” c’est pas explicite.

ete pour le nom de package il y a une convention aussi, c’est un nom de domaine inversé (si tu en as un) avec ensuite le nom du projet ou autre spération en bib:
exemple
fr.florent42.lancementdede

à mon avis, il travaille avec Netbeans. Cet ide te permet de créer rapidement des classes et si tu lu indique que c’est la classe principale, il la nomme Main (ouais c’est nul cette fonction)

Ah oui d’accord, c’est un peu nul ces outils qui génèrent le code un peu n’importe comment, comme together aussi.
Pour moi un outil, soit il te génère tou, et il le fait bien jusqu’au bout, et tu n’as pas à modifier ni voir les classes, soit il te laisse tranquille et il te laisse faire ton code.

Florent, Utilise Eclipse! ok c’est galère au début quand on ne sait pas bien créer sont projet, mais il y a vraiment toutes les foncitonalités pour faire du bon code.

Euh non, c’est plutôt:
int lancer1 = (int)(1 + Math.random()*5);

Sur un dé à 6 faces, c’est pas de 0 à 6 mais de 1 à 6 :ane:

tu peux pas comprendre, ce sont des nouveaux dés qui viennent de sortir :o

(et moi aussi, je vais sortir)

merci beaucoup pour vos reponses!

effectivement j’utilise Netbeans et effectivement je suis connais peu l objet…etant plus un habitué du PHP4

mais je pense que java en vaut vraiment la peine et je veux m y interesser, car j ai a terme un projet en entreprise (simple!) mais j aimerais pas connaitre un peu plus que ca a terme

Pour l’instant je vais essayer de faire fonctionner ce code simple, et puis après je le remettrais un peu dans les règles de l art avec votre aide si ca ne vous derange pas!

j ai un autre pb qui apparait légèrement plus loin:
name = new InputStreamReader(System.in); < cannot find symbol

et ce genre d erreur je l ai un paquet de fois.

N es ce pas lié a un "import" non fait?

effectivement, il te manque en début de fichier import java.io.InputStreamReader;

Netbeans doit te proposer une aide sur la ligne (une petitee lampe jaune de mémoire).

Si. Sous Eclipse ça se résout à coup de Ctrl Shift O :slight_smile:

Et plusieurs choses que j’ai lu :

  1. name = new InputStreamReader(System.in);

Marchera jamais. Déjà parce que name n’a pas de type, et de deux parce qu’un Reader ne sert pas trop à récupérer un nom sur la ligne de commande.

Si tu veux faire ça, utilise l’excellent classe qu’est Scanner.

De mémoire ça se résoud ainsi :

String name = new Scanner(System.in).nextLine();

(là je crée pas de variable inutile de type Scanner, juste le nom)

Pour la classe Random, tu peux t’en servir bien sûr.

Random rd = new Random();

int n = rd.nextInt();
int m = rd.nextInt();

if (n + m == 7) {
  // TODO
}

Tu as aussi la classe SecureRandom, qui devrait te donner plus de sécurité (mais dans ton cas, c’est pas utile du tout).

Un conseil : bookmark ça ! -> http://java.sun.com/javase/6/docs/api/

(et vive Java 5/6, Java 1.4 c’est du caca, y a pas les generics!)

j avais la javadoc a coté de moi, le pb c est que j ai du mal a la lire…

par exemple , les import ben je l ai ai pas vu…

donc j ai modifier/corriger un paquet de chose mais il me me reste encore un problème:

score=score+10; qui me met une erreur de non-static varaible score connote be referenced from a static context…

tu peux mettre ton code?

edit : c’est normal si tu fais tout ton code dans le main.
commence par créer une méthode dans ta classe qui reprendra tout le code, puis de ton main tu appelles cette méthode.

j ai tenté…mais c pas couronné de succès…


/*
* Main.java
*
* Created on 26 mars 2007, 19:02
*
* To change this template, choose Tools | Template Manager
* and open the template in the editor.
*/

package nfe114chap01jeudede;
import java.io.*;
import java.util.Scanner;
import java.util.Random;

/**
*
* @author Florent
*/
public class Main {

   private String name;
   private int score;
   private int Facevalue;
   private int random1;
   private int random2;
   /** Creates a new instance of Main */
   public Main()
   {
     /* initialise ici */
   }
   
   /**
    * @param args the command line arguments
    */
   public static void main(String[] args) {
       // TODO code application logic here
       lancement_de();
   }

public lancement_de()
    {
    System.out.println("Entrez votre Nom:");
   
    String name = new Scanner(System.in).nextLine();

    for(int i=0;i<10;i++)
       {
       System.out.println("Nombre de lancement des dés" +i);
 
       Random rd = new Random();
       System.out.println("Lancement du premier dé");  
       int n = rd.nextInt();

       System.out.println("Lancement du deuxième dé");  
       int m = rd.nextInt();
 
        if (n + m == 7)
           score=score+10;
       }
   
     System.out.println("Bravo, vous etes dans les meilleurs scores");  
     }
   }
   


Java est différent du langage C. Ici il faut que tu commence par créer une classe Main. Puis ensuite tu utilise la réference pour appeler la méthode lancement_de()


public class Main 
{
 public static void main(String[] args) 
{
  Main reference = new Main(); //création de la classe en appelant son constructeur
  reference.lancement_de(); //utilisation de sa méthode
}

 //Constructeur
 public Main()
{
}

//Méthode permettant de faire une série de lancement de dé
private void lancment_de()
{
 //TODO
}
}

c est genial ca fonctionne!

mais une question bete mais…a quoi sert public Main?

Donc ainsi, il est tres facilement possible de decouper le code en créant une classe par exemple qui fera un calcul, une autre qui affichera le resultat et une autre qui mettra tout dans la se de données juste en ajoutant d un coté les classes et d un autre les reference aus main avec le nom de la méthode?

ai je bien compris?

Es til possible de raisonner ainsi totu sachant que les variables peuvent passer d une méthode a l autre puisqu elle sont interne a la classe et non aux méthode?

a aussi petit pb…le random va chercher des nombres complètement autre que les faces d un dé…

comment faire un nombre relatoire entre 1 et 7?

parce que 11108993 j aurais du mal a trouver ca sur un dé :wink: lol

peut etre avec netInt et IllegalArgumentException qu en pensez vous?

si je recupère la valeur n par exemple

et que je fais un if dessus en disant de refaire jusqu a que le nombre pris soit entre 1 et 7…ca devrait marcher

1 : c’est le constructeur de ta classe, c’est lui qui sert à reserver l’espace mémoire pour stocker la classe.

2 : j’ai pas tout compris, mais dans une classe tu peux avoir plusieurs méthode qui accède aux mêmes variables.

3 : oui

Essaie en utilisant le ‘modulo’
Random rd = new Random();
int x = rd.nextInt() % 7 //valeurs obtenues à verifier

Ou sinon achete un très grand dé :paf:

Le “public Main” c’est ce qu’on appelle le constructeur de la classe. Mais bon, là tu t’embrouilles un peu car tu as appelé la classe “Main”, d’habitude il vaut mieux choisir un autre nom. Donc si tu appelles ta classe autrement, tu remplaces ce “public Main()” par “public NomDeLaClasse()”. Un constructeur est une fonction particulière, dont tu ne précises aucun type de retour (pas de int, char ou autre…) et qui est appelée lorsque tu alloues un nouvel objet de cette classe avec l’opérateur “new”.

Exact, en gros tu découpes ton code en différents modules, chaque module pouvant contenir des variables et des fonctions.

Exact encore, une variable définie a l’intérieur d’une classe est accessible via toutes les fonctions de la classe.