Updates from novembre, 2009

  • Serieswatcher: Alertes mes séries tv préférées

    admin 22 h 01 min on 30 novembre 2009 | 0 Permalink | Reply
    Tags: , , serieswatcher

    Serieswatcher projet
    Projet java réalisé sous Eclipse : Serieswatcher !

    Début d’un nouveau projet nommé Serieswatcher. Ce projet consiste à créer un logiciel en java qui permet d’être mis au courant, d’être averti grâce à une alerte, des dernières dates de sorties des épisodes d’une série tv donnée. Par exemple je suis fan de la série Lost, Dexter et Greys anatomy, et j’aime regarder les épisodes sur internet dés qu’ils sortent. Serieswatcher permettra à tout fan de série tv de pouvoir être mis au courant directement lorsqu’un nouvel épisode est à l’affiche.

    Dans un premier temps, le projet consiste à parser une page html afin d’en extraire les multiples infos pertinentes sur une série tv précise. Certains sites web proposent des informations complètes sur les dates de sorties des séries. Néanmoins, il peut être intéressant d’être directement alerter, mis sous alerte, lorsqu’un nouvel épisode sort en tv.

    La première version de Serieswatcher pourrait être une version qui s’installe sur pc, avec icône dans la barre des taches qui émet une alerte dans la barre de taches en cas de nouvel épisode des séries tv choisis. Plus tard, peut-être une version pour gsm (Android), une version sous forme de ria (appli Facebook, applications web,…).

    Voici une première ébauche des classes qui composent ce projet. Serieswatcher dans sa première version, utilise déjà plusieurs classes déjà prédéfini dans le jdk. Par exemple la classe Pattern, la classe Matcher qui sont deux classes très importante pour parser le contenu d’une page html, afin de trouver des mises à jour d’informations. Excellent pour s’initier doucement aux concepts d’expressions régulières. L’expression à chercher se trouve dans le pattern, le matcher est le moteur de comparaison entre le modèle pattern compilé et le matcher.

    La classe urlConnection provenant de java.net pour se connecter à un site web avec java.

    Les objets de type LinkedList aussi sont utilisées dans Serieswatcher. Chaque saison, chaque épisode est contenu dans une liste doublement chainée LinkedList. Pas de tableau ici, car les tableaux en java ne peuvent grandir. Une LinkedList est donc mieux adaptée.

    Dans cette première version du logiciel Serieswatcher, une première interface graphique (gui) super basique à été commencée, il faut bien entendu continuer de la développer.
    Voici les classes qui composent, lors de cette version, le projet Serieswatcher (Main, Site, Serie, Saison, Episode, Modele, Vue, Controleur)

    Classe Main

    
    public class Main {
    	public static void main(String[] args) {
    		// on instancie les classes mvc, mais la Gui doit encore être programmée
    		Controleur controleur = new Controleur();
    		Vue vue = new Vue(controleur);
    		Modele modele = new Modele(controleur);
    		controleur.setVue(vue);
    		controleur.setModele(modele);
    
    		vue.pack();
    		vue.setVisible(true);
    	}
    }
    

    Affichage de la classe Site

    import java.io.BufferedReader;
    import java.io.InputStreamReader;
    import java.net.URL;
    import java.net.URLConnection;
    import java.util.LinkedList;
    import java.util.regex.Matcher;
    import java.util.regex.Pattern;
    
    public class Site {
    	/**
    	 * Cette méthode permet de récupérer une page HTTP (en HTML) depuis un site
    	 * donné avec un nom de série donné sous forme d'une liste chainée.
    	 *
    	 * @pre    serieName doit être le nom d'une série dans le format du
    	 * 		 	site (ex.: "PrisonBreak" ok, "Prison Break" pas ok)
    	 * @return une page HTML sous forme d'une liste chainée de String
    	 * 			où chaque String contient une ligne du code source de la page
    	 *
    	 * @todo : traiter le cas où la série n'existe pas + lever exception
    	 */
    	public static LinkedList<String> getHttpPage(String serieName) {
    		String sURL = "http://www.epguides.com/" + serieName;
    		String line = ""; // empty HTML page
    		LinkedList<String> pageCodeList = new LinkedList<String>();
    
    		try {
    			URL epguides = new URL(sURL);
    	        URLConnection conn = epguides.openConnection();
    
    	        // version BufferedReader
    	        BufferedReader bReader = new BufferedReader(new InputStreamReader(conn.getInputStream()));
    
    	        while((line = bReader.readLine()) != null) {
    	        	pageCodeList.add(line); // on l'ajoute dans la liste
    	        }
    
    // version Scanner
    /*	        String page2 = "";
    	        Scanner scan = new Scanner(conn.getInputStream());
    
    	        while(scan.hasNext()) {
    	        	page2 += scan.next();
    	        }
    */
    		} catch(Exception e) {
    			e.printStackTrace(); // todo : traiter avec GUI
    		}
    
    		return pageCodeList;
    	}
    
    	/**
    	 * Cette méthode permet de tester notre pattern matcher sur le code
    	 * source d'une page HTML.
    	 *
    	 * @pre  htmlSource est le code source HTML d'une page qui contient des
    	 * 	      informations au sujet d'une série donnée
    	 * @post les lignes qui matchent le pattern (voir code) seront affichées
    	 *        à l'écran
    	 */
    	public static void showMatchingLines(LinkedList<String> htmlSource) {
    		Pattern pattern = Pattern.compile("^\\s*\\d+\\.{0,1}\\s+.*$");
    		//pattern = Pattern.compile("^\\s*\\d+\\.{0,1}\\s+4{1}-.*$"); // récupère les épisodes de la saison i
    
    		String line = "";
    		Matcher matcher;
    
    		for(int i = 0; i < htmlSource.size(); i++) {
    			line = htmlSource.get(i);
    			matcher = pattern.matcher(line);
    			if(matcher.find()) {
    				System.out.println(line);
    			}
    		}
    	}
    }
    

    Affichage de la classe Série

    import java.util.Calendar;
    import java.util.LinkedList;
    import java.util.regex.Matcher;
    import java.util.regex.Pattern;
    
    public class Serie {
        String name; // ex.: Prison Break
        String urlName; // ex.: PrisonBreak
        Calendar startDate;
        Calendar endDate;
        LinkedList<Season> seasonsList;
    
        public Serie() {
    	name = "<Unknown>";
    	startDate = null;
    	endDate = null;
    	seasonsList = new LinkedList<Season>();
        }
    
        /**
         * Cette méthode permet de récupérer un objet de type Série
         * totalement complet et correctement initialisé.
         *
         * @pre    serieName doit être le nom d'une série dans le format du
         * 		 	site (ex.: "PrisonBreak" ok, "Prison Break" pas ok) et
         * 			qui existe
         * @return une série correctement construire et complète
         */
        public static Serie serieBuilder(String serieName) {
    	LinkedList<String> htmlSource = Site.getHttpPage(serieName);
    
    	Serie serie = new Serie();
    	int seasonIndex = 1;
    	boolean currentSeasonExists = true;
    
    	Pattern pattern;
    	Matcher matcher;
    
    	// on commence la partie pattern matching pour les épisodes de chaque saison
    	while(currentSeasonExists) {
    	    Season currentSeason = new Season(serie, seasonIndex);
    
    	    pattern = Pattern.compile("^\\s*\\d+\\.{0,1}\\s+" + seasonIndex + "{1}-.*$"); // récupère les épisodes de la saison i
    
    	    // on parcourt tout le code source, ligne par ligne
    	    for(int i = 0; i < htmlSource.size(); i++) {
    		String line = htmlSource.get(i); // ligne courante
    		matcher = pattern.matcher(line);
    		if(matcher.find()) {
    		    // si on trouve, cela signifie que 'line' est une ligne qui représente un épisode
    		    // de la saison 'currentSeason'
    		    Episode ep = Episode.episodeBuilder(currentSeason, line);
    		    currentSeason.episodesList.add(ep);
    		}
    	    }
    
    	    if(currentSeason.episodesList.size() > 0) {
    		serie.seasonsList.add(currentSeason);
    		seasonIndex++;
    	    } else {
    		currentSeasonExists = false;
    	    }
    	}
    
    	return serie;
        }
    }
    

    Affichage de la classe Season

    import java.util.LinkedList;
    
    public class Season {
    	int number;
    	Serie serie;
    	LinkedList<Episode> episodesList;
    
    	public Season(Serie s, int i) {
    		serie = s;
    		number = i;
    		episodesList = new LinkedList<Episode>();
    	}
    }
    

    Affichage classe Episode

    import java.util.Calendar;
    import java.util.GregorianCalendar;
    import java.util.regex.Matcher;
    import java.util.regex.Pattern;
    
    public class Episode {
        String title;
        Season season;
        Calendar airDate;
        String link;
        int number; // numéro de l'épisode au sein de la saison
    
        /**
         * Cette méthode nous permet de récupérer les informations d'un épisode
         * à partir d'une ligne de code source.
         *
         * @pre    epSeason est l'object qui représente la saison de l'épisode
         * 		   sourceLine est une ligne de code source qui contient des informations
         * 			sur un épisode donné
         * @return un épisode construit à partir des informations contenues dans sourceLine
         */
        public static Episode episodeBuilder(Season epSeason, String sourceLine) {
    	Pattern pat;
    	Matcher mat;
    
    	Episode ep = new Episode(); // on crée un objet Episode vide
    	int epNumber = -1;
    	Calendar airDate = new GregorianCalendar(0,0,0);
    	String link = "N/A";
    	String title = "N/A";
    
    	pat = Pattern.compile("\\d{1,}"); // matching numéro épisode
    	mat = pat.matcher(sourceLine);
    	if(mat.find())
    	    epNumber = Integer.parseInt(sourceLine.substring(mat.start(), mat.end()));
    
    	pat = Pattern.compile("\\d{1,2}\\s{0,1}/{0,1}[a-zA-Z]{3}\\s{0,1}/{0,1}\\d{2}"); // matching air date de l'épisode
    	mat = pat.matcher(sourceLine);
    	if(mat.find()) {
    	    String matchedDate = sourceLine.substring(mat.start(), mat.end());
    
    	    // pour construire le Calendar, il nous faut le day, month number et year
    	    String day = "N/A";
    	    pat = Pattern.compile("^\\d{1,2}");
    	    mat = pat.matcher(matchedDate);
    	    if(mat.find()) day = matchedDate.substring(mat.start(), mat.end());
    
    	    String month = "N/A";
    	    pat = Pattern.compile("[a-zA-Z]{3}");
    	    mat = pat.matcher(matchedDate);
    	    if(mat.find()) month = matchedDate.substring(mat.start(), mat.end());
    
    	    String year = "N/A";
    	    pat = Pattern.compile("\\d{2}$");
    	    mat = pat.matcher(matchedDate);
    	    if(mat.find()) year = matchedDate.substring(mat.start(), mat.end());
    
    	    // conversion du month en son numéro de mois dans l'année (voir doc méthode)
    	    int monthNb = convertToMonthNumber(month);
    
    	    airDate = new GregorianCalendar(Integer.parseInt(year), monthNb, Integer.parseInt(day));
    	}
    
    	pat = Pattern.compile("http://.*\"");
    	mat = pat.matcher(sourceLine);
    	if(mat.find()) link = sourceLine.substring(mat.start(), mat.end()-1);
    
    	pat = Pattern.compile(">.*</a>");
    	mat = pat.matcher(sourceLine);
    	if(mat.find()) title = sourceLine.substring(mat.start()+1, mat.end()-4);
    
    	// remplissage des attributs de l'objet
    	ep.number = epNumber;
    	ep.airDate = airDate;
    	ep.link = link;
    	ep.title = title;
    	ep.season = epSeason;
    
    	return ep;
        }
    
        /**
         * Cette méthode convertit un nom de mois anglais de trois caractères
         * en son numéro dans l'année (ex.: Mar => 3).
         *
         * @pre    month est un mois anglais de trois caractères (Jan, Feb, Mar, ...)
         * @return le numéro du mois dans l'année,
         * 			sinon -1 si month n'est pas un mois valide
         */
        public static int convertToMonthNumber(String month) {
    	String[] monthsTab = {"Jan", "Feb", "Mar", "Apr", "May", "Jun",
    		"Jul", "Aug", "Sep", "Oct", "Nov", "Dec"};
    	for(int i = 0; i < monthsTab.length; i++) {
    	    // on fait la comparaison en lower case (pour être sûrs)
    	    if((monthsTab[i].toLowerCase()).equals(month.toLowerCase()))
    		return i+1;
    	}
    	return -1;
        }
    }
    

    Affichage classe vue

    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    
    import javax.swing.BoxLayout;
    import javax.swing.JComboBox;
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    import javax.swing.JScrollPane;
    
    @SuppressWarnings("serial")
    public class Vue extends JFrame {
        public Controleur controleur;
        public JComboBox serieChoice;
        public JComboBox seasonChoice;
        public JPanel contentPanel;
        public JPanel superPanel;
    
        public Vue(Controleur c) {
    	controleur = c;
    
    	// construction de l'interface graphique
    	buildGUI();
        }
    
        public void buildGUI() {
    	setTitle("Series Watcher v0.1");
    	superPanel = new JPanel();
    	BoxLayout bL = new BoxLayout(superPanel, BoxLayout.Y_AXIS);
    	superPanel.setLayout(bL);
    	add(superPanel);
    
    	serieChoice = new JComboBox(new String[]{"Lost", "PrisonBreak", "DesperateHousewives"});
    	serieChoice.addActionListener(new ActionListener() {
    	    @Override
    	    public void actionPerformed(ActionEvent e) {
    		controleur.updateSerie();
    	    }
    	});
    	seasonChoice = new JComboBox();
    	JScrollPane jScrollPane = new JScrollPane();
    	contentPanel = new JPanel();
    
    	jScrollPane.add(contentPanel);
    
    	superPanel.add(serieChoice);
    	superPanel.add(seasonChoice);
    	superPanel.add(jScrollPane);
        }
    
        public void showSeasonList(int nbSeasons) {
    	seasonChoice.removeAllItems();
    	for(int i = 0; i < nbSeasons; i++)
    	    seasonChoice.addItem("Season " + (i+1));
        }
    }
    

    Affichage classe modele

    
    public class Modele {
        public Controleur controleur;
    
        public Modele(Controleur c) {
    	controleur = c;
        }
    }
    

    Affichage de la classe controlleur

    
    public class Controleur {
        public Vue vue;
        public Modele modele;
    
        public void updateSerie() {
    	String serieName = (String) vue.serieChoice.getSelectedItem();
    	Serie serie = Serie.serieBuilder(serieName);
    	vue.showSeasonList(serie.seasonsList.size());
        }
    
        public void setVue(Vue v) {
    	vue = v;
        }
        public void setModele(Modele m) {
    	modele = m;
        }
    }
    

    note: il ne s’agit que d’une première version non finale de Serieswatcher. De nombreuses fonctionnalités doivent y être pensées et développées. Cette première version permet de se frotter à un premier projet de conception un peu plus costaud que de simples exercices d’algorithmes. Exercices sur les expressions régulières, la classe urlconnection pour récupérer le contenu d’une page web.

     
  • Jeu loterie euromillions: (chiffres et étoiles) (2)

    admin 21 h 07 min on 30 novembre 2009 | 0 Permalink | Reply
    Tags: ,

    Ici on complète la loterie euro millions. Lors de l’exécution du programme, nous avons le choix entre deux types de jeux différents. Le premier, classique propose à l’utilisateur de tenter de trouver la bonne combinaison de chiffres et étoiles. Le deuxième jeu propose au joueur de proposer sa combinaison de chiffre et étoiles, et l’ordinateur se charge de tenter de retrouver la bonne combinaison euro million. Le joueur détermine le nombre de tentatives que l’ordinateur peut effectuer.

    // Version non finale de la classe loterie
    package Lotterie;
    
    import java.util.Scanner;
    
    public class Loterie {
        public static void main(String[] args) {
    	GUI maVue = new GUI();
    	maVue.pack();
    	maVue.setVisible(true);
    
    	/**
    	 * A utiliser :
    	 * JTextField, JLabel, JPanel, JButton ...
    	 */
    	System.out.println(" Tapez 1 pour jouer à euromillion");
    	System.out
    	.println(" Tapez 2 pour que l'ordinateur essaye de trouver un tirage que vous avez choisis ");
    
    	Scanner scan2 = new Scanner(System.in);
    	int choixJeu = scan2.nextInt();
    	if (choixJeu == 1) {
    	    int[] resTab = new int[7];
    	    resTab[4] = 0;
    	    int i = 0;
    	    // on va générer 5 chiffres et 2 étoiles de l'euro millions à l'aide de deux boucles de type while
    	    while (i < 5) {
    		int rand = ((int) (Math.random() * 50)) + 1; // méthode random de l'objet Math pour générer un chiffre aléatoire
    		if (!isIntPresent(rand, resTab)) {
    		    resTab[i] = rand;
    		    i++;
    		}
    	    }
    	    while (i < 7) {
    		int rand = ((int) (Math.random() * 9)) + 1;
    		if (!isIntPresent(rand, resTab)) {
    		    resTab[i] = rand;
    		    i++;
    		}
    	    }
    	    System.out.println();
    
    	    // *********************************************************************************************************************************//
    
    	    // jouer
    	    int[] tabNumPlayer = new int[7];
    	    Scanner sc = new Scanner(System.in);
    	    Scanner sc2 = new Scanner(System.in);
    	    for (int k = 0; k < 5; k++) {
    		System.out.println("Entrez un chiffre de 1 à 50 inclus");
    		int nums = sc.nextInt();
    		while (nums > 50) {//simple mesure de sécurité au cas ou le joueur entre un chiffre trop grand, à améliorer
    		    System.out
    		    .println("VOUS ÊTES TROMPE, ENTREZ UN CHIFFRE ENTRE 1 ET 50 !");
    		    nums = sc2.nextInt();
    		}
    		tabNumPlayer[k] = nums;
    		if (k == 4) {
    		    for (int j = 0; j < 2; j++) {
    			k++;
    			System.out.println("Entrez une étoile de 1 à 9 inclus");
    			int numsEtoiles = sc2.nextInt();
    			while (numsEtoiles > 9) {
    			    System.out
    			    .println(" VOUS ÊTES TROMPE, ENTREZ UN CHIFFRE ENTRE 1 ET 9 ! ");
    			    numsEtoiles = sc2.nextInt();
    			}
    			tabNumPlayer[k] = numsEtoiles;
    		    }
    		}
    	    }
    	    // *********************************************************************************************************************************//
    	    bonsChiffres(tabNumPlayer, resTab);
    
    	} else {
    	    inverseLotterie(); // appel méthode inverseLotterie
    	}
    
        }
    
        // Sorti de la méthode
        // main****************************************************************
    
        // Méthode qui permet de générer une grille de numéros et étoiles appartenant à l'utilisateur
        public static int[] grilleJoueur(){
    	Scanner scan= new Scanner(System.in); // instance de l'objet Scanner
    	int[] tabGrille= new int[7];
    	int i=0;
    	while (i<5){
    	    System.out.println("Veuillez entrer un chiffre entre 1 et 50");
    	    int chiffres=scan.nextInt(); //nextInt méthode appartenant à l'objet Scanner
    	    if (chiffres>0 | chiffres>51){
    		System.out.println("Vous n'avez pas respecter les consignes, fin du jeu");
    		break;
    	    }
    	    tabGrille[i]= chiffres;
    	    i++;
    	}
    	while (i<7){
    	    System.out.println("Veuillez entrer un chiffre entre 1 et 9");
    	    int chiffres=scan.nextInt();
    	    if (chiffres>0 | chiffres>51){
    		System.out.println("Vous n'avez pas respecter les consignes, fin du jeu");
    		break;
    	    }
    	    tabGrille[i]= chiffres;
    	    i++;
    	}
    	return tabGrille;
        }
    
        // Méthode qui permet de vérifier si un chiffre se trouve dans un tableau
        public static boolean isIntPresent(int num, int[] tab) {
    	for (int i = 0; i < tab.length; i++) {
    	    if (tab[i] == num) {
    		return true;
    	    }
    	}
    	return false;
        }
    
        // Méthode qui compare 2 tableaux et qui compte le nombre de bons chiffres
        // et de bonnes étoiles
        public static boolean bonsChiffres(int[] tabNumPlayer, int[] resTab) {
    	int bonsChiffres = 0;
    	int bonnesEtoiles = 0;
    	int nbreChiffresCumules = 0;
    	int nbreEtoilesCumules = 0;
    	for (int i = 0; i < 5; i++) {
    	    for (int j = 0; j < 5; j++) {
    
    		//en résumé, les chiffres présents dans un tableau sont comparés aux chiffres proposés dans un second tableau
    
    		if (tabNumPlayer[i] == resTab[j]) {
    		    bonsChiffres++;
    		    nbreChiffresCumules += bonsChiffres;
    		}
    	    }
    	}
    	for (int i = 5; i < 7; i++) {
    	    for (int j = 5; j < 7; j++) {
    
    		if (tabNumPlayer[i] == resTab[j]) {
    		    bonnesEtoiles++;
    		    nbreEtoilesCumules += bonnesEtoiles;
    		}
    	    }
    	}
    	System.out.println();
    	System.out.println(" Vous avez " + bonsChiffres + " bons chiffres"
    		+ " Et " + bonnesEtoiles + " bonnes étoiles");
    
    	return false;
        }
    
        // le joueur donne une combinaison que l'ordinateur doit deviner. cette méthode sert à cela
        public static void inverseLotterie() {
    	int[] tabNumPlayer = new int[7];
    	Scanner sc = new Scanner(System.in);
    	Scanner sc2 = new Scanner(System.in);
    	for (int k = 0; k < 5; k++) {
    	    System.out.println("Entrez un chiffre de 1 à 50 inclus");
    	    int nums = sc.nextInt();
    	    while (nums > 50) {
    		// TODO corriger gestion erreurs (si < 1 : erreur, si pas int :
    		// exception)
    		System.out
    		.println("VOUS ÊTES TROMPE, ENTREZ UN CHIFFRE ENTRE 1 ET 50 !");
    		nums = sc2.nextInt();
    	    }
    	    tabNumPlayer[k] = nums;
    	    if (k == 4) {
    		for (int j = 0; j < 2; j++) {
    		    k++;
    		    System.out.println("Entrez une étoile de 1 à 9 inclus");
    		    int numsEtoiles = sc2.nextInt();
    		    while (numsEtoiles > 9) {
    			System.out
    			.println(" VOUS ÊTES TROMPE, ENTREZ UN CHIFFRE ENTRE 1 ET 9 ! ");
    			numsEtoiles = sc2.nextInt();
    		    }
    		    tabNumPlayer[k] = numsEtoiles;
    		}
    	    }
    	}
    	// on créer un tableau de numéro aléatoire autant de fois que de nombre
    	// de grilles autoirsées par l'utilisateur
    	System.out.println("Combien de grilles l'ordinateur peut-il jouer ?");
    	Scanner sc3 = new Scanner(System.in);
    	int nbreGrilles = sc3.nextInt();
    
    	// sommes à conserver (pour calculer la moyenne)
    	int nbreChiffresCumules = 0;
    	int nbreEtoilesCumules = 0;
    	int rang1 = 0;
    	int rang2 = 0;
    	int rang3 = 0;
    	int rang4 = 0;
    	int rang5 = 0;
    	int rang6 = 0;
    	int rang7 = 0;
    	int rang8 = 0;
    	int rang9 = 0;
    	int rang10 = 0;
    	int rang11 = 0;
    	int rang12 = 0;
    
    	for (int a = 0; a < nbreGrilles; a++) {
    	    // pour enregistrer le nombre de bons chiffres/étoiles au sein d'une
    	    // seule boucle
    	    int bonsChiffres = 0;
    	    int bonnesEtoiles = 0;
    
    	    //System.out.println();
    	    int[] resTab = new int[7];
    	    resTab[4] = 0; // TODO normalement à commenter
    	    int i = 0;
    	    while (i < 5) {
    		int rand = ((int) (Math.random() * 50)) + 1;
    		if (!isIntPresent(rand, resTab)) {
    		    resTab[i] = rand;
    		    //System.out.print(resTab[i] + " ");
    		    i++;
    		}
    	    }
    	    //System.out.print(" | ");
    	    while (i < 7) {
    		int rand = ((int) (Math.random() * 9)) + 1;
    		if (!isIntPresent(rand, resTab)) {
    		    resTab[i] = rand;
    		    //System.out.print(resTab[i] + " ");
    		    i++;
    		}
    	    }
    	    // on compare le tabaleau crée avec le tableau de chiffres proposés
    	    // par l'utilisateur
    	    // et on compte le nombre de bonne étoile
    
    	    bonsChiffres = 0;
    	    for (int z = 0; z < 5; z++) {
    		for (int j = 0; j < 5; j++)
    		    if (tabNumPlayer[z] == resTab[j])
    			bonsChiffres++;
    	    }
    	    nbreChiffresCumules += bonsChiffres;
    	    //System.out.print("   n°bons chiffres = " + bonsChiffres + "  ");
    
    	    bonnesEtoiles = 0;
    	    for (int z = 5; z < 7; z++) {
    		for (int j = 5; j < 7; j++)
    		    if (tabNumPlayer[z] == resTab[j])
    			bonnesEtoiles++;
    	    }
    	    nbreEtoilesCumules += bonnesEtoiles;
    	    //System.out.println(" n°bonnes étoiles = " + bonnesEtoiles);
    
    	    // ici, on connait le nombre de bons chiffres et de bonnes étoiles, on construit les differents rangs.
    	    if(bonsChiffres == 5 && bonnesEtoiles == 2) {
    		rang1++;
    	    }
    
    	    if(bonsChiffres == 5 && bonnesEtoiles == 1) {
    		rang2++;
    	    }
    	    if(bonsChiffres == 5 && bonnesEtoiles == 0) {
    		rang3++;
    	    }
    	    if(bonsChiffres == 4 && bonnesEtoiles == 2) {
    		rang4++;
    	    }
    	    if(bonsChiffres == 4 && bonnesEtoiles == 1) {
    		rang5++;
    	    }
    	    if(bonsChiffres == 4 && bonnesEtoiles == 0) {
    		rang6++;
    	    }
    	    if(bonsChiffres == 3 && bonnesEtoiles == 2) {
    		rang7++;
    	    }
    	    if(bonsChiffres == 3 && bonnesEtoiles == 1) {
    		rang8++;
    	    }
    	    if(bonsChiffres == 3 && bonnesEtoiles == 0) {
    		rang9++;
    	    }
    	    if(bonsChiffres == 2 && bonnesEtoiles == 2) {
    		rang10++;
    	    }
    	    if(bonsChiffres == 2 && bonnesEtoiles == 1) {
    		rang11++;
    	    }
    	    if(bonsChiffres == 2 && bonnesEtoiles == 0) {
    		rang12++;
    	    }
    	}
    	// combien de chiffres et d'étoiles l'ordinateur à t'il trouvé en moyenne ?
    	double moyenneChiffres = ((double) nbreChiffresCumules / nbreGrilles);
    	double moyenneEtoiles = ((double) nbreEtoilesCumules / nbreGrilles);
    	System.out.println();
    	System.out.println(" En moyenne par tirage, l'ordinateur à trouvé  "
    		+ moyenneChiffres + " bons chiffres et " + moyenneEtoiles
    		+ " bonnes étoiles ");
    	// on affiche les résultats finales du tirage, autrement dit, combien l'ordinateur à trouvé de bons chiffres et de bonnes étoiles
    	System.out.println();
    	System.out.println( "Résultats de rang 1  : " + rang1);
    	System.out.println( "Résultats de rang 2  : " + rang2);
    	System.out.println( "Résultats de rang 3  : " + rang3);
    	System.out.println( "Résultats de rang 4  : " + rang4);
    	System.out.println( "Résultats de rang 5  : " + rang5);
    	System.out.println( "Résultats de rang 6  : " + rang6);
    	System.out.println( "Résultats de rang 7  : " + rang7);
    	System.out.println( "Résultats de rang 8  : " + rang8);
    	System.out.println( "Résultats de rang 9  : " + rang9);
    	System.out.println( "Résultats de rang 10 : " + rang10);
    	System.out.println( "Résultats de rang 11 : " + rang11);
    	System.out.println( "Résultats de rang 12 : " + rang12);
        }
    }
    

    Suggestions améliorations jeu euro millions à apporter pour les prochaines versions :
    • Améliorer la gestion des erreurs et exceptions lorsque l’utilisateur entre ses chiffres (avec bloc try catch)
    • Créer une interface graphique avec swing pour le jeu
    • Améliorer les statistiques (tableau de résultats final) dans le jeu numéro 1 lorsque le joueur doit deviner une grille euro million générée par l’ordinateur.
    • Crée un système d’argent (au lieu de demander combien de tentatives ou combien de grilles, on demande pour combien d’euros l’utilisateur désir-il jouer à euro million.

     
  • Jeu loterie euromillions: Méthode tirage (chiffres et étoiles) (1)

    admin 20 h 28 min on 30 novembre 2009 | 0 Permalink | Reply
    Tags: ,

    Nouveau mini projet java créer jeu java : une loterie qui ressemble à la loterie euro millions. Cet exercice va permettre de s’exercer sur le fonctionnement des boucles, utilisation de l’objet Math pour générer des chiffres aléatoire. Cet exercice permet aussi de s’exercer sur la création de méthodes java personnelles, selon ses besoins propres.
    But du jeu : On commence simplement par créer une méthode tirage :

    package Lotterie;
    
    public class TirageMethode {
    	public static int[] Tirage(){
    	    // on instancie un tableau de type Integer[] avec 7entrés
    	    // qui correspondront aux sept chiffre à trouver (5chiffres + 2étoiles)
    
    		int[] tabTirage= new int[7];
    		int i=0;
    		while (i<5){
    		    //Utilisation méthode random sur objet Math pour générer un chiffre aléatoire
    			int rand=((int)(Math.random())*50)+1;
    			// méthode isIntPresent qui vérifie si un int est présent dans un tableau
    			// et renvoi une réponse de type booléene
    			if(!isIntPresent(rand,tabTirage)){
    				tabTirage[i]=rand;
    				i++;
    			}
    		}
    		// ici i=4, à partir d'ici on génère des chiffres de 1 à 9 (sur 2 tours de boucle)
    		while (i<7){
    			int rand=((int)(Math.random())*8)+1;
    			if(!isIntPresent(rand,tabTirage)){
    				tabTirage[i]=rand;
    				i++;
    			}
    		}
    		// retourne un tableau de int[] qui correspond aux chiffres générés par le tirage
    		return tabTirage;
    	}
    	// méthode qui retourne soit true si le chiffre est présent dans le tableau, soit false si le int n'est pas présent
    	public static boolean isIntPresent (int n, int[]tab){
    		for (int i=0;i<tab.length;i++){
    			if(tab[i]==n){
    				return true;
    			}
    		}return false;
    	}
    }
    
     
  • Calculatrice java: faire une calculette simple

    admin 15 h 15 min on 14 octobre 2009 | 1 Permalink | Reply
    Tags: , ,

    Création d’une calculatrice simple en java :

    Voici le code commenté qui permet de créer une calculatrice (telle la calculatrice que l’on retrouve dans les accessoires Windows pré installés). Cette calculatrice est tout ce qu’il y a de plus simple, il ne s’agit pas d’une calculatrice de type scientifique. Néanmoins cet exercice sur la création d’une calculatrice permet de commencer à toucher aux interfaces graphiques en java. Les interfaces graphiques permettent au programme crée d’être visible et utilisable pour les utilisateurs auxquels un programme est destiné.

    Cet exemple de calculatrice en java est directement issu du livre Java pour enfant de Yakov Fain. Le code de cette calculatrice se décompose en 2 classes. La classe Moteur de calcul qui va permettre de formuler l’algorithme de calcul utilisée par la calculatrice. Et la classe calculatrice elle-même, qui reprend les caractéristiques de l’interface graphique que l’on souhaite utilisée pour construire la calculatrice.
    Code la classe moteur de calcul. Algorithmes qui permettent à la calculatrice de fonctionner.

    Après compilation du code par éclipse, la calculatrice devrait avoir cette aspect:
    calculatrice.jpg

    import java.awt.event.ActionListener;
    import java.awt.event.ActionEvent;
    import java.text.NumberFormat;
    import java.text.ParsePosition;
    import javax.swing.JButton;
    public class MoteurCalcul implements ActionListener {
    	Calculatrice parent; // une référence à la Calculatrice
    	char actionSélectionnée = ' '; // +, -, /, ou *
    	double résultatCourant = 0;
    	NumberFormat formatNombres = NumberFormat.getInstance();
    	// un objet capable de lire et présenter les nombres
    	// Le constructeur stocke la référence à la fenêtre
    	// Calculatrice dans la variable membre parent
    	MoteurCalcul(Calculatrice parent) {
    		this.parent = parent;
    	}
    	public void actionPerformed(ActionEvent événement) {
    		// Retrouve la source de l'action
    		JButton boutonCliqué = (JButton) événement.getSource();
    		String texteChampAffichage =
    			parent.champAffichage.getText();
    		double valeurAffichée = 0;
    		// Retrouve le nombre présenté dans le champ texte
    		// s'il n'est pas vide
    		if (!"".equals(texteChampAffichage)) {
    			valeurAffichée =
    				// analyse la chaîne de caractères
    				formatNombres.parse(
    						texteChampAffichage,
    						new ParsePosition(0) /* ne sert pas */).
    						// puis donne sa valeur en tant que double
    						doubleValue();
    		}
    		Object sourceEvénement = événement.getSource();
    		// Pour chaque bouton d'action, mémorise l'action
    		// sélectionnée, +, -, /, ou *, stocke la valeur courante
    		// dans la variable résultatCourant et vide le champ
    		// Affichage avant l'entrée du nombre suivant
    		if (sourceEvénement == parent.boutonPlus) {
    			actionSélectionnée = '+';
    			résultatCourant = valeurAffichée;
    			parent.champAffichage.setText("");
    		}
    		else if (sourceEvénement == parent.boutonMoins) {
    			actionSélectionnée = '-';
    			résultatCourant = valeurAffichée;
    			parent.champAffichage.setText("");
    		}
    		else if (sourceEvénement == parent.boutonDiviser) {
    			actionSélectionnée = '/';
    			résultatCourant = valeurAffichée;
    			parent.champAffichage.setText("");
    		}
    		else if (sourceEvénement == parent.boutonMultiplier) {
    			actionSélectionnée = '*';
    			résultatCourant = valeurAffichée;
    			parent.champAffichage.setText("");
    		}
    		else if (sourceEvénement == parent.boutonEgale) {
    			// Effectue les calculs en fonction de actionSélectionnée
    			// Modifie la valeur de la variable résultatCourant
    			// et affiche le résultat
    			if (actionSélectionnée == '+') {
    				résultatCourant += valeurAffichée;
    				// Convertit le résultat en le transformant en String
    				// à l'aide de formatNombres
    				parent.champAffichage.setText(
    						formatNombres.format(résultatCourant));
    			}
    			else if (actionSélectionnée == '-') {
    				résultatCourant -= valeurAffichée;
    				parent.champAffichage.setText(
    						formatNombres.format(résultatCourant));
    			}
    			else if (actionSélectionnée == '/') {
    				résultatCourant /= valeurAffichée;
    				parent.champAffichage.setText(
    						formatNombres.format(résultatCourant));
    			}
    			else if (actionSélectionnée == '*') {
    				résultatCourant *= valeurAffichée;
    				parent.champAffichage.setText(
    						formatNombres.format(résultatCourant));
    			}
    		}
    		else {
    			// Pour tous les boutons numériques, ajoute le libellé
    			// du bouton au champ texte
    			String libelléBoutonCliqué = boutonCliqué.getText();
    			parent.champAffichage.setText(texteChampAffichage +
    					libelléBoutonCliqué);
    		}
    	}
    }
    

    Code de la classe Moteurcalcul qui défini un algorithme de calcul pour la calculatrice.

    import javax.swing.*;
    import java.awt.GridLayout;
    import java.awt.BorderLayout;
    public class Calculatrice {
    	// Déclare et instancie les composants de la fenêtre
    	JButton bouton0 = new JButton("0");
    	JButton bouton1 = new JButton("1");
    	JButton bouton2 = new JButton("2");
    	JButton bouton3 = new JButton("3");
    	JButton bouton4 = new JButton("4");
    	JButton bouton5 = new JButton("5");
    	JButton bouton6 = new JButton("6");
    	JButton bouton7 = new JButton("7");
    	JButton bouton8 = new JButton("8");
    	JButton bouton9 = new JButton("9");
    	JButton boutonVirgule = new JButton(",");
    	JButton boutonEgale = new JButton("=");
    	JButton boutonPlus = new JButton("+");
    	JButton boutonMoins = new JButton("-");
    	JButton boutonDiviser = new JButton("/");
    	JButton boutonMultiplier = new JButton("*");
    	JPanel contenuFenêtre = new JPanel();
    	JTextField champAffichage = new JTextField(30);
    	// Constructeur
    	Calculatrice() {
    		// Affecte le gestionnaire de disposition pour ce panneau
    		BorderLayout disposition = new BorderLayout();
    		contenuFenêtre.setLayout(disposition);
    		// Ajoute le champ d'affichage en haut de la fenêtre
    		contenuFenêtre.add("North", champAffichage);
    		// Crée le panneau avec le quadrillage qui contient
    		// 12 boutons – les 10 boutons numériques et ceux
    		// représentant la virgule et le signe égale
    		JPanel panneauChiffres = new JPanel();
    		GridLayout dispositionChiffres = new GridLayout(4, 3);
    		panneauChiffres.setLayout(dispositionChiffres);
    		panneauChiffres.add(bouton1);
    		panneauChiffres.add(bouton2);
    		panneauChiffres.add(bouton3);
    		panneauChiffres.add(bouton4);
    		panneauChiffres.add(bouton5);
    		panneauChiffres.add(bouton6);
    		panneauChiffres.add(bouton7);
    		panneauChiffres.add(bouton8);
    		panneauChiffres.add(bouton9);
    		panneauChiffres.add(bouton0);
    		panneauChiffres.add(boutonVirgule);
    		panneauChiffres.add(boutonEgale);
    		// Ajoute le panneau des chiffres à la zone centrale
    		// de la fenêtre
    		contenuFenêtre.add("Center", panneauChiffres);
    		// Crée le panneau avec le quadrillage qui contient 4
    		// boutons d'opération – Plus, Moins, Diviser, Multiplier
    		JPanel panneauOpérations = new JPanel();
    		GridLayout dispositionOpérations = new GridLayout(4, 1);
    		panneauOpérations.setLayout(dispositionOpérations);
    		panneauOpérations.add(boutonPlus);
    		panneauOpérations.add(boutonMoins);
    		panneauOpérations.add(boutonMultiplier);
    		panneauOpérations.add(boutonDiviser);
    		// Ajoute le panneau des opérations à la zone est
    		// de la fenêtre
    		contenuFenêtre.add("East", panneauOpérations);
    		// Crée le cadre et lui affecte son contenu
    		JFrame frame = new JFrame("Calculatrice");
    		frame.setContentPane(contenuFenêtre);
    		// Affecte à la fenêtre des dimensions suffisantes pour
    		// prendre en compte tous les contrôles
    		frame.pack();
    		// Affiche la fenêtre
    		frame.setVisible(true);
    		// Instancie le récepteur d'événements et l'enregistre
    		// auprès de chaque bouton
    		MoteurCalcul moteurCalcul = new MoteurCalcul(this);
    		bouton0.addActionListener(moteurCalcul);
    		bouton1.addActionListener(moteurCalcul);
    		bouton2.addActionListener(moteurCalcul);
    		bouton3.addActionListener(moteurCalcul);
    		bouton4.addActionListener(moteurCalcul);
    		bouton5.addActionListener(moteurCalcul);
    		bouton6.addActionListener(moteurCalcul);
    		bouton7.addActionListener(moteurCalcul);
    		bouton8.addActionListener(moteurCalcul);
    		bouton9.addActionListener(moteurCalcul);
    		boutonVirgule.addActionListener(moteurCalcul);
    		boutonPlus.addActionListener(moteurCalcul);
    		boutonMoins.addActionListener(moteurCalcul);
    		boutonDiviser.addActionListener(moteurCalcul);
    		boutonMultiplier.addActionListener(moteurCalcul);
    		boutonEgale.addActionListener(moteurCalcul);
    	}
    	public static void main(String[] args) {
    		// Instancie la classe Calculatrice
    		Calculatrice calc = new Calculatrice();
    	}
    }
    
     
c
compose new post
j
next post/next comment
k
previous post/previous comment
r
reply
e
edit
o
show/hide comments
t
go to top
esc
cancel