devenez un petit genie en jeux video

290
Ian Cinnamon Devenez un Développez facilement des jeux vidéos multiplates-formes petit génie des jeux vidéo De 7 à 97 ans !

Upload: fasm

Post on 03-Sep-2015

14 views

Category:

Documents


0 download

DESCRIPTION

jeux videos à programmer

TRANSCRIPT

  • Ian Cinnamon

    Devenez un

    Dveloppezfacilement des jeux vidos multiplates-formes

    petit gniedes jeux vido

    De 7 97ans !

  • Ian Cinnamon

    Devenezun petit gniedes jeux vido

    L E P R O G R A M M E U R

    JeuxVideo Livre Page I Mercredi, 18. juin 2008 5:41 17

  • Pearson Education France a apport le plus grand soin la ralisation de ce livre afin de vous fournirune information complte et fiable. Cependant, Pearson Education France nassume de responsa-bilits, ni pour son utilisation, ni pour les contrefaons de brevets ou atteintes aux droits de tiercespersonnes qui pourraient rsulter de cette utilisation.

    Les exemples ou les programmes prsents dans cet ouvrage sont fournis pour illustrer les descriptionsthoriques. Ils ne sont en aucun cas destins une utilisation commerciale ou professionnelle.

    Pearson Education France ne pourra en aucun cas tre tenu pour responsable des prjudicesou dommages de quelque nature que ce soit pouvant rsulter de lutilisation de ces exemples ouprogrammes.

    Tous les noms de produits ou marques cits dans ce livre sont des marques dposes par leurspropritaires respectifs.

    Aucune reprsentation ou reproduction, mme partielle, autre que celles prvues larticle L. 122-5 2 et 3 a) du code de laproprit intellectuelle ne peut tre faite sans lautorisation expresse de Pearson Education France ou, le cas chant, sans lerespect des modalits prvues larticle L. 122-10 dudit code.No part of this book may be reproduced or transmitted in any form or by any means, electronic or mechanical, includingphotocopying, recording or by any information storage retrieval system, without permission from Pearson Education, Inc.

    Publi par Pearson Education France47 bis, rue des Vinaigriers75010 PARISTl. : 01 72 74 90 00

    Mise en pages : TyPAO

    Tous droits rservs

    Titre original :

    Programming Video Games for the Evil Genius

    Traduit et adapt de lamricain par Isabelle Hurbain-Palatin

    ISBN : 978-0-07-149752-7Copyright 2008 by The McGraw-Hill Companies, Inc.

    All rights reserved

    JeuxVideo Livre Page II Mercredi, 18. juin 2008 5:41 17

    Copyright 2009 Pearson Education FranceISBN : 978-2-7440-4090-0

  • Sommaire

    Prface

    .......................................................... VII

    propos de lauteur

    .................................... VIII

    Introduction

    .................................................. 1

    Le compilateur

    ............................................. 5

    1. Java dans les starting-blocks

    .................. 9

    2. Jeux de course

    .......................................... 39

    3. Jeux de plateau

    ........................................ 91

    4. Jeux de tir

    ................................................. 125

    5. Jeux de stratgie

    ...................................... 143

    6. Anciens jeux... revisits

    ........................... 187

    7. Jeux de rflexion

    ...................................... 229

    Index

    ............................................................. 275

    JeuxVideo Livre Page III Mercredi, 18. juin 2008 5:41 17

  • JeuxVideo Livre Page IV Mercredi, 18. juin 2008 5:41 17

  • Table des matires

    Prface

    ............................................................ VII

    propos de lauteur

    ...................................... VIII

    Introduction

    .................................................... 1Remerciements ........................................... 4

    Le compilateur

    ............................................... 5

    C

    HAPITRE

    1. Java dans les starting-blocks

    ... 9Projet 1 : Le perroquet ................................ 10Projet 2 : Devinez le mot de passe ! ........... 14Projet 3 : Calcul mental .............................. 23Projet 4 : Une bibliothque virtuelle de jeux 30Projet 5 : Devinez le nombre ! ................... 35Java dans les starting-blocks : le rsum .... 37

    C

    HAPITRE

    2. Jeux de course

    ........................... 39

    La course du courage

    Projet 6 : La piste ....................................... 40Projet 7 : Les voitures ................................ 47Projet 8 : Collisions ! ................................. 53Projet 9 : Personnalisation ......................... 61

    Le skieur

    Projet 10 : La piste ...................................... 72Projet 11 : Piste verte ................................. 77Projet 12 : La comptition ......................... 83

    C

    HAPITRE

    3. Jeux de plateau

    ......................... 91

    La chasse aux mauvais gnies

    Projet 13 : Le laboratoire ............................ 92Projet 14 : Attrapez-les vite ! ..................... 97Projet 15 : Plus intelligent... ...................... 101

    Le morpion boxeur

    Projet 16 : Le ring ...................................... 105Projet 17 : Combat ! ................................... 110Projet 18 : K.-O. ! ...................................... 116

    C

    HAPITRE

    4. Jeux de tir

    .................................. 125

    Destructeurs de lespace

    Projet 19 : Le paysage .............................. 126Projet 20 : Lasers ....................................... 129Projet 21 : La vengeance ............................ 135

    C

    HAPITRE

    5. Jeux de stratgie

    ....................... 143

    Dmineurs

    Projet 22 : Le petit nouveau de lquipe ..... 144Projet 23 : Dmineur expert ....................... 148Projet 24 : BOUM ! ................................... 153Projet 25 : Promotions ............................... 159

    Piges

    Projet 26 : Dplacements .......................... 166Projet 27 : Mise en place des piges .......... 170

    JeuxVideo Livre Page V Mercredi, 18. juin 2008 5:41 17

  • VI

    Devenez un petit gnie des jeux vido

    Projet 28 : Pig ! ....................................... 175Projet 29 : Le spectacle .............................. 180

    C

    HAPITRE

    6. Anciens jeux... revisits

    ............ 187

    Oiram

    Projet 30 : La plate-forme ......................... 188Projet 31 : Allez Oiram ! ............................ 192Projet 32 : Les mchants ............................ 198Projet 33 : Un monde compliqu ............... 205

    Javaman

    Projet 34 : Lunivers de Javaman ............... 214Projet 35 : Javaman vit ! ............................ 217Projet 36 : Lattaque du C++ ...................... 222

    C

    HAPITRE

    7. Jeux de rflexion

    ....................... 229

    Jeu de mmoire

    Projet 37 : Dessin de la grille .................... 230Projet 38 : Correspondances ...................... 235Projet 39 : Battez le chronomtre .............. 240

    Ian a dit

    Projet 40 : Jeu de couleurs ......................... 248Projet 41 : Surchauffe de cerveau .............. 252Projet 42 : Plus de niveaux ! ...................... 259Projet 43 : Accessoires de jeu .................... 265

    Index

    ............................................................... 275

    JeuxVideo Livre Page VI Mercredi, 18. juin 2008 5:41 17

  • Prface

    Il y a plusieurs annes, Ian Cinnamon a assist aux iD Tech Camps de UCLA

    (Univer-sity of California, Los Angeles)

    . Ian y a appris programmer en C++ et en Java. Anneaprs anne, Ian a continu assister aux camps et sa matrise de la programmationsest visiblement amliore. Mais il est apparu quil dpassait ses pairs et quil avaitbesoin de nouveaux dfis.Ses instructeurs disaient de lui quil absorbait et assimilait rapidement les notions deprogrammation, comme sil rentrait chez lui, lisait et rsolvait des problmes sur sontemps libre. Il se trouve que cest exactement ce quil faisait.Jai eu loccasion de rencontrer Ian il y a deux ans lUniversit de Stanford. Cest unjeune homme formidable avec de bonnes manires, dexcellentes capacits sociales et,bien sr, un grand talent de programmeur. Il est un des meilleurs programmeurs quejai vus aux iD Tech Camps, ce qui est impressionnant au vu des milliers de program-meurs qui ont reu leur diplme des iD Tech Camps pendant toutes ces annes.Ian, qui a aujourdhui tout juste quinze ans, est devenu un modle pour sa gnration.Son livre,

    Devenez un petit gnie des jeux vido

    , offre une approche tape par tape la programmation de jeux vido, ce qui est un rve pour de nombreux jeunes.Jentends souvent des phrases comme "Jaimerais savoir programmer mon propre jeu"et "Je ne sais pas par o commencer". Ma suggestion est de participer aux id TechCamps et de se procurer un exemplaire du livre de Ian. Savoir o aller et y plongersont des tapes cruciales. Ian lve sa gnration et dmystifie le code des jeux vido.Je suis trs impatient de voir o Ian en sera dans cinq ou dix ans. Prparez-vous.

    Pete Ingram-Cauchi

    Prsident et CEO, iD Tech Camps, internalDrive, Inc.

    JeuxVideo Livre Page VII Mercredi, 18. juin 2008 5:41 17

  • propos de lauteur

    Ian Cinnamon est un phnomne de 15 ans qui programme depuis plus de sept ans etqui est certifi en Java et en C++. Il est actuellement lycen la Harvard-WestlakeSchool de Los Angeles, Californie.

    JeuxVideo Livre Page VIII Mercredi, 18. juin 2008 5:41 17

  • Introduction

    Matriser lunivers des jeux

    Quoi de mieux que jouer aux jeux vido ? Crer vos propres jeux vido ! Des jeux quevous concevez, des jeux que vous contrlez... des jeux selon

    vos

    rgles.

    Lorsque vous achetez un jeu en magasin, ce jeu est souvent le rsultat de mois, voiredannes defforts dune petite quipe de professionnels crant des programmesextrmement complexes aids des ordinateurs les plus rcents et les plus puissants.Mais il leur manque quelque chose pour crer le jeu parfait : vous-mme, le crateurde jeux.Vous tes le matre de votre univers de jeu. Vous pouvez crer le monde que vousvoulez. Vous pouvez choisir les couleurs de fond, les niveaux de difficult, la forme duplateau de jeu et les codes de triche. Vous pouvez inventer des personnages, concevoirdes dfis, choisir comment les points sont distribus et comment un joueur gagne...ou perd.

    Vous pouvez programmer tout ce quoi vous pensez.

    Votre borne darcade personnelle

    Vous est-il dj arriv de vous ennuyer force de jouer au mme jeu, encore etencore ? Ce ne sera bientt plus le cas. Vous pouvez crer un assortiment de jeux avecdes variantes illimites. Vous trouverez dans ces pages le secret de la construction dejeux de course, de jeux de plateau, de jeux de tir, de jeux de stratgie, danciens jeuxrevisits et de jeux de rflexion.

    JeuxVideo Livre Page 1 Mercredi, 18. juin 2008 5:41 17

  • 2

    Devenez un petit gnie des jeux vido

    Jeux de course.

    Attention ladrnaline ! Construisez des jeux dans lesquels vousferez une course contre la montre, contre un adversaire ou mme contre vous-mme. La vitesse et la prcision seront vos atouts cls lorsque vous vous dplace-rez, que votre moyen de transport soit une voiture, une fuse, un balai, une paire deskis ou tout autre moyen de transport qui puisse tre imagin par un petit gnie dela programmation.

    Jeux de plateau.

    Des terrains mentaux mins pour vous rendre fou ! Des jeux etdes labyrinthes qui vous demanderont des prouesses de rflexion, dastuce et demanuvres pour battre vos adversaires ! Frustrez vos ennemis et mettez-les genoux. Le concept : un jeu du morpion dop aux strodes !

    Jeux de tir.

    Des jeux mettant rude preuve vos rflexes et vos nerfs ! Transfor-mez-vous en soldat, en charmeur de serpent, en guerrier

    alien

    ou en homme deNeandertal jetant des pierres tandis que vous visez dans le monde que vous crez.

    Jeux de stratgie.

    Pigez vos adversaires dans une bote dont il sera impossible desortir ou dsamorcez une bombe avant quelle puisse dtruire la Terre ! Dans tousles cas, relevez le dfi. Une tte froide et une rflexion rapide seront ncessaires.

    Jeux anciens revisits.

    Revoyez les classiques votre sauce ! Crez des variationsde Mario et de Pac-Man en programmant de nouvelles fonctionnalits et astucesqui renouvelleront ces jeux.

    Jeux de rflexion.

    Avez-vous une bonne mmoire ? Grez-vous bien la pression ?Nous lesprons, car dans ces jeux, vous vivrez ou mourrez en fonction de ce quevous vous rappelerez. Rglez la difficult en fonction de votre courage.

    La programmation : le langage des jeux

    En musique, il existe des notes ; en mathmatiques, des quations ; dans une langue,des mots. Dans le monde des jeux vido, il existe des commandes qui donnent vie vos jeux. Cela sappelle la programmation. Cest ainsi que vous indiquez lordina-teur ce quil doit faire.Tous les jeux que vous allez crer seront programms en Java, le langage de program-mation le plus universel.Et quen est-il si vous ne savez absolument pas programmer ? Si vous navez aucuneide de la manire dont lordinateur transforme vos ides en actions et en images ? Pasdinquitude ! Je vous guiderai tape par tape travers les bases de ce langage trspolyvalent. Lorsque vous en aurez termin avec

    Devenez un petit gnie des jeux vido

    ,

    vous aurez non seulement une bibliothque de jeux personnaliss fantastique, maisvous serez aussi un habile crateur de jeux.

    JeuxVideo Livre Page 2 Mercredi, 18. juin 2008 5:41 17

  • Introduction

    3

    Les briques de la cration de jeux

    La programmation se compose de plusieurs briques. Vous apprendrez facilement vous en servir, nous les dtaillerons tape par tape. Les captures dcrans sont vosguides lorsque vous apprenez matriser ces outils importants car elles sont infail-libles. Et, comme rouler bicyclette, lorsque vous savez vous en servir, cela nesoublie pas.

    Si vous tes dbutant en programmation, la section 1 vous permettra de partir trs rapi-dement sur de bonnes bases. Si vous avez dj un peu dexprience, vous pouvezpasser directement la section 2.

    Les briques utilises dans la cration de jeux incluent :

    Les instructions.

    Centre nvralgique et squelette de tous les jeux.

    Les commentaires.

    Ils permettent dannoter votre code pour savoir ce que faitchaque ligne.

    Les contrles de flux.

    Ils vous permettent de rpter du code. Ils sont trs prati-ques pour relancer un jeu.

    Les variables.

    Elles permettent de garder une trace des scores, des noms desjoueurs, des niveaux, etc.

    Les instructions

    if

    .

    Elles permettent de tester vos variables grce des condi-tions. Par exemple, si vous tuez un ennemi, votre score augmente.

    JOptionPane

    .

    Ils permettent de grer les entres et les sorties, par exemple pourafficher le score dun joueur ou pour rcuprer son nom pour la liste des scores lesplus levs.

    Les nombres alatoires.

    Ils sont la base de lintelligence artificielle. Pour dpla-cer un ennemi de manire alatoire, les nombres alatoires sont ce quil vous faut.

    Les pauses.

    Elles permettent dinfluencer le rafrachissement de lcran pour quevos graphismes restent clairs et nets.

    Les tableaux et les

    ArrayList

    .

    Ils servent grouper des objets similaires (ennemis,recharges, etc.) et ainsi gagner du temps.

    Les accs aux fichiers (lecture et criture).

    Ils permettent de sauvegarder le jeu,ce qui est pratique lorsque votre chef arrive de manire impromptue et que voustes en train de jouer au lieu de travailler.

    JeuxVideo Livre Page 3 Mercredi, 18. juin 2008 5:41 17

  • 4

    Devenez un petit gnie des jeux vido

    Remerciements

    Vous ne seriez pas en train de lire ce livre sans le dvouement et le soutien des personnessuivantes :

    Mes parents : leur amour inbranlable, leurs encouragements, leur aide et mmeleurs plaisanteries ont t vitaux lcriture de ce livre. Ils ont toujours t l pourmoi et je sais quils le seront toujours. Maman, papa, je vous aime.

    Ma petite sur, Molly : elle est mon agent publicitaire officieux et dit tous ceuxquelle rencontre dacheter ce livre.

    Judy Bass, mon ditrice McGraw-Hill : son enthousiasme pour le projet et sa foien moi ds le dpart compteront toujours pour moi.

    Pete Ingram-Cauchi, le CEO de iD Tech Camps : ses cours UCLA et Stanfordont nourri ma passion pour tout ce qui touche la programmation.

    JeuxVideo Livre Page 4 Mercredi, 18. juin 2008 5:41 17

  • Le compilateur

    Faire obir votre ordinateurVous navez besoin que de trois choses pour commencer crer vos propres jeux : unordinateur (PC, Mac), ce livre... et un compilateur. Ce logiciel traduit votre code enun langage que votre ordinateur pourra comprendre. Si vous navez pas encore decompilateur, il peut tre tlcharg gratuitement sur Internet.Sous Windows et sous Linux, allez ladresse http://java.sun.com et cliquez surJava SE sous Popular Downloads. Cliquez sur le bouton Download situ ct du titreJDK 6 Update 6 with NetBeans 6.1 . Dans la page qui saffiche, cliquez sur le boutonDownload. Choisissez votre plateforme et acceptez laccord de licence avant decliquer sur Continue. Cliquez sur le lien pour tlcharger linstalleur.Mac OS X dispose dj dun compilateur Java et il suffit donc dinstaller NetBeans.Allez ladresse http://download.netbeans.org/netbeans/6.1/final/, choisissez votreplate-forme dans le menu en haut droite et cliquez sur le bouton Download de lapremire colonne (Web & Java EE).JDK signifie Java Development Kit (kit de dveloppement Java). Ce logiciel permettra lordinateur de comprendre le code. NetBeans est un environnement de dveloppe-ment intgr qui facilite lcriture du code.Installez NetBeans en cliquant sur licne dinstallation (sous Linux, NetBeans peutgalement faire partie de votre base de paquetages par dfaut, auquel cas il nest pasncessaire de le tlcharger et il sinstallera comme tout autre logiciel).

    JeuxVideo Livre Page 5 Mercredi, 18. juin 2008 5:41 17

  • 6 Devenez un petit gnie des jeux vido

    Examinons maintenant linterface. Cliquez sur File > New Project.

    Cliquez sur Java Application.

    Figure 0.1Le menu File de NetBeans

    Figure 0.2La fentre de cration de projets

    JeuxVideo Livre Page 6 Mercredi, 18. juin 2008 5:41 17

  • Le compilateur 7

    Cliquez sur Next et saisissez le nom du projet dans Project Name. Ce nom devraitcommencer par une majuscule et ne pas contenir despace.

    Cliquez sur Finish.Pour crer un environnement dans lequel vous pourrez crire votre code, commencezpar supprimer Main.java, puis cliquez sur le rpertoire parent et cliquez sur New >Java Class...

    Figure 0.3Nommer le projet

    JeuxVideo Livre Page 7 Mercredi, 18. juin 2008 5:41 17

  • 8 Devenez un petit gnie des jeux vido

    Et voil... Vous navez plus qu conqurir le monde des jeux vido !

    Figure 0.4Suppression du fichier Main.java

    Figure 0.5Cration dune nouvelle classe Java

    JeuxVideo Livre Page 8 Mercredi, 18. juin 2008 5:41 17

  • 1Java dans les starting-blocksAu sommaire de ce chapitre :

    Projet 1 : Le perroquet Projet 2 : Devinez le mot de passe ! Projet 3 : Calcul mental Projet 4 : Une bibliothque virtuelle de jeux Projet 5 : Devinez le nombre !

    JeuxVideo Livre Page 9 Mercredi, 18. juin 2008 5:41 17

  • 10 Devenez un petit gnie des jeux vido

    Projet 1 : Le perroquet

    Lorsque lon apprend programmer en Java, il faut connatre quatre types de codeessentiels : les commentaires, les instructions, les dclarations et le contrle de flux.

    Les commentairesLes commentaires commencent toujours par //.Les compilateurs ne prennent pas en compte ces commentaires.Ils ne sont utiles quaux programmeurs qui peuvent ainsi documenter le code. Unebonne documentation (de bons commentaires) permet de modifier le code plus facile-ment ultrieurement. Lorsquun programme atteint quelques centaines de lignes, il estdifficile de se souvenir quoi sert chaque ligne. Les commentaires sont trs utiles dansce cas.

    Les instructionsLes instructions permettent de "faire des choses", par exemple afficher quelque chose lcran. Elles se terminent toujours par un point-virgule.

    Les dclarationsLes dclarations sont des instructions qui crent ou modifient des variables. Lesvariables sutilisent comme en mathmatiques (x = 4), ceci prs quelles peuventcontenir dautres lments que des nombres. Nous en parlerons plus longuementdans le prochain projet.

    Le contrle de fluxLe contrle de flux sert manipuler les instructions utilises. Nous en parlerons plustard (Projet 3).Tous les programmes Java sont contenus dans ce que lon appelle une classe (class).On cre une classe avec le code suivant :

    public class

    Projet Tapez un message, appuyez sur deux boutons, et lordinateur le rptera.

    Nouvelles briques Classes, instructions et variables

    JeuxVideo Livre Page 10 Mercredi, 18. juin 2008 5:41 17

  • Chapitre 1 Java dans les starting-blocks 11

    Le nom de la classe doit correspondre au nom du fichier, il doit toujours commencerpar une lettre majuscule et ne doit pas contenir despace. Par exemple, la classePingouin sera contenue dans le fichier Pingouin.java.

    Pour dlimiter le code appartenant une classe, on utilise les caractres { et } au dbutet la fin du code, respectivement.

    Au sein dune classe, Java cherche la mthode principale, appele main. Une mthodeest un morceau de code qui peut tre appel plusieurs fois. La mthode main est unemthode spciale : Java lappelle toujours en premier (cest--dire excute le code quisy trouve). Voici ce quoi elle ressemble :

    public static void main (String[] args)

    Vous pouvez pour linstant considrer que cette ligne de code doit introduire lamthode main. Nous discuterons des diffrents lments de cette ligne plus tard.

    En dehors des mthodes, il ne peut y avoir dans une classe que des dclarations et descommentaires. Les dclarations sont appeles les variables de la classe. Dans lamthode dune classe, on peut trouver des dclarations, des commentaires, du contrlede flux et des instructions. On peut accder aux variables dune classe partir detoutes les mthodes, mais les variables lintrieur dune mthode ne sont accessiblesque depuis cette mthode.

    Voici une instruction simple, galement illustre la Figure 1.1, permettant dafficherun message lcran :

    System.out.println("Ce message entre guillemets est affich.");

    Ce code est une mthode fournie par Java. Il suffit de lui indiquer le texte afficher,entre guillemets.

    lintrieur des guillemets, il existe des squences dchappement qui sont des suitesde caractres permettant de manipuler le texte. Ajoutez-les simplement dans le texteentre guillemets.

    Figure 1.1Ce code affiche du texte lcran

    JeuxVideo Livre Page 11 Mercredi, 18. juin 2008 5:41 17

  • 12 Devenez un petit gnie des jeux vido

    Crer le jeuPour que le programme rpte le texte que vous avez saisi, vous devez donc crer uneclasse, crire la mthode main et ajouter le code System.out.println(). Tout ce quevous placerez entre guillemets sera rpt par lordinateur.Essayez de faire cela tout seul. Si cela fonctionne, vous avez gagn et vous pouvezpasser au projet suivant !Si vous avez besoin daide, le code complet est indiqu ci-aprs :

    // cre une classe nomme S1P1public class S1P1{ // ceci est la mthode main public static void main (String[] args) { // ceci affiche ce qui est crit entre guillemets System.out.println("Ce que vous tapez ici... sera rpt!"); }}

    Cliquez sur Build > Build Main Project > OK. Ceci compile votre jeu, comme lemontre la Figure 1.2. Cliquez sur Run > Run Main Project. Ceci lance le projet,comme le montre la Figure 1.3. La Figure 1.4 illustre laffichage de votre premier jeu !

    Tableau 1.1 : Squences dchappement

    Squence dchappement Rsultat

    \n Cre un retour la ligne

    \t Indente la ligne (ajoute une tabulation)

    \" Permet dajouter un guillemet lintrieur des guillemets

    Figure 1.2Compiler le projet

    JeuxVideo Livre Page 12 Mercredi, 18. juin 2008 5:41 17

  • Chapitre 1 Java dans les starting-blocks 13

    Dans le projet suivant, vous apprendrez comment enregistrer des informations impor-tantes (telles que le score actuel) et comment obtenir une saisie de lutilisateur.

    Figure 1.3Lancer le projet

    Figure 1.4Affichage du projet

    JeuxVideo Livre Page 13 Mercredi, 18. juin 2008 5:41 17

  • 14 Devenez un petit gnie des jeux vido

    Projet 2 : Devinez le mot de passe !

    lheure actuelle, vous savez crer un programme simple qui affiche un message lcran. Vous allez maintenant apprendre crer des variables, les manipuler et lestester.

    Cration de variablesCes lignes se terminent toujours par des points-virgules !Voici les types de variables de base que vous utiliserez le plus souvent : Integer (entier) int. Un entier positif ou ngatif. Double (nombre virgule flottante) double. Un nombre dcimal positif ou ngatif. Character (caractre) char. Une lettre. String (chane) String. Un ensemble de caractres. Boolean (boolen) boolean. Une valeur vraie (true) ou fausse (false).Comment crer (dclarer et initialiser) une variable ? Les variables de type int, doubleou char se dclarent comme ceci :

    int = ;

    int peut tre remplace par double ou par char. est remplacer par nimporte quel nom commenant par une lettre minuscule(pas de nombre ni de symbole).Pour les variables de type int, peut contenir nimporte quel nombre (parexemple 10, 9 999 ou 298).Pour les variables de type char, est une lettre entre apostrophes (par exemple,char lettre = k;).Pour les variables de type String, est une chane de caractres entre guillemets(par exemple, String texte = "Je suis une chane de caractres.";).

    Projet Programmez lordinateur pour vrifier que le mot de passe a bien t tap. Dans cet exercice deux joueurs, un joueur donne des indices pendant que lautre tape des essais de mots de passe. Lordinateur prvient le joueur lorsquil a gagn. Le mot de passe peut tre chang par le biais de fentres pop-up et il est sauv dans un fichier.

    Nouvelles briques Variables (cration et utilisation), blocs if, transtypage, saisie utilisateur, accs des fichiers

    JeuxVideo Livre Page 14 Mercredi, 18. juin 2008 5:41 17

  • Chapitre 1 Java dans les starting-blocks 15

    Vous pouvez aussi crer une variable sans indiquer sa valeur (cela sappelle une dcla-ration). Il suffit pour cela de terminer la ligne prmaturment avant linitialisation dela variable grce un point-virgule :

    int number;

    Si la variable est dj dclare et si vous voulez modifier (ou initialiser) sa valeur,utilisez le code suivant (cela sappelle une initialisation) :

    nombre = 1;

    On peut aussi modifier la valeur dun entier int ou dun flottant double en utilisant lessyntaxes qui suivent. Pour ajouter 1 nombre :

    nombre++;

    Pour enlever 1 nombre :

    nombre--;

    Pour ajouter 5 (ou toute autre valeur/variable) nombre :nombre +=5;

    Pour donner nombre la valeur de la somme de deux variables :

    nombre = +

    variable1 et variable2 peuvent tre remplaces par un nombre ou par une autre varia-ble de type int ou double.+ peut tre remplac par -, *, / ou %. Loprateur % renvoie le reste de la division dupremier nombre par le second.On peut concatner des variables de type String. La concatnation est la combinaisonde deux chanes. Par exemple, la chane txt rsultant de String txt = "Ceci estajout " + " cela." contiendra "Ceci est ajout cela.".

    Tester des variablesUtilisez des instructions if pour tester des variables, comme le montre le code suivant :

    if(==){}

    et peuvent tre remplaces par nimporte quelle variable ouvaleur.

    JeuxVideo Livre Page 15 Mercredi, 18. juin 2008 5:41 17

  • 16 Devenez un petit gnie des jeux vido

    On peut aussi utiliser dautres comparateurs la place de == :

    != teste lingalit.

    > teste si la premire variable est strictement suprieure la seconde.

    < teste si la premire variable est strictement infrieure la seconde.

    >= teste si la premire variable est suprieure ou gale la seconde.

  • Chapitre 1 Java dans les starting-blocks 17

    Saisie de lutilisateurVous savez maintenant comment comparer des valeurs. Vous devez maintenant accder la saisie de lutilisateur. Ajoutez dabord une ligne (quil vous suffit de mmoriser,nous lexpliquerons plus tard) au tout dbut de votre programme, avant la dclarationde la classe :

    import javax.swing.*;

    Ajoutez ensuite le code suivant lendroit o vous dsirez que lutilisateur saisissequelque chose :

    String saisie = JOptionPane.showInputDialog("Quel est votre nom?");

    Ceci cre une fentre de dialogue, demandant "Quel est votre nom ?" et permettant derpondre dans zone de saisie (voir Figure 2.1).

    saisie contient la valeur saisie par lutilisateur. Cette valeur est toujours une valeur detype String, mais peut tre transforme en dautres valeurs.

    Cette mthode peut diminuer le nombre de valeurs coder en dur. Coder en dursignifie insrer la valeur dune variable directement dans le programme. Lorsquevous obtenez une saisie dun utilisateur, vous pouvez initialiser des variables aprs lacompilation du programme.

    TranstypageLe transtypage permet de modifier un type de variable (par exemple String) en unautre type de variable (par exemple int). Pour faire cela, utilisez le code suivant (ensupposant que vous ayez dj une variable de type String nomme saisie) :

    int saisieSousFormeInt = Integer.parseInt(input);double saisieSousFormeDouble = Double.parseDouble(input);

    Vous pouvez maintenant manipuler des entres utilisateur !

    Figure 2.1Bote de dialogue de saisie

    JeuxVideo Livre Page 17 Mercredi, 18. juin 2008 5:41 17

  • 18 Devenez un petit gnie des jeux vido

    Crer des fichiersTous les types de fichiers sont sauvs de la mme manire. La seule diffrence estlextension (.doc, .txt, .avi, .jpg, etc.). Les extensions servent indiquer lordina-teur et lutilisateur quel programme doit tre utilis pour ouvrir le fichier. Dans notreexemple, le mot de passe sera enregistr dans un fichier.mdp. Mais nous aurions aussibien pu lenregistrer dans un fichier.petitGenie ou .nimportequoi.

    Crez dabord un fichier grce au code suivant :

    File fichier = new File("motdepasse.mdp");

    Cette ligne ne fait pour linstant pas grand-chose. Elle se contente dallouer un espacepour un fichier nomm motdepasse.mdp.

    Nous allons maintenant voir comment sauver ce fichier sur votre ordinateur. Vousdevez pour cela crire le code suivant :

    FileOutputStream fluxSortie = new FileOutputStream();

    est le nom de lobjet File cr prcdemment (dans notre cas, Fichier).fluxSortie est le nom de la variable ; cest un nom arbitraire.

    PrintWriter sortie = new PrintWriter(fluxSortie);

    fluxSortie est le nom de lobjet FileOutputStream dfini prcdemment.sortie est galement un nom de variable.

    Jusquici, nous avons allou de lespace pour un fichier et prpar lordinateur lenregistrer. La ligne suivante enregistre effectivement le fichier :

    sortie.println("Ce texte est crit dans le fichier");

    "Ce texte est crit dans le fichier" est habituellement une variable de typeString.

    Une fois le fichier cr, il faut indiquer lordinateur que tout est fini. Utilisez pourcela les lignes suivantes :

    sortie.flush();sortie.close();fluxSortie.close();

    Voil, vous savez prsent comment crire et enregistrer un fichier.

    JeuxVideo Livre Page 18 Mercredi, 18. juin 2008 5:41 17

  • Chapitre 1 Java dans les starting-blocks 19

    Accder des fichiersCrez nouveau un objet File :

    File fichier = new File("motdepasse.mdp");

    Cette fois, la variable de type String (ici, "motdepasse.mdp") est le nom du fichier quevous allez ouvrir.

    Ensuite, crez un objet de type FileReader. La classe FileReader sert ouvrir le fichieret en prparer la lecture.

    FileReader fr = new FileReader(fichier);

    fichier est lobjet File cr prcdemment auquel nous accdons.fr est le nom de la variable.Crez alors un objet de type BufferedReader. La classe BufferedReader sert lire letexte dun fichier ouvert.

    BufferedReader tampon = new BufferReader(fr);

    fr est le nom de lobjet FileReader.tampon est le nom de la variable.Pour lire la premire ligne de votre fichier, utilisez la ligne :

    String ligne = tampon.readLine();

    Lorsque vous avez termin daccder un fichier, vous devez indiquer lordinateurque vous avez fini :

    tampon.close();fr.close();

    Vous devez aussi ajouter un throw Exception (dont nous parlerons dans le Projet 3)dans la dclaration de la mthode main et une ligne import java.io.*; pour pouvoiraccder aux fichiers.

    Crer le jeuLorsque le joueur lance le jeu, deux options soffrent lui : jouer ou rinitialiser le jeu.Sil dcide de rinitialiser le jeu, il doit saisir un nouveau mot de passe (qui serasauvegard dans un fichier).

    JeuxVideo Livre Page 19 Mercredi, 18. juin 2008 5:41 17

  • 20 Devenez un petit gnie des jeux vido

    Sil dcide de jouer, il pourra essayer de deviner le mot de passe.Pour crire le jeu, nous utiliserons la classe JOptionPane pour proposer les diffrentschoix au joueur.Lorsque le joueur dcide de saisir un nouveau mot de passe, il faut utiliser le codedcriture de fichier pour sauvegarder le nouveau mot de passe dans un fichier.

    Si le joueur prfre essayer de trouver le mot de passe, accdez au fichier et testezlgalit des essais du joueur avec le texte du fichier.Affichez un message positif (par exemple "Bravo, vous avez devin : vous tes un petitgnie !") grce System.out.println() si lutilisateur a devin le mot de passe.Sinon, affichez un message dchec (par exemple : "Rat !").

    //permettre la saisie utilisateurimport javax.swing.*;// permettre laccs aux fichiersimport java.io.*;//cre une classe nomme S1P2public class S1P2{ //mthode main. throws Exception est ncessaire pour les accs aux fichiers public static void main(String[] args) throws Exception { //cette chaine contiendra la saisie utilisateur String saisie; //saisie utilisateur saisie = JOptionPane.showInputDialog("1 pour initialiser le mot de passe,\n"+"2 pour chercher le message"); //fichier modifi et lu File fichier = new File("motdepasse.mdp"); //faut-il saisir ou lire le mot de passe? if(saisie.equals("1")) { //on veut modifier le mot de passe //rcupre le nouveau mot de passe String p = JOptionPane.showInputDialog("Saisissez le nouveau mot de passe"); //ces deux lignes initialisent lcriture dans le fichier FileOutputStream fluxSortie = new FileOutputStream(fichier); PrintWriter sortie = new PrintWriter(fluxSortie); //crit le mot de passe dans le fichier sortie.println(p); //on ferme tout sortie.flush(); sortie.close(); fluxSortie.close(); }

    JeuxVideo Livre Page 20 Mercredi, 18. juin 2008 5:41 17

  • Chapitre 1 Java dans les starting-blocks 21

    //si lutilisateur veut trouver le mot de passe else { //il faut dabord le rcuprer FileReader fr = new FileReader(fichier); BufferedReader tampon = new BufferedReader(fr); //le mot de passe du fichier String passe = tampon.readLine(); //rcupre lessai de lutilisateur String passeUtilisateur; passeUtilisateur = JOptionPane.showInputDialog("Saisissez votre essai..."); //tester le mot de passe if(passe.equals(passeUtilisateur)) { //si cest correct JOptionPane.showMessageDialog(null,"CORRECT!!!!"); } else { //si cest faux JOptionPane.showMessageDialog(null,"RAT:("); } } }}

    Les Figures 2.2 2.6 illustrent le jeu.

    Figure 2.2Rinitialiser ou deviner le mot de passe

    Figure 2.3Saisir le nouveau mot de passe

    Figure 2.4Deviner le mot de passe enregistr

    JeuxVideo Livre Page 21 Mercredi, 18. juin 2008 5:41 17

  • 22 Devenez un petit gnie des jeux vido

    Figure 2.5Bonne rponse

    Figure 2.6Mauvaise rponse

    JeuxVideo Livre Page 22 Mercredi, 18. juin 2008 5:41 17

  • Chapitre 1 Java dans les starting-blocks 23

    Projet 3 : Calcul mental

    Nombres alatoiresLes nombres alatoires sont de type double car ils sont compris entre 0 (inclus) et 1(exclus). Pour crer un nombre alatoire entre 0 et 1, utilisez cette instruction :

    Math.random()

    Elle renvoie une valeur, de la mme manire que JOptionPane, ceci prs que la valeurrenvoye est de type double et non String.

    Pour crer un nombre alatoire dun chiffre, essayez ce code :

    int rand = (int) (Math.round(Math.random()*10));

    (int) permet de sassurer que la variable rsultante est bien de type int.

    Math.round() arrondit lentier le plus proche.

    Faire une pauseVous pouvez imposer lordinateur de faire une pause dune dure donne avec unecommande trs simple :

    Thread.sleep(100);

    100 est le nombre de millisecondes de la pause (cette valeur peut tre remplace parune variable de type int).Vous devez aussi ajouter un lment la fin de la dclaration de la mthode main.Aprs (String[] args), ajoutez throws Exception.La ligne complte ressemblera alors ceci :

    public static void main (String[] args) throws Exception

    Projet Le programme affiche des quations mathmatiques. Lutilisateur doit rsoudre le problme avant que lordinateur nait fini son dcompte depuis 3 et naffiche la rponse correcte. Pouvez-vous battre lordinateur ?

    Nouvelles briques Nombres alatoires, pauses, boucles.

    JeuxVideo Livre Page 23 Mercredi, 18. juin 2008 5:41 17

  • 24 Devenez un petit gnie des jeux vido

    BouclesIl est temps dapprendre quelques techniques de contrle de flux. Le contrle de fluxpermet de rpter et dexcuter diffrentes parties du code diffrents moments enfonction dune condition (par exemple, x==4). Il existe trois types de boucles.

    Boucles for

    Les boucles for permettent dexcuter le code lintrieur des accolades jusqu cequune condition donne soit satisfaite. En voici le format :

    for (; ; ) { // le code rpt se trouve ici}

    est une dclaration de variable classique (par exemple int i = 0;). peut tre i0, i>=0 ou i

  • Chapitre 1 Java dans les starting-blocks 25

    Fonctionnement dune boucle while

    Lorsque le compilateur rencontre une boucle while, la condition est teste. Si elle estvrifie, le compilateur entre dans la boucle et reteste la condition chaque itration.Si la condition nest pas vrifie, la boucle est arrte.

    Boucles do ... while

    Les boucles do ... while sont presque identiques aux boucles while. En voici unexemple :

    int i = 0;do{ i++;}while (i

  • 26 Devenez un petit gnie des jeux vido

    Dclarez et initialisez deux variables de type int avec un nombre alatoire entre 0 et 9.Puis, crez une nouvelle variable de type int avec un nombre alatoire entre 0 et 4 : Si le nombre est 0, lopration sera * (multiplication). Si le nombre est 1, lopration sera / (division). Si le nombre est 2, lopration sera + (addition). Si le nombre est 3, lopration sera (soustraction). Si le nombre est 4, lopration sera % (modulo).Crez une nouvelle variable contenant la solution du problme mathmatique.Puis, mettez le programme en pause pour laisser lutilisateur le temps de rpondre la question.

    Affichez la variable qui contient la solution.Si le joueur peut calculer la rponse correcte avant que lordinateur ne laffiche, ilgagne la partie.

    Pour rendre les choses un peu plus amusantes, nous pouvons laisser lutilisateur choisirson niveau de difficult en modifiant le dcompte de temps (de 1, petit gnie, 10, nulen mathmatiques) : plus le niveau est bas, moins le joueur a de temps pour rpondre.Nous pouvons aussi demander lutilisateur sil dsire continuer grce une boucledo... while.

    Les plus malins dentre vous se demanderont ce quil se passe si le gnrateur denombres alatoires propose une division pour le signe et un 0 comme second oprandede lopration. Dans ce cas, le programme lance une exception, ce qui le fait termineravec une erreur.

    Pour viter cela, il suffit de placer le code de gnration du second oprande dans uneboucle do... while ; si le rsultat est 0, il suffit de le modifier.Voici le code :

    //permettre la rcupration de saisies utilisateurimport javax.swing.*;//cre une classe nomme S1P3public class S1P3 {//mthode main. (throw Exception) est ncessaire pour Thread.sleep() public static void main(String[] args) throws Exception { //nombre de demi-secondes accordes lutilisateur int difficulte;

    JeuxVideo Livre Page 26 Mercredi, 18. juin 2008 5:41 17

  • Chapitre 1 Java dans les starting-blocks 27

    difficulte = Integer.parseInt(JOptionPane.showInputDialog(" quel point tes-vous dou ?\n" + "1 = je suis un petit gnie !\n"+ "10 = je ne suis pas vraiment dou.")); //indique la boucle sil faut continuer ou pas boolean cont = false; //le contenu de la mthode main est encadr dans une boucle while do { //rinitialise la variable cont false cont = false; //nombres alatoires pour lquation int num1 = (int)(Math.round(Math.random()*10)); //la boucle do... while sert viter lexception. num2 doit tre //dclar lextrieur de la boucle do... while pour tre visible // lextrieur de cette boucle. int num2; do { //initialisation de num2 num2 = (int)(Math.round(Math.random()*10)); } while(num2 == 0); //si num2 vaut zro, on recommence //nombre alatoire pour le signe int signe = (int)(Math.round(Math.random()*3)); //contiendra la rponse int reponse; //rend laffichage plus lisible System.out.println("\n\n*****"); if(signe==0) { //affiche la question et calcule la rponse System.out.println(num1+" fois "+num2); reponse = num1*num2; } else if(signe == 1) { //affiche la question et calcule la rponse System.out.println(num1+" divis par "+num2); reponse = num1/num2; } else if(signe == 2) { //affiche la question et calcule la rponse System.out.println(num1+" plus "+num2); reponse = num1+num2; } else if(signe == 3) { //affiche la question et calcule la rponse System.out.println(num1+" moins "+num2); reponse = num1-num2; } else { //affiche la question et calcule la rponse System.out.println(num1+" % "+num2); reponse = num1%num2; } //rend laffichage plus lisible System.out.println("*****\n");

    JeuxVideo Livre Page 27 Mercredi, 18. juin 2008 5:41 17

  • 28 Devenez un petit gnie des jeux vido

    //dcompte pour la difficult - on utilise une boucle for for(int i = difficulte; i >= 0; i--) { //affichage du temps restant System.out.println(i+"..."); //on attend une demi-seconde par //niveau de difficult Thread.sleep(500); } //affiche la rponse System.out.println("RPONSE: "+reponse); //demande lutilisateur sil veut rejouer String encore; encore = JOptionPane.showInputDialog("Rejouer? (oui/non)"); //si lutilisateur rpond oui, on passe la valeur de cont true if(encore.equals("oui")) cont = true; } while(cont); //on continue tant que cont a la valeur true }}

    Les Figures 3.1 3.3 illustrent le jeu.

    Figure 3.1Saisie du niveau de difficult

    Figure 3.2quation, dcompte et rsultat

    JeuxVideo Livre Page 28 Mercredi, 18. juin 2008 5:41 17

  • Chapitre 1 Java dans les starting-blocks 29

    Pour aller plus loin...Vous devez avoir remarqu que les rponses ne sont pas toujours exactes. Par exemple,3/4 renvoie 1 et non 0,75. Pour corriger ce comportement, il suffit de modifier toutesles variables de type int (sauf celle contenant le signe) en variables de type double.

    Figure 3.3Rejouer ?

    JeuxVideo Livre Page 29 Mercredi, 18. juin 2008 5:41 17

  • 30 Devenez un petit gnie des jeux vido

    Projet 4 : Une bibliothque virtuelle de jeux

    Nous avons vu comment crer des jeux basiques ; nous allons maintenant apprendre les enregistrer pour y accder facilement. Pour cela, nous avons besoin de structuresde donnes.La structure de donnes dont nous allons parler dans ce projet sappelle un tableau(array). Un tableau permet denregistrer de nombreuses variables du mme type (parexemple int, double ou String). Vous pourrez alors rcuprer la valeur dune variabledun tableau en fonction de sa position.Linconvnient des tableaux est quil est difficile dy ajouter de nouvelles variables(appeles, dans un tableau, des lments). Cest pour cette raison que nous allonsgalement introduire les objets ArrayList.

    TableauxPour crer et initialiser un tableau en une seule instruction, utilisez ce type de ligne :

    int pleinDEntiers[] = {-981, 45, -6, 7};

    Cette instruction cre un tableau nomm pleinDEntiers contenant les valeurs 981,45, 6 et 7.Pour crer un tableau sans en initialiser les lments, on utilise cette syntaxe :

    int sixEntiers = new int[6];

    Ceci cre un tableau pouvant contenir six lments de type int ; pour linstant, lesvaleurs du tableau sont vides. Il faut toujours dfinir la taille dun tableau, qui dansnotre cas est six.Pour accder une valeur/un lment dun tableau ou pour la modifier, il faut sesouvenir dune notion importante : les numros dlments commencent zro. Parexemple, dans le tableau pleinDEntiers, le premier lment ( la position 0) est 981.Le second lment ( la position 1) est 45. Et, bien sr, llment la position 2 est 6.

    Modifier une valeur dans un tableauPour modifier une valeur dans un tableau, on utilise une syntaxe de ce type :

    [] = ;

    Projet Une archive des jeux que vous avez crs.Nouvelles briques Tableaux, ArrayList.

    JeuxVideo Livre Page 30 Mercredi, 18. juin 2008 5:41 17

  • Chapitre 1 Java dans les starting-blocks 31

    Par exemple, pour modifier le premier lment ( la position 0) du tableau plein-DEntiers et lui donner la valeur 50, on utilisera :

    pleinDEntiers[0] = 50;

    Rcuprer une valeur dans un tableau

    Pour rcuprer une valeur dans un tableau, on utilise une syntaxe du type :

    = [];

    Pour rcuprer la valeur du premier lment de pleinDEntiers, on utilisera donc :

    int num = pleinDEntiers[0];

    Objets ArrayListUn ArrayList contient des classes (aussi appeles objets). Il sagit bien de la mmechose que les classes que vous dclarez lorsque vous crez un programme (dans lecode public class). Pour linstant, nous nutiliserons cependant que des classesdj programmes. Nous avons dj utilis les syntaxes Integer.parseInt() etDouble.parseDouble(). Double et Integer sont deux classes pouvant tre contenuesdans un ArrayList. Pour simplifier, nous ne parlerons pour linstant que de ces deuxclasses.

    Toutes les classes appartiennent une hirarchie. Le membre le plus lev de toutesles classes est appel Object. Un ArrayList ne contient que des Object que lon peutensuite transtyper dans la classe de lobjet dorigine (dans notre cas, Integer ouDouble). Voici le code utilis pour crer un ArrayList. Notez quil nest fait aucune mention dutype des objets qui seront contenus dedans.

    ArrayList structure = new ArrayList();

    Il nest pas possible dinitialiser des valeurs sur la mme ligne. Pour ajouter unevaleur, on utilise :

    structure.add(new Integer(5));

    Vous pouvez ajouter autant dlments que vous le dsirez.Pour rcuprer une valeur (dont vous connaissez la position, qui commence toujourspar 0), utilisez le code suivant :

    JeuxVideo Livre Page 31 Mercredi, 18. juin 2008 5:41 17

  • 32 Devenez un petit gnie des jeux vido

    Object objTemp = structure.get(0);Integer intTemp = (Integer)tempObj;int numFinal = intTemp.intValue();

    La premire ligne rcupre lObject la position 0 de lArrayList. La deuxime lignetransforme lobjet en entier (pour le transformer en Double, remplacez Integer parDouble). La dernire ligne transforme lobjet Integer en variable de type int (si voustravaillez avec des Double, changez intValue en doubleValue et int en double).

    Crer le jeuNous allons crer une bibliothque virtuelle pour enregistrer le nom des jeux quevous avez crs. La bibliothque permet daccder aux jeux en saisissant le numrodlment du jeu. Elle permet galement de crer des lments. Pour cela nous allonsutiliser un ArrayList.

    Demandez lutilisateur, grce un JOptionPane, sil dsire ajouter un nouveau jeu ouaccder un jeu. Sil saisit 1, ajoutez la nouvelle chane de caractres lArrayList.Sil saisit 2, utilisez un nouveau JOptionPane pour obtenir le numro dlment, puisun troisime JOptionPane pour afficher le nom du jeu.Le tout est encapsul dans une boucle do... while pour que lutilisateur puisse relancerle programme sil le dsire.

    //on importe les lments ncessairesimport javax.swing.*;import java.util.*;public class S1P4{ public static void main (String[] args) { //dfinition de lArrayList ArrayList jeux = new ArrayList(); //utilis comme condition darrt de la boucle boolean cont = false; do { cont = false; //rinitialiser cont //que veut faire lutilisateur? int choix = Integer.parseInt(JOptionPane. showInputDialog("Saisissez\n"+"1 pour ajouter un nouveau jeu\n"+ "2 pour accder un jeu")); if(choix == 1) { //rcupre le nom String nom; nom = JOptionPane.showInputDialog("Nom du jeu?");

    JeuxVideo Livre Page 32 Mercredi, 18. juin 2008 5:41 17

  • Chapitre 1 Java dans les starting-blocks 33

    //on lajoute jeux.add(nom); } if(choix ==2) { //on demande lutilisateur quel nom renvoyer int element = Integer.parseInt(JOptionPane. showInputDialog("Quel lment?")); //ceci est affich dans un nouveau JOptionPane String sortie = "Le nom du jeu est:\n"; //concatnation et rcupration de llment sortie+=((String)jeux.get(element)); //on affiche dans le JOptionPane JOptionPane.showMessageDialog(null,sortie); } //saisie utilisateur pour la rptition String repeter = JOptionPane.showInputDialog("Recommencer? (oui/non)"); if(repeter.equals("oui")) cont = true; } while(cont); //continuer tant que cont a la valeur true }}

    Les Figures 4.1 4.5 illustrent les diffrentes phases du programme. Dans le projetsuivant, nous rsumerons tout ce que nous avons appris dans un jeu de devinettes denombres !

    Figure 4.1Choix du mode : ajout dun jeu ou affichage dun jeu

    Figure 4.2Saisie dun nouveau nom de jeu

    JeuxVideo Livre Page 33 Mercredi, 18. juin 2008 5:41 17

  • 34 Devenez un petit gnie des jeux vido

    Figure 4.3Continuer le programme

    Figure 4.4Accder un jeu en indiquant son numro

    Figure 4.5Affichage du jeu demand

    JeuxVideo Livre Page 34 Mercredi, 18. juin 2008 5:41 17

  • Chapitre 1 Java dans les starting-blocks 35

    Projet 5 : Devinez le nombre !

    Crer le jeuCommencez par gnrer un nombre alatoire. Puis, utilisez une boucle do... while.Rcuprez une saisie utilisateur (son essai) et comparez-la au nombre correct avec desinstructions if. Cela fournira les indices pour le joueur. La boucle do... while setermine lorsque la tentative est couronne de succs.

    import javax.swing.*;public class S1Resume{ public static void main (String[] args) { //contient les essais de lutilisateur int essai = -1; //nombre dessais int nombre = 0; //cration du nombre int num = (int) (Math.random()*100); //boucle pour interroger lutilisateur do { essai = Integer.parseInt(JOptionPane. showInputDialog("Devinez un nombre entre 0 et 100")); if(essai>num) JOptionPane.showMessageDialog(null,"Trop grand"); if(essai

  • 36 Devenez un petit gnie des jeux vido

    Les Figures 5.1 5.4 montrent le jeu Devinez le nombre ! Si vous avez des problmesavec ce code, ne dsesprez pas ! Revoir les projets prcdents pourra vous aider rafrachir vos connaissances. Si vous avez pu crire ce code tout seul, bravo, vous tes sur le bon chemin pour deve-nir un petit gnie de la programmation de jeux vido !

    Figure 5.1Tentative pour deviner le nombre

    Figure 5.2Lessai tape trop haut

    Figure 5.3Lessai tape trop bas

    Figure 5.4Vous avez trouv la bonne rponse !

    JeuxVideo Livre Page 36 Mercredi, 18. juin 2008 5:41 17

  • Chapitre 1 Java dans les starting-blocks 37

    Java dans les starting-blocks : le rsum Commentaires. Les commentaires permettent de documenter le code pour savoir

    ce que fait chaque partie de votre jeu. Instructions. Les instructions sont des commandes. Elles sont la base de tout jeu. Contrle de flux. Les boucles permettent de rpter du code. Elles sont utiles

    lorsquun utilisateur veut ressayer un jeu lorsquil a perdu. Variables. Les variables permettent de garder trace du score du joueur, des points,

    etc.

    Instructions if. Les instructions if permettent de tester des variables. Vouspouvez par exemple tester si un joueur a encore des vies ou sil est dfinitivementmort.

    JOptionPane. Un JOptionPane permet dobtenir des saisies et dafficher des messa-ges. Un exemple de message peut tre le score dun utilisateur. Un exemple desaisie peut tre le nom de lutilisateur pour la liste des scores records.

    Nombres alatoires. Les nombres alatoires servent lintelligence artificielle(faire bouger un ennemi de manire alatoire, etc.).

    Pauses. Les pauses permettent dattendre que lcran se rafrachisse pour que lesgraphismes du jeu aient une qualit optimale.

    Tableaux. Les tableaux peuvent garder trace de lenvironnement du jeu (par exem-ple la liste des voitures dans un jeu de course, une liste de munitions dans un jeu detir).

    ArrayList. Les ArrayList peuvent tre utiliss pour enregistrer les noms et scoresdes joueurs.

    Accs aux fichiers. Les accs aux fichiers servent garder une liste de recordspermanents pour les jeux.

    JeuxVideo Livre Page 37 Mercredi, 18. juin 2008 5:41 17

  • JeuxVideo Livre Page 38 Mercredi, 18. juin 2008 5:41 17

  • 2Jeux de courseAu sommaire de ce chapitre :

    La course du courage Projet 6 : La piste Projet 7 : Les voitures Projet 8 : Collisions ! Projet 9 : PersonnalisationLe skieur Projet 10 : La piste Projet 11 : Piste verte Projet 12 : La comptition

    JeuxVideo Livre Page 39 Mercredi, 18. juin 2008 5:41 17

  • 40 Devenez un petit gnie des jeux vido

    Projet 6 : La course du courage La piste

    JFrameUn JFrame est une des mthodes les plus simples pour crer une interface graphique(GUI, Graphical User Interface). Il cre une fentre (similaire un JOptionPane)dune taille donne. Vous pouvez y ajouter des graphismes, des boutons, des champsde texte, des libells, etc.La Figure 6.1 reprsente un JFrame avant tout ajout de graphismes ou dimages.Pour crer un JFrame, ajoutez extends JFrame la fin de la ligne public class... Parexemple, si votre classe sappelle Jeu, la ligne ressemblerait ceci :

    public class Jeu extends JFrame

    Modifiez galement la mthode main afin quelle ne contienne quune ligne de code :

    = new ();

    Dans notre classe Jeu, la mthode main ne contiendrait donc que la ligne :

    Jeu j = new Jeu();

    Cette ligne de code excute le constructeur de la classe. Un constructeur est similaire la mthode main, ceci prs quil est appel automatiquement lorsquon cre uneinstance de la classe (en utilisant le code ci-dessus). Par consquent, tout le codencessaire pour faire fonctionner le jeu doit se trouver dans le constructeur et non dansla mthode main.On programme un constructeur avec cette syntaxe :

    public (){

    La course du courage

    Des voitures de course que vous avez conues roulant sur une piste que vous avezdessine, avec des graphismes et des effets sonores sensationnels !

    Projet Crez lenvironnement : une piste de course virtuelle avec une interface graphique.

    Nouvelles briques JFrame, mthodes.

    JeuxVideo Livre Page 40 Mercredi, 18. juin 2008 5:41 17

  • Chapitre 2 Jeux de course 41

    // le code est ajout ici}

    Le code du constructeur de la classe Jeu commencerait donc ainsi :

    public Jeu() { }

    Dans le constructeur, il faut ajouter ces quatre lignes de code pour crer le JFrame et enindiquer le titre et la taille :

    super("voici le titre");setSize(400,400);setVisible(true);setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    Et voil : vous avez cr votre toute premire interface graphique ! Une interfacegraphique est un canevas blanc auquel vous pouvez facilement ajouter des formes, desimages, des boutons, des champs de texte ou tout ce que vous pouvez imaginer. Dansce qui suit, nous expliquerons comment inclure des ennemis menaants, des hrosaudacieux ou des aliens dgotants.

    Tapez le code suivant lextrieur du constructeur, mais lintrieur de la classe :

    public void paint(Graphics g){ super.paint(g);}

    Figure 6.1Un JFrame vide

    JeuxVideo Livre Page 41 Mercredi, 18. juin 2008 5:41 17

  • 42 Devenez un petit gnie des jeux vido

    Cette mthode permet de dessiner des formes quelconques : des rectangles, des carrs,des cercles, des arcs ou mme des lettres gantes. Pour linstant, nous allons nous int-resser deux commandes pour choisir une couleur et dessiner un rectangle.Pour choisir une couleur, on utilise le code suivant (il faut aussi ajouter une ligneimport java.awt.*) :

    g.setColor(Color.);

    est le nom dune couleur en anglais ; NetBeans affiche la liste descouleurs disponibles lorsque vous tapez "Color.". Cette liste est illustre la Figure 6.2.

    Pour dessiner un rectangle, il faut utiliser cette syntaxe :

    g.fillRect(, , , );

    , , et sont des variables de type int. Dessinez un rectangle vert comme celui de la Figure 6.3, la position 100, 100, largede 100 et haut de 200.Vous savez maintenant comment tracer une piste de course simple !Attention, il arrivera un moment o vous devrez vrifier si la voiture sort des limitesdu rectangle. Pour anticiper cela, sauvez les points dans un objet Rectangle. Celarendra les collisions plus faciles dtecter. Vous pourrez ensuite tracer le rectangle enrcuprant ses valeurs, comme ceci :

    Rectangle r1 = new Rectangle(100,100,100,200);g.fillRect(r1.x, r1.y, r1.width, r1.height);

    Figure 6.2Quelques-unes des nombreuses couleurs disponibles

    JeuxVideo Livre Page 42 Mercredi, 18. juin 2008 5:41 17

  • Chapitre 2 Jeux de course 43

    Et, pour redessiner le JFrame, il suffit dutiliser le code suivant dans votre programme :

    repaint();

    Le code public void paint... est toujours excut au dmarrage du programme.

    MthodesLes mthodes contiennent du code qui peut tre excut plusieurs fois. On utilise desmthodes pour pouvoir rpter du code plus facilement.Vous pouvez appeler (cest--dire excuter) une mthode partir du constructeur oudepuis une autre mthode, mais pas depuis la mthode main. Une mthode peut pren-dre en entre une variable (aussi appele argument) ou renvoyer une variable, nonexclusivement et non obligatoirement.Pour crer une mthode, on utilise cette syntaxe :

    public (arguments){ //code}

    doit tre remplac par void si la mthode ne renvoie pas de rsultat.Si elle retourne un lment de type int, il doit tre remplac par int. Si elle retourneun objet de type Integer, il doit tre remplac par Integer. peut treun type primitif (int, double, char, etc.) ou un objet.

    Figure 6.3Un rectangle vert dans un JFrame

    JeuxVideo Livre Page 43 Mercredi, 18. juin 2008 5:41 17

  • 44 Devenez un petit gnie des jeux vido

    est le nom de la mthode. Ce nom est votre convenance, pour autant quilcommence par une lettre.arguments reprsente les variables en entre de la mthode lorsquelle est appele. Cesarguments sont spars par des virgules. Si votre mthode prend deux arguments, unde type int et un de type double, vous devez crire ceci :

    public void exemple (int i, double d){}

    lintrieur de la mthode, i et d sont les noms de variables via lesquels les argumentssont accessibles.Pour renvoyer une valeur, utilisez ceci :

    return ;

    doit tre du type que vous avez indiqu lorsque vous avez dclar lamthode.Pour appeler une mthode, en loccurrence la mthode exemple, il faut utiliser cettesyntaxe pour passer les arguments 1 et 4.563. :

    exemple(1, 4.563)

    Si exemple renvoie une valeur de type int, vous pouvez rcuprer la valeur renvoyecomme ceci :

    int i = exemple(1, 4.563);

    Crer le jeuTracez prsent une piste de course virtuelle. Le code complet se trouve ci-aprs :

    import javax.swing.*;import javax.swing.event.*;import java.awt.*;import java.awt.event.*;//cre la classe en utilisant JFramepublic class Course extends JFrame{ //constantes contenant la taille de lcran final int LARGEUR = 900, HAUTEUR = 650; /* *Le code suivant (crant les rectangles) peut sembler compliqu * premire vue, mais cela nest d qu lutilisation de LARGEUR *et HAUTEUR pour crer les morceaux. Vous pouvez aussi utiliser *des valeurs codes en dur. */

    JeuxVideo Livre Page 44 Mercredi, 18. juin 2008 5:41 17

  • Chapitre 2 Jeux de course 45

    /*Dfinition de tous les rectangles dessiner*/ /* *Le code suivant (crant les rectangles) peut sembler compliqu premire vue, *mais cela nest d qu lutilisation de LARGEUR et HAUTEUR pour crer les *morceaux. Vous pouvez aussi utiliser des valeurs codes en dur. */ //cre les rectangles gauche, droite, en haut, en bas et au centre Rectangle gauche = new Rectangle(0,0,LARGEUR/9,HAUTEUR); Rectangle droite = new Rectangle((LARGEUR/9)*8,0,LARGEUR/9,HAUTEUR); Rectangle haut = new Rectangle(0,0,LARGEUR, HAUTEUR/9); Rectangle bas = new Rectangle(0,(HAUTEUR/9)*8,LARGEUR,HAUTEUR/9); Rectangle centre = new Rectangle((int)((LARGEUR/9)*2.5),(int) ((HAUTEUR/9)*2.5), (int)((LARGEUR/9)*5),(HAUTEUR/9)*4); //obstacles sur la route rendant la navigation plus difficile Rectangle obstacle = new Rectangle(LARGEUR/2,(int)((HAUTEUR/9)*7),LARGEUR/10,HAUTEUR/9); Rectangle obstacle2 = new Rectangle(LARGEUR/3,(int)((HAUTEUR/9)*5),LARGEUR/10,HAUTEUR/4); Rectangle obstacle3 = new Rectangle(2*(LARGEUR/3),(int)((HAUTEUR/9)*5),LARGEUR/10,HAUTEUR/4); Rectangle obstacle4 = new Rectangle(LARGEUR/3,HAUTEUR/9,LARGEUR/30,HAUTEUR/9); Rectangle obstacle5 = new Rectangle(LARGEUR/2,(int)((HAUTEUR/9)*1.5),LARGEUR/30,HAUTEUR/4); //ligne darrive pour les deux joueurs Rectangle arrivee = new Rectangle(LARGEUR/9,(HAUTEUR/2)-HAUTEUR/9, (int)((LARGEUR/9)*1.5), HAUTEUR/70); //ligne de dpart pour le joueur extrieur Rectangle ligneO = new Rectangle(LARGEUR/9,HAUTEUR/2,(int)((LARGEUR/9)*1.5)/2,HAUTEUR/140); //ligne de dpart pour le joueur intrieur Rectangle ligneI = new Rectangle(((LARGEUR/9)+((int)((LARGEUR/9)*1.5)/2)), (HAUTEUR/2)+(HAUTEUR/10), (int)((LARGEUR/9)*1.5)/2, HAUTEUR/140); //constructeur public Course() { //cre le JFrame super("La Course du courage"); setSize(LARGEUR,HAUTEUR); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setVisible(true); } //dessine les voitures et la piste public void paint(Graphics g) { super.paint(g); //dessine le fond pour la piste g.setColor(Color.DARK_GRAY); g.fillRect(0,0,LARGEUR,HAUTEUR); //la bordure des dessins est verte g.setColor(Color.GREEN); //on dessine grce aux rectangles g.fillRect(gauche.x,gauche.y,gauche.width,gauche.height);

    JeuxVideo Livre Page 45 Mercredi, 18. juin 2008 5:41 17

  • 46 Devenez un petit gnie des jeux vido

    g.fillRect(droite.x,droite.y,droite.width,droite.height); g.fillRect(haut.x,haut.y,haut.width,haut.height); g.fillRect(bas.x,bas.y,bas.width,bas.height); g.fillRect(centre.x,centre.y,centre.width,centre.height); g.fillRect(obstacle.x,obstacle.y,obstacle.width,obstacle.height); g.fillRect(obstacle2.x,obstacle2.y,obstacle2.width,obstacle2.height); g.fillRect(obstacle3.x,obstacle3.y,obstacle3.width,obstacle3.height); g.fillRect(obstacle4.x,obstacle4.y,obstacle3.width,obstacle4.height); g.fillRect(obstacle5.x,obstacle5.y,obstacle5.width,obstacle5.height); //pour les lignes de dpart on dessine en blanc g.setColor(Color.WHITE); //on dessine les lignes de dpart g.fillRect(ligneO.x,ligneO.y,ligneO.width,ligneO.height); g.fillRect(ligneI.x,ligneI.y,ligneI.width,ligneI.height); //la ligne darrive est en jaune g.setColor(Color.YELLOW); //on dessine la ligne darrive g.fillRect(arrivee.x,arrivee.y,arrivee.width,arrivee.height); } //ceci dmarre le programme en appelant le constructeur public static void main (String[] args) { new Course(); }}

    La Figure 6.4 prsente une copie dcran de la piste complte.

    Dans le prochain projet, nous donnerons vie la course du courage. Nous allons crerdeux voitures qui acclrent vers lavant. Vroum, vroum !

    Figure 6.4La piste complte

    JeuxVideo Livre Page 46 Mercredi, 18. juin 2008 5:41 17

  • Chapitre 2 Jeux de course 47

    Projet 7 : La course du courage Les voitures

    Thread et classes internesPour crer un Thread, vous devez dabord programmer une classe interne. Pour fairecela, saisissez le code suivant lintrieur dune classe, mais en dehors de toutemthode ou de tout constructeur :

    public class extends Thread{}

    peut tre remplac par un nom quelconque diffrent du nom de la classe prin-cipale.

    Dans cette nouvelle classe, il faut crer une mthode run, obligatoire pour que leprogramme puisse compiler :

    public void run(){}

    Dans cette mthode, nous allons faire avancer une des voitures. Il faut y crer uneboucle while infinie :

    while (true){}

    Dans la boucle while, ajoutez le code suivant :try{ //code}catch (Exception e){ break;}

    Projet Maintenant que vous savez comment crer une interface graphique, vous allez lveiller la vie. Grce des Thread (fils dexcution, grce auxquels plusieurs choses peuvent arriver en mme temps), vous allez faire acclrer deux voitures vers lavant.

    Nouvelles briques Thread, classes internes.

    JeuxVideo Livre Page 47 Mercredi, 18. juin 2008 5:41 17

  • 48 Devenez un petit gnie des jeux vido

    Ces quelques lignes permettent de vrifier sil y a des erreurs dans le bloc encadr partry. Si une erreur survient, lordinateur excute le code se trouvant dans le bloc encadrpar catch. Dans ce cas, on appelle break, ce qui permet de sortir de la boucle infinie.

    Les contrles faisant avancer la voiture doivent tre placs la place de //code.

    Une fois ce Thread termin, appelez-le depuis le constructeur avec la syntaxe suivante,dans laquelle Mouvement est le nom de votre classe interne :

    Mouvement m = new Mouvement();m.start();

    Crer le jeuCommencez par dessiner un Rectangle pour reprsenter la voiture (nous les personna-liserons dans le Projet 10). Puis, programmez un Thread (grce une classe interne).Ajoutez la mthode run, la boucle while et le code try.... Crez ensuite une variableglobale pour contenir la vitesse de la premire voiture.

    Dans le code try..., augmentez lentement la vitesse jusqu la vitesse finale (ici, 4).Puis, faites bouger la voiture en modifiant la valeur y de son rectangle en y ajoutant lavaleur de la vitesse de la voiture. Pour finir, rafrachissez lcran et ajoutez un dlai(grce Thread.sleep(75);).Lorsque tout ceci fonctionne, essayez dajouter la deuxime voiture.Le code complet se trouve ci-aprs :

    //on importe tout ce qui est ncessaireimport javax.swing.*;import javax.swing.event.*;import java.awt.*;import java.awt.event.*;//cre le JFramepublic class Course extends JFrame { //constantes pour la taille de lcran final int LARGEUR = 900, HAUTEUR = 650; //vitesse des deux joueurs double vitesseJ1 =.5, vitesseJ2 =.5; //rectangles reprsentant la gauche, la droite, le haut, le bas et le centre Rectangle gauche = new Rectangle(0,0,LARGEUR/9,HAUTEUR); Rectangle droite = new Rectangle((LARGEUR/9)*8,0,LARGEUR/9,HAUTEUR); Rectangle haut = new Rectangle(0,0,LARGEUR,HAUTEUR/9); Rectangle bas = new Rectangle(0,(HAUTEUR/9)*8,LARGEUR,HAUTEUR/9); Rectangle centre = new Rectangle((int)((LARGEUR/9)*2.5),(int) ((HAUTEUR/9)*2.5),(int) ((LARGEUR/9)*5), (HAUTEUR/9)*4);

    JeuxVideo Livre Page 48 Mercredi, 18. juin 2008 5:41 17

  • Chapitre 2 Jeux de course 49

    //obstacles sur le chemin rendant la navitation plus difficile Rectangle obstacle = new Rectangle(LARGEUR/2,(int)((HAUTEUR/9)*7), LARGEUR/10,HAUTEUR/9); Rectangle obstacle2 = new Rectangle(LARGEUR/3,(int)((HAUTEUR/9)*5),LARGEUR/10,HAUTEUR/4); Rectangle obstacle3 = new Rectangle(2*(LARGEUR/3),(int)((HAUTEUR/9)*5),LARGEUR/10,HAUTEUR/4); Rectangle obstacle4 = new Rectangle(LARGEUR/3,HAUTEUR/9,LARGEUR/30,HAUTEUR/9); Rectangle obstacle5 = new Rectangle(LARGEUR/2,(int) ((HAUTEUR/9)*1.5),LARGEUR /30,HAUTEUR/4);//ligne darrive pour les deux joueurs Rectangle arrivee = new Rectangle(LARGEUR/9,(HAUTEUR/2)-HAUTEUR/9, (int) ((LARGEUR/9)*1.5),HAUTEUR/70);//rectangle pour la voiture du joueur 1 Rectangle j1 = new Rectangle(LARGEUR/9,HAUTEUR/2, LARGEUR/30,LARGEUR/30);//rectangle pour la voiture du joueur 2 Rectangle j2 = new Rectangle(((LARGEUR/9)+((int)((LARGEUR/9)*1.5)/2)), (HAUTEUR/2)+ (HAUTEUR/10), LARGEUR/30,LARGEUR/30);//constructeur public Course() { //cration du JFrame super("La Course du courage"); setSize(LARGEUR,HAUTEUR); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setVisible(true); //dmarrage de la classe interne, qui a un fonctionnement indpendant //puisquil sagit dun Thread Mouvement1 m1 = new Mouvement1(); Mouvement2 m2 = new Mouvement2(); m1.start(); m2.start(); }//dessine les voitures et la piste public void paint(Graphics g) { super.paint(g); //dessine le fond de la piste g.setColor(Color.DARK_GRAY); g.fillRect(0,0,LARGEUR,HAUTEUR); //la bordure de ce quon dessine est verte g.setColor(Color.GREEN); //ligne de dpart pour le joueur 1 Rectangle ligne1 = new Rectangle(LARGEUR/9,HAUTEUR/2,(int)((LARGEUR/9)*1.5)/2,HAUTEUR/140); //ligne de dpart pour le joueur 2 Rectangle ligne2 = new Rectangle(((LARGEUR/9)+((int)((LARGEUR/9)*1.5)/2)), (HAUTEUR/2)+(HAUTEUR/10),(int)((LARGEUR/9)*1.5)/2,HAUTEUR/140); //on dessine la piste g.fillRect(gauche.x,gauche.y,gauche.width,gauche.height); g.fillRect(droite.x,droite.y,droite.width,droite.height); g.fillRect(haut.x,haut.y,haut.width,haut.height); g.fillRect(bas.x,bas.y,bas.width,bas.height);

    JeuxVideo Livre Page 49 Mercredi, 18. juin 2008 5:41 17

  • 50 Devenez un petit gnie des jeux vido

    g.fillRect(centre.x,centre.y,centre.width,centre.height); g.fillRect(obstacle.x,obstacle.y,obstacle.width,obstacle.height); g.fillRect(obstacle2.x,obstacle2.y,obstacle2.width,obstacle2.height); g.fillRect(obstacle3.x,obstacle3.y,obstacle3.width,obstacle3.height); g.fillRect(obstacle4.x,obstacle4.y,obstacle3.width,obstacle4.height); g.fillRect(obstacle5.x,obstacle5.y,obstacle5.width,obstacle5.height); //les lignes de dpart sont en blanc g.setColor(Color.WHITE); //on dessine les lignes de dpart g.fillRect(ligne1.x,ligne1.y,ligne1.width,ligne1.height); g.fillRect(ligne2.x,ligne2.y,ligne2.width,ligne2.height); //la ligne darrive est en jaune g.setColor(Color.YELLOW); //on dessine la ligne darrive g.fillRect(arrivee.x,arrivee.y,arrivee.width,arrivee.height); //le joueur 1 est dessin en bleu g.setColor(Color.BLUE); //dessin du joueur g.fill3DRect(j1.x,j1.y,j1.width,j1.height,true); //le joueur 2 est dessin en rouge g.setColor(Color.RED); //dessin du joueur g.fill3DRect(j2.x,j2.y,j2.width,j2.height,true); } private class Mouvement1 extends Thread { public void run() { //tout est dans une boucle infinie pour que le processus soit rpt while(true) { //le code est dans un bloc try pour pouvoir sortir sil y a une erreur try { //rafrachit lcran repaint(); //augmente un peu la vitesse if(vitesseJ1

  • Chapitre 2 Jeux de course 51

    //rafrachit lcran repaint(); //augmente un peu la vitesse if(vitesseJ2

  • 52 Devenez un petit gnie des jeux vido

    Figure 7.2Les voitures acclrent vers lavant

    JeuxVideo Livre Page 52 Mercredi, 18. juin 2008 5:41 17

  • Chapitre 2 Jeux de course 53

    Projet 8 : La course du courage Collisions !

    Dtection de collisionsLa dtection de collisions (dtecter si des objets se touchent, comme lillustre laFigure 8.1) est simple en Java. Comme vous avez cr tous vos graphiques avec desclasses Rectangle, dtecter des collisions est facile : la classe Rectangle fournit unemthode intersects.

    Pour vrifier une collision entre r1 et r2, on utilise cette mthode de la manire suivante :

    if(r1.intersects(r2))

    Pour grer plusieurs collisions, vous pouvez utiliser les oprateurs && (et) et || (ou)dans la condition du bloc if.

    Par exemple, pour voir si r1 est en contact avec r2 ou avec r3, on crit :

    if(r1.intersects(r2) || r1.intersects(r3))

    KeyListenerLa classe KeyListener permet de recevoir des saisies clavier venant de lutilisateur.Celles-ci peuvent par exemple servir contrler les directions des voitures. Pourutiliser un KeyListener, il faut ajouter les lments suivants la dclaration de votreclasse (ligne public class...) :

    Projet Programmez les voitures pour quelles rebondissent et ralentissent lorsquelles se percutent lune lautre ou lorsquelles percutent les murs. Transformez aussi votre clavier en volant en attribuant des touches aux voitures.

    Briques Dtection de collisions et KeyListener.

    Figure 8.1Exemple de dtection de collisions

    JeuxVideo Livre Page 53 Mercredi, 18. juin 2008 5:41 17

  • 54 Devenez un petit gnie des jeux vido

    implements KeyListener

    Cela sapplique aussi aux classes internes drives de Thread.

    Puis, dans le constructeur (ou dans la mthode run si vous utilisez des Thread), ajoutezcette ligne :

    addKeyListener(this);

    Elle indique au clavier de se "rveiller" et de commencer couter les commandes.

    Vous devez aussi ajouter trois mthodes votre code :public void keyPressed(KeyEvent e){}public void keyReleased(KeyEvent e){}public void keyTyped(KeyEvent e){}

    Ces mthodes sont appeles automatiquement lorsquune touche est tape. keyPressedest appele lorsque lutilisateur appuie sur une touche. keyReleased est appelelorsquune touche est relche. keyTyped est appele lorsquune touche est pressepuis relche. keyTyped est probablement la mthode que vous utiliserez le plus. Vouspourrez alors modifier le jeu en changeant certaines valeurs comme la direction de lavoiture en fonction de la touche.

    Pour savoir quelle touche a t tape, on utilise :

    e.getKeyChar()

    Crer le jeuCrez des variables globales de type int pour la direction de la voiture. Si leur valeurest 0, la voiture va vers le haut, si sa valeur est 1, la voiture va vers la gauche, etc. Poursimplifier, crez des constantes avec lattribut final ; par exemple une valeur de typeint nomme HAUT dont la valeur est 0. Pour savoir si la voiture va vers le haut, il suffitalors de comparer sa direction avec HAUT plutt quavec 0.

    Puis, utilisez un KeyListener pour que le joueur puisse modifier sa direction. Modifiezla direction en testant la direction actuelle de la voiture et modifiez x si la voiture vavers la gauche ou vers la droite, y si elle va vers le haut ou vers le bas.

    Vrifiez galement si le joueur est entr en collision avec un mur ou avec une autrevoiture. Si cest le cas, la vitesse du joueur doit tre ngative pour que la voiture reculeavant de pouvoir reprendre de la vitesse.

    JeuxVideo Livre Page 54 Mercredi, 18. juin 2008 5:41 17

  • Chapitre 2 Jeux de course 55

    Voici le code complet :

    //on importe tout ce quil fautimport javax.swing.*;import javax.swing.event.*;import java.awt.*;import java.awt.event.*;//cre la classe et le JFramepublic class Course extends JFrame { //constantes pour les dimensions de lcran final int LARGEUR = 900, HAUTEUR = 650; //vitesse des joueurs double vitesseJ1 =.5, vitesseJ2 =.5;//constantes reprsentant les directions final int HAUT = 0, DROITE = 1, BAS = 2, GAUCHE = 3;//garde trace de la direction du joueur (par dfaut, vers le haut) int directionJ1 = HAUT; int directionJ2 = HAUT;//cre des rectangles pour les parties gauche, droite, haute, basse et centre Rectangle gauche = new Rectangle(0,0,LARGEUR/9, HAUTEUR); Rectangle droite = new Rectangle((LARGEUR/9)*8,0,LARGEUR/9,HAUTEUR); Rectangle haut = new Rectangle(0,0,LARGEUR,HAUTEUR/9); Rectangle bas = new Rectangle(0,(HAUTEUR/9)*8,LARGEUR,HAUTEUR/9); Rectangle centre = new Rectangle((int)((LARGEUR/9) *2.5),(int)((HAUTEUR/9)*2.5), (int)((LARGEUR/9)*5),(HAUTEUR/9)*4);//obstacles pour rendre la navigation plus difficile Rectangle obstacle = new Rectangle(LARGEUR/2,(int)((HAUTEUR/9)*7), LARGEUR/10,HAUTEUR/9); Rectangle obstacle2 = new Rectangle(LARGEUR/3,(int)((HAUTEUR/9)*5), LARGEUR/10,HAUTEUR/4); Rectangle obstacle3 = new Rectangle(2*(LARGEUR/3),(int)((HAUTEUR/9)*5), LARGEUR/10,HAUTEUR/4); Rectangle obstacle4 = new Rectangle(LARGEUR/3,HAUTEUR/9,LARGEUR/30,HAUTEUR/9); Rectangle obstacle5 = new Rectangle(LARGEUR/2,(int)((HAUTEUR/9)*1.5), LARGEUR/30,HAUTEUR/4);//rectangle pour la ligne darrive pour les deux joueurs Rectangle arrivee = new Rectangle(LARGEUR/9,(HAUTEUR/2)-HAUTEUR/9, (int)((LARGEUR/9)*1.5),HAUTEUR/70);//rectangle pour la voiture du joueur 1 Rectangle j1 = new Rectangle(LARGEUR/9,HAUTEUR/2, LARGEUR/30,LARGEUR/30);//rectangle pour la voiture du joueur 2 Rectangle j2 = new Rectangle(((LARGEUR/9)+ ((int)((LARGEUR/9)*1.5)/2)), (HAUTEUR/2)+(HAUTEUR/10),LARGEUR/30,LARGEUR/30);//constructeur public Course() { //ce code cre le JFrame super("La Course du courage"); setSize(LARGEUR,HAUTEUR); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setVisible(true);

    JeuxVideo Livre Page 55 Mercredi, 18. juin 2008 5:41 17

  • 56 Devenez un petit gnie des jeux vido

    //dmarre la classe interne (qui fonctionne indpendamment puisquil sagit dun Thread) Mouvement1 m1 = new Mouvement1(); Mouvement2 m2 = new Mouvement2(); m1.start(); m2.start(); }//dessine les voitures et la piste public void paint(Graphics g) { super.paint(g); //fond de la piste g.setColor(Color.DARK_GRAY); g.fillRect(0,0,LARGEUR,HAUTEUR); //les bordures du dessin sont vertes g.setColor(Color.GREEN); //ligne de dpart pour le premier joueur Rectangle ligne1 = new Rectangle(LARGEUR/9,HAUTEUR/2,(int)((LARGEUR/9)*1.5) /2,HAUTEUR/140); //ligne de dpart pour le deuxime joueur Rectangle ligne2 = new Rectangle(((LARGEUR/9)+((int)((LARGEUR/9)*1.5)/2)), (HAUTEUR/2)+(HAUTEUR/10), (int) ((LARGEUR/9)*1.5)/2,HAUTEUR/140); //on dessine la piste g.fillRect(gauche.x,gauche.y,gauche.width,gauche.height); g.fillRect(droite.x,droite.y,droite.width,droite.height); g.fillRect(haut.x,haut.y,haut.width,haut.height); g.fillRect(bas.x,bas.y,bas.width,bas.height); g.fillRect(centre.x,centre.y,centre.width,centre.height); g.fillRect(obstacle.x,obstacle.y,obstacle.width,obstacle.height); g.fillRect(obstacle2.x,obstacle2.y,obstacle2.width,obstacle2.height); g.fillRect(obstacle3.x,obstacle3.y,obstacle3.width,obstacle3.height); g.fillRect(obstacle4.x,obstacle4.y,obstacle3.width,obstacle4.height); g.fillRect(obstacle5.x,obstacle5.y,obstacle5.width,obstacle5.height); //la ligne de dpart est en blanc g.setColor(Color.WHITE); //on dessine la ligne de dpart g.fillRect(ligne1.x,ligne1.y,ligne1.width,ligne1.height); g.fillRect(ligne2.x,ligne2.y,ligne2.width,ligne2.height); //la ligne darrive est en jaune g.setColor(Color.YELLOW); //on dessine la ligne darrive g.fillRect(arrivee.x,arrivee.y,arrivee.width,arrivee.height); //le joueur 1 est en bleu g.setColor(Color.BLUE); //dessin du joueur g.fill3DRect(j1.x,j1.y,j1.width,j1.height,true); //le joueur 2 est en rouge g.setColor(Color.RED); //dessin du joueur g.fill3DRect(j2.x,j2.y,j2.width,j2.height,true); }

    JeuxVideo Livre Page 56 Mercredi, 18. juin 2008 5:41 17

  • Chapitre 2 Jeux de course 57

    private class Mouvement1 extends Thread implements KeyListener { public void run() { //active le KeyListener addKeyListener(this); //boucle infinie pour pouvoir rpter le processus while(true) { //le code est encapsul dans un bloc try pour larrter en cas derreur try { //rafrachit lcran repaint(); //si la voiture tape dans un mur extrieur, sa vitesse passe -4 if(j1.intersects(gauche) || j1.intersects(droite) || j1.intersects(haut) || j1.intersects(bas) || j1.intersects(obstacle) || j1.intersects(obstacle2)|| j1.intersects(j2) || j1.intersects(obstacle3) || j1.intersects(obstacle4) || j1.intersects(obstacle5)) { vitesseJ1 = -4; } //si la voiture tape dans le centre, sa vitesse passe -2.5 if(j1.intersects(centre)) { vitesseJ1 = -2.5; } //augmentation de la vitesse if(vitesseJ1

  • 58 Devenez un petit gnie des jeux vido

    //ncessaire pour le KeyListener public void keyReleased(KeyEvent event) { } //ncessaire pour le KeyListener public void keyTyped(KeyEvent event) { if(event.getKeyChar()==q) { directionJ1 = GAUCHE; } if(event.getKeyChar()==s) { directionJ1 = BAS; } if(event.getKeyChar()==d) { directionJ1 = DROITE; } if(event.getKeyChar()==z) { directionJ1 = HAUT; } } } private class Mouvement2 extends Thread implements KeyListener { public void run() { //active le KeyListener addKeyListener(this); //boucle infinie pour pouvoir rpter le processus while(true) { //le code est encapsul dans un bloc try pour larrter en cas derreur try { //rafrachit lcran repaint(); //si la voiture tape dans un mur extrieur, sa vitesse passe -4 if(j2.intersects(gauche) || j2.intersects(droite) || j2.intersects(haut) || j2.intersects(bas) || j2.intersects(obstacle) || j2.intersects(obstacle2) || j1.intersects(j2)) { vitesseJ2 = -4; } //si la voiture tape dans le centre, sa vitesse passe -2.5 if(j2.intersects(centre)) { vitesseJ2 = -2.5; } //augmentation de la vitesse if(vitesseJ2

  • Chapitre 2 Jeux de course 59

    if(directionJ2==BAS) { j2.y+=(int)vitesseJ2; } if(directionJ2==GAUCHE) { j2.x-=(int)vitesseJ2; } if(directionJ2==DROITE) { j2.x+=(int)vitesseJ2; } //diminue le taux de rafrachissement Thread.sleep(75); } catch(Exception e) { //sil y a une exception (une erreur) on sort de la boucle break; } } } //ncessaire pour le KeyListener public void keyPressed(KeyEvent event) { } //ncessaire pour le KeyListener public void keyReleased(KeyEvent event) { } //ncessaire pour le KeyListener public void keyTyped(KeyEvent event) { if(event.getKeyChar()== j) { directionJ2 = GAUCHE; } if(event.getKeyChar()==k) { directionJ2 = BAS; } if(event.getKeyChar()==l) { directionJ2 = DROITE; } if(event.getKeyChar()==i) { directionJ2 = HAUT; } } } //dmarre le programme en appelant le constructeur public static void main(String[] args) { new Course(); }}

    La Figure 8.2 illustre les vhicules sur la piste.

    JeuxVideo Livre Page 59 Mercredi, 18. juin 2008 5:41 17

  • 60 Devenez un petit gnie des jeux vido

    Figure 8.2Les voitures tournent et se promnent sur la piste

    JeuxVideo Livre Page 60 Mercredi, 18. juin 2008 5:41 17

  • Chapitre 2 Jeux de course 61

    Projet 9 : La course du courage Personnalisation

    ImagesEnvie davoir des images dans votre jeu ? Ce nest pas difficile. Vous pouvez transfor-mer votre voiture de course en vaisseau spatial, en bateau, en avion, en gupard ou entracteur... Laissez libre cours votre imagination !Vous devez dabord dessiner une image ou en trouver une sur Internet. Une fois votremoyen de transport choisi, sauvegardez-le dans le rpertoire dans lequel se trouve lefichier .class compil (habituellement, /build/classes/). Les Figures 9.1 9.3 illustrent quelques possibilits de dcor pourvotre jeu.

    Projet Ajoutez des modifications au jeu : ajoutez-y des images et des sons. Ajoutez un cran de bienvenue. Ajoutez un compteur de tours indiquant le gagnant aprs trois tours de piste.

    Briques Images, sons.

    Figure 9.1Voiture de course

    Figure 9.2Bateau

    JeuxVideo Livre Page 61 Mercredi, 18. juin 2008 5:41 17

  • 62 Devenez un petit gnie des jeux vido

    Ajoutez ces lignes avant de dessiner limage :Image img = null;try{ URL url = this.getClass().getResource("nom"); img = Toolkit.getDefaultToolkit().getImage(url);}catch(Exception e){}

    nom doit tre remplac par le nom de limage utiliser (y compris son extension).Ensuite, remplacez le code qui dessine les rectangles par cette ligne :

    g.drawImage(img, x, y, this)

    o x et y sont les x et y du rectangle. De plus, il faut importer, en dbut de fichier,java.io.* et java.net.*.

    Toutes les images utilises dans les jeux de cet ouvrage sont disponibles dans le rper-toire Projets, sur le site web de Pearson, www.pearson.fr, la page ddie cet ouvrage.

    SonsPour ajouter rapidement des effets sonores vos jeux, utilisez ces lignes :

    URL moteur = this.getClass().getResource("moteur.wav");AudioClip son = JApplet.newAudioClip(moteur);son.loop();

    moteur.wav est le nom du fichier son.snd.loop() joue le son en boucle. Si vous prfrez ne le jouer quune fois, vous pouvezremplacer cette ligne par :

    snd.play();

    Noubliez pas dimporter java.applet.AudioClip.Tous les sons utiliss dans les jeux de cet ouvrage sont disponibles dans le rpertoirede Projets, sur le site web de Pearson, www.pearson.fr, la page ddie cet ouvrage.

    Figure 9.3Avion

    JeuxVideo Livre Page 62 Mercredi, 18. juin 2008 5:41 17

  • Chapitre 2 Jeux de course 63

    Crer le jeuAjoutez un cran de bienvenue grce JOptionPane. Vous pouvez aussi programmer ledcompte du nombre de tours en comptant les collisions avec la ligne darrive.Remplacez les voitures rectangulaires par des images. Noubliez pas dorienter lesimages dans le sens dans lequel le vhicule se dplace (lorsquil va vers la droite,limage devrait pointer vers la droite).Voici le code complet :

    //on importe ce quil faut:import javax.swing.*;import javax.swing.event.*;import java.awt.*;import java.awt.event.*;import java.io.*;import java.net.*;import java.applet.AudioClip;//cre une nouvelle classe et le JFramepublic class Course extends JFrame { //variables pour les images URL url1 = null, url2 = null, url3 = null, url4 = null, url5 = null, url6 = null, url7 = null, url8 = null, urlT = null; Image img1,img2,img3,img4, img5,img6,img7,img8, titre; //constante pour la taille de lcran final int LARGEUR = 900, HAUTEUR = 650; //a la valeur true si quelquun a gagn boolean gagnantOK = false; //vitesse des joueurs double vitesseJ1 =.5, vitesseJ2 =.5; //nombre de tous des joueurs int toursJ1 = 0, toursJ2 = 0; //constantes pour les directions final int HAUT = 0, DROITE = 1, BAS = 2, GAUCHE = 3; //directions des joueurs (par dfaut vers le haut) int directionJ1 = HAUT; int directionJ2 = HAUT; //cre des rectangles pour les parties haute, basse, gauche, droite et centre de lcran Rectangle gauche = new Rectangle(0,0,LARGEUR/9,HAUTEUR); Rectangle droite = new Rectangle((LARGEUR/9)*8,0,LARGEUR/9,HAUTEUR); Rectangle haut = new Rectangle(0,0,LARGEUR,HAUTEUR/9); Rectangle bas = new Rectangle(0,(HAUTEUR/9)*8,LARGEUR,HAUTEUR/9); Rectangle centre = new Rectangle((int)((LARGEUR/9)*2.5), (int)((HAUTEUR/9)*2.5), (int)((LARGEUR/9)*5),(HAUTEUR/9)*4); //obstacles pour rendr