====== Correction TP1 ======
On suppose que toutes vos classes sont dans le même package : ici ''com.mco''. A la fin du TP, vous aurez deux classes (donc deux fichiers) :
* ''Main.java'' qui contient le programme principal,
* ''Dice.java'' pour le dé
Pour exécuter ce programme chez vous :
* créez un projet intellij comme pour le TP1 et placez le package de base à ''com.mco''
* créez une classe ''Dice'' dans le même package (voir [[public:mco-2:un_projet_complet:card#Créez des classes avec Intellij et la fenêtre projet|cette partie du cours]])
* copiez/collez les 2 fichiers.
* exécutez votre programme.
===== Les classes =====
On montrera la classe Dice et son utilisation avec la méthode main de la classe Main.
==== Dice.java ====
package com.mco;
import java.util.Random;
public class Dice {
private int position; // Méthode générée automatiquement
private Random randomGenerator;
public Dice(int positionInitiale) {
position = positionInitiale;
randomGenerator = new Random();
}
public Dice() {
this(1);
}
public int getPosition() { // Méthode générée automatiquement
return position;
}
public void setPosition(int position) { // Méthode générée automatiquement
this.position = position;
}
public void roll() {
position = randomGenerator.nextInt(6) + 1;
}
@Override
public String toString() { // Méthode générée automatiquement
return "Dice{" +
"position=" + position +
'}';
}
@Override
public boolean equals(Object o) { // Méthode générée automatiquement
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Dice dice = (Dice) o;
return getPosition() == dice.getPosition();
}
@Override
public int hashCode() { // Méthode générée automatiquement
return getPosition();
}
}
Spécificités :
* deux constructeurs, celui sans paramètre appelant celui avec un paramètre,
* le générateur de nombre aléatoire est placé en attribut privé de la classe.
* les méthodes ''getPosition'', ''setPosition'', ''toString'', ''equals'' et ''hashcode'' ont été générées automatiquement.
==== Main.java ====
package com.mco;
public class Main {
static void testDice() {
System.out.println("---- Basic Dice tests ----");
Dice firstDice = new Dice();
System.out.println(firstDice); // position=1
firstDice.setPosition(5);
System.out.println(firstDice); // position=5
Dice secondDice = new Dice(firstDice.getPosition());
System.out.println(firstDice == secondDice); // false
System.out.println(firstDice.equals(secondDice)); // true
firstDice.setPosition(2);
System.out.println(firstDice.equals(secondDice)); // false
}
static void testRandom() {
System.out.println("---- Random tests ----");
final int NUMBER_TRIES = 100;
int numberOf1 = 0;
Dice dice = new Dice();
for (int i=0; i < NUMBER_TRIES; i+=1 ) {
dice.roll();
if (dice.getPosition() == 1) {
numberOf1 += 1;
}
}
System.out.println("Number of 1: " + numberOf1 + "/" + NUMBER_TRIES); // 100 / 6 ~= 17
System.out.println("Probability: " + (float)numberOf1 / NUMBER_TRIES); // 1 / 6 ~= 1.167
}
public static void main(String[] args) {
testDice();
testRandom();
}
}
Spécificités :
* des commentaires pour vérifier que les réponses sont correctes.
* utilisation de méthodes statiques dans la classe Main pour rendre la lecture plus aisée,
* mot clé ''final'' pour les constantes
* on caste un entier en réel (''float'') pour que la division soit réelle et non entière.