N.F.I. 3ième année |
Objets graphiques Matlab |
octobre 2004 |
Rêgle du jeu
Première version
Au centre un cercle, sur un coté une barre; quand on clique sur
la barre, elle se déplace vers le centre d'une distance aléatoire; si elle
touche le cercle, la partie est terminée. Le but est de rapprocher le plus
possible la barre du cercle, sans qu'elle le coupe.
Le joueur perd si la barre coupe le cercle.
Sur chaque coup, le gain du joueur augmente si elle ne le coupe pas;
dans le cas contraire la partie s'arrête et le gain est nul.
Pour appâter le joueur, le gain augmente d'autant plus que la barre est
proche du cercle, et on peut même envisager que, sur un coup, la barre
s'éloigne du cercle
Deuxième version
Toujours un cercle au centre, mais on place quatre barres tout
autour de lui; le but est d'enserrer le cercle au plus proche sans le
couper. Deux joueurs choisissent, alternativement, une barre à
rapprocher du cercle.
|
|
|
Programmation
Première version
On place le centre du cercle à l'origine O du repère; on note
A B les extrémités du segment représentant la barre et
I son milieu.
On peut prendre:
- le rayon du cercle égal à 12.5
- les longueurs OI et IA égales toutes les deux à 50
- un déplacement de la barre d'une distance pseudo aléatoire
entre 0 et 14
|
|
Remarques: 1. le segment OI est sur l'axe des
abscisses, et la barre se déplace parallèlement à cet axe
2. la barre touche le cercle <==> distance
OI inférieure au rayon du cercle.
Ecrire la fonction initjeu qui trace le cercle,
la barre (objet line), puis:
- 1. place sur l'attribut 'ButtonDownFcn' de
cet objet, l'appel à la fonction deplaceBarre
- 2. mémorise sur l'attribut 'UserData' de cet
objet l'état de
la partie :
- le gain du joueur
- le rayon du cercle
- éventuellement: un booléen indiquant que la partie n'est pas finie
- la valeur 14 servant au déplacement aléatoire de la
barre et la direction de déplacement
Ecrire ensuite la fonction deplaceBarre qui
récupère l'identité de la barre et les informations attachées
(attribut 'UserData'),
pour déplacer la barre d'une distance aléatoire, tester si elle coupe le
cercle, afficher éventuellement le nouveau gain du joueur. et mémoriser le
nouvel état de la partie.
Pour la deuxième version, on prendra quatre barres situées à gauche,
à droite, au dessus et en dessous du cercle. La fonction
deplaceBarre change peu, mais il faut
remarquer que le gain du joueur, qui ne dépend pas d'une des barres, doit
rester; on peut donc le mémoriser sur l'attribut
'UserData du graphe. Par contre la direction
de déplacement, dépendant de la barre, doit être mémorisée sur son attribut
'UserData'.
Jeu sur plusieurs parties
On précise maintenant, que deux joueurs, disons J1 et
J2, interviennent, qu'on dispose de quatre barres, et que le jeu se déroule sur cinq parties. Pendant chaque
partie une cagnotte, qui représente le gain potentiel de chaque joueur,
augmente à chaque coup, si la barre ne coupe pas le cercle.
Examinons les possibilités quand c'est au tour de J1 de jouer:
- il joue, la barre se rapproche et ne coupe pas le cercle; alors la
cagnotte augmente, et c'est à J2 de jouer;
- il joue et la barre coupe le cercle; alors l'autre joueur
J2 gagne 80% de la cagnotte, J1 gagne 20% de la cagnotte et
la partie se termine;
- il abandonne; alors la partie se termine, avec 5O% de la cagnotte pour
J2, et le reste de la cagnotte reporté sur la partie suivante ou
perdu si la cinquième partie se termine.
Compléter la programmation précédente en créant une interface pour les
joueurs, qui comprend:
- •
un bouton permettant de rejouer;
- •
une zone permettant de saisir le nom de chaque joueur en début de jeu;
- •
un bouton permettant à un joueur d'abandonner une partie, et d'en commencer
une nouvelle;
- •
deux listes affichant respectivement pour chaque joueur: le gain par partie
déjà jouée, ainsi que son gain total.
Indication: pendant une partie, il faut connaître:
- • les barres
- • le rayon du cercle
- • le déplacement maximum de la barre
- • le numéro de la partie en cours
- • qui doit jouer (1 ou 2)
- • l'état de la cagnotte
- • les gains aux parties précédentes