Dans ce mini tuto, le but va être de faire un petit algorithme pour préparer la création d'un jeu bien connu : Le jeu des trois cartes.
Le but ici n'est pas de vous montrer comment faire le jeu ou de vous donner un jeu dans son intégralité, mais de vous montrer comment gérer un aspect particulier de ce jeu.
Bon, déjà qu'est ce que le jeu des trois cartes ? Il s'agit d'un jeu simple de hasard. Trois cartes se présentent à vous face cachée. Le but sera de trouver parmi les trois cartes où est la Dame de Coeur. Un jeu archi connu, mais qui présente un aspect intéressant concernant la programmation de tirage de carte.
Nous allons nous pencher ici sur le tirage aléatoire des cartes. On pourrait utiliser ici 32 cartes et demander au programme de tirer trois carte et de faire deviner au joueur où est une des trois cartes.
Pour simplifier nous allons partir du principe que nous aurons toujours les trois même cartes. Vous pourrez alors vous concentrer sur l'aspect "tirage aléatoire" du jeu. Comme je l'ai dit au départ, le but n'est pas de vous montrer comment faire le jeu, mais de vous expliquer un algorithme possible pour le tirage des cartes.
Donc Nous avons trois cartes différentes. Que doit il se passer :
1°) l'ordinateur devra mélanger les cartes
2°) Il devra choisir la première, puis la seconde et la troisième en faisant attention de ne pas mettre de doublon. (bah oui, le but est d'avoir à chaque tirage trois cartes différentes, mêmes si au départ on a trois cartes différentes dans le jeu, quand l'ordinateur va faire le tirage, il faut qu'il comprenne qu'il ne doit pas tirer une carte déjà tirée auparavant).
C sur cet aspect que nous allons travailler. Comment faire comprendre à l'ordinateur qu'il a trois cartes différentes, et qu'il doit obligatoirement tirer chaque carte dans un ordre différent à chaque fois et surtout sans doublon.
Pour cela, nous allons utiliser trois tableaux. Attention, ce code n'est peut être pas le plus optimisé mais il permettra à quelques un de comprendre comment ca marche.
Commençons le tutorial tout de suite.
1°) Créer un nouveau fichier Source Purebasic vide. Et commencez par mettre ceci au début du code :
Code : Tout sélectionner
;Initialisation des composants
InitSprite()
InitKeyboard()
InitMouse()
InitSound()
UsePNGImageDecoder()
UsePNGImageDecoder() nous permet d'utiliser des images au format PNG.
Continuons, nous allons maintenant déclarer les constantes et variables dont nous aurons besoin. Ajoutez ceci au code :
Code : Tout sélectionner
;Initialisation des constantes
;Variables Globales
Global MaFenetre ;Fenêtre principale
;Constantes
#Obj1 = 2
#Obj2 = 3
#Obj3 = 4
Créons notre fenêtre principale :
Code : Tout sélectionner
;Création de la fenêtre principale
SetRefreshRate(60)
MaFenetre = OpenScreen(800,600,32,"Test")
If MaFenetre = 0
MessageRequester("Erreur", "Impossible d'ouvrir une fenêtre DirectX", #PB_MessageRequester_Ok)
EndIf
Rentrons maintenant dans le vif du sujet. Nous voulons faire notre petit jeu des trois cartes. Pour simplifier un peu plus, et pour se concentrer uniquement sur le code et pas les graphismes, j'ai utiliser trois images qui représente chacune un carré bleu, un carré rouge, et un carré vert. Ces carrés représenteront nos cartes et nous permettront de bien comprendre.
Vous pouvez créer ces graphismes primaires avec n'mporte quel logiciel de dessin. Utilisez le format PNG dans notre exemple.
Parfait, nous avons nos trois images, nous allons maintenant les initialiser par le programme, et les charger :
Code : Tout sélectionner
;Initialisation des images
LoadSprite(#Obj1,"rouge.png")
LoadSprite(#Obj2,"bleu.png")
LoadSprite(#Obj3,"vert.png")
Et c'est là que nous commençons à coder notre petit algorithme de tirage au sort des trois cartes. Ajoutez ceci :
Code : Tout sélectionner
;Tableau des cartes
Dim Objets(2)
Objets(0) = #Obj1
Objets(1) = #Obj2
Objets(2) = #Obj3
Ajoutez maintenant :
Code : Tout sélectionner
Dim Obj_Etat(2)
For x = 0 To 2
Obj_Etat(x) = 0
Next x
Voici maintenant la plus importante partie du programme, ajoutez ceci :
Code : Tout sélectionner
Dim Obj_Al(2)
For x = 0 To 2
Repeat
a = Random(2)
Until Obj_Etat(a) = 0
Obj_Al(x) = Objets(a)
Obj_Etat(a) = 1
Next x
La boucle FOR NEXT s'occupe maintenant de la partie aléatoire du jeu.
Nous initialisons la boucle avec X allant de 0 à 2 (pour les trois cases). Tout de suite après suis une autre boucle Repeat Until avec l'instruction Random. En fait le programme va tirer un nombre au hasard allant de 0 à 2. Ensuite il test si la valeur qu'il a pris au hasard n'est pas déjà prise dans le tableau Etat. Si c'est le cas il tire à nouveau un nombre au hasard. Sinon il passe à la suite des instructions.
Ex : Admettons que notre programme tire le nombre 1. Il va regardé dans le tableau Obj_Etat case 1 quelle est la valeur. Si la valeur est égale à 0 il continue ca veut dire que le numero n'a pas été tiré, sinon il recommence un tirage.
Donc si la carte (ou le numéro dans le code) n'a pas été tiré il continue. A ce moment là il attribue à la première case du tableau Obj_Al la carte qu'il a tiré grâce à Obj_Al(x) = Objets(a) en clair au premier tour de boucle FOR NEXT x sera égal à 0 donc ca sera notre première case du tableau Obj_Al ensuite Il prend la carte tiré dans le tableau Objets que vous avons défini au départ. Par ex si il tire le numéro 1, nous avons dit en début de programme que la case 1 (et donc la seconde) c'était #obj2 soit notre carré bleu.
Le programme va faire ceci jusqu'à qu'il est rempli le tableau Obj_Al et évidemment les trois cartes seront tirées grâce à ce procédé de manière aléatoire et sans doublon.
Il ne nous reste plus qu'à afficher le résultat du tirage, mais là rien de bien difficile : Ajoutez d'un coup :
Code : Tout sélectionner
posx = O
For x = 0 To 2
DisplaySprite(Obj_Al(x),posx,10)
posx = posx + 100
Next x
FlipBuffers()
Repeat
ExamineKeyboard()
Until KeyboardPushed(#PB_Key_Escape)
On rafraichit avec Flipbuffer() et enfin une petite boucle REPEAT UNTIL pour que le programme tourne indéfiniement jusqu'à qu'on appuie sur ECHAP.
Pour bien voir que ca marche lancez le programme plusieurs fois, vous verrez que l'ordre du tirage est toujours différent !
Voilà pour ce petit tut, si il y a des choses pas claires, je me tiens à votre disposition.