Après mon topic expliquant comment procéder pas à pas pour le plus ou moins: Dispo ici, je me suis dis que de vous expliquer un autre petit jeu pouvez être amusant autant pour moi que pour vous
A qui s'adresse ce tp ?
-> Aux personnes qui ont finis le tp du plus ou moins et ayant vu les fonctions
-> Aux personnes ayant vu les chaines de caractère ou plus.
Note: Si vous en êtes à la SDL, passez votre chemin ça va être trop simple pour vous
Note2: dans mon code j'utilise les chaines de caractères si vous n'avez pas vu cela ce n'est pas grave je donnerais une alternative très simple
Un problème ?
Si vous rencontrez un problème il faut à tout prix regarder ce que votre compilateur vous dit !
Mon compilateur ne trouve pas d'erreur et mon code plante !
Votre compilateur n'est pas convenablement réglé, on va donc le régler maintenant
Dans Code::Blocks:
Settings -> Compiler -> (onglet) compiler -> (onglet) other options -> (coller ceci) -Wall -Wextra -O2 -Wwrite-strings -Wstrict-prototypes -> OK -> CTRL F11
Et voyez enfin ce que votre compilateur vous repproche
En avant !
Cahier des charges:
DEBUT
DEMANDE à l'utilisateur de choisir entre les 3
CALCULE un choix pour l'ordinateur
AFFICHE (chaine ou condition pour ceux qui n'ont pas vu les chaines) ce que l'ordinateur et l'utilisateur ont choisis
AFFICHE qui a gagné (via une fonction
DEMANDE si l'utilisateur veut refaire une partie
FIN
Je vous conseille de coder par vous-mêmes puis de revenir voir la solution si ça bloque.
Vous aurez besoin de time.h pour le choix de l'ordi.
It's Showtime !
Un bon départ
On va partir de ce code-ci:
int main(void)
{
int choix = 0, choixCOM = 0, continuer = 1;
const char *elements[] = {"pierre", "papier", "ciseaux"};
// tableau de chaine, si vous n'avez pas vu les chaines passez ce bout de code
srand(time(NULL));
choixCOM = (rand() % (2 - 0 + 1)) + 0;
printf("Programme: (jeux) Pierre, papier, ciseaux.\n\n");
printf("0. Pierre\n1. Papier\n2. Ciseaux\n");
return 0;
}
attardons nous sur ça :
choixCOM = (rand() % (2 - 0 + 1)) + 0;
Vous l'avez sûrement utilisé avec le jeu du plus ou moins sous la forme d'un Max et d'un Min, ici on en a pas besoin on peut écrire directement la valeur dedans car elle ne changera pas. On part donc de 0 pour aller à 2 (soit 3 possibilités):
0. Pierre
1. Papier
2. Ciseaux
On y va
Ensuite nous allons demander à l'utilisateur son choix (pas trop dur ):
scanf("%d", &choix);
Or si le gros balour n'a pas compris que c'était entre 0 et 2 inclus et qu'il vous sort un -3 ou 7 bah tout plante, comment évitez cela? Utilisez Anti-Kévin v.1.14.1 comme ceci
do {
printf("Votre choix: ");
scanf("%d", &choix);
} while (choix < 0 && choix > 2);
Maintenant qu'on un noob qui sait ce qu'il note il ne reste plus qu'à afficher ce qu'il a choisi et celui de l'ordi:
printf("vous avez choisi: %s et l'ordinateur: %s\n",elements[choix], elements[choixCOM]);
Pour les personnes n'ayant pas vu les chaines vous devez procéder ainsi: condition (si choix == ...) alors.. Oui c'est long mais il faut faire comme ça pour toutes les solutions ;p
Maintenant c'est bien beau mais faut dire qui a gagné et qui a perdu !
La fonction gagne
Soyons logique pour cette fonction. Ce qu'on va faire: une fonction qui renvoi un entier et on utilise cette entier pour définir si oui on non l'utilisateur a gagné.
Ce qui donne:
FONCTION qui renvoi 0 si égalité, 1 si perdu et 2 si gagné
La fonction sera une suite de condition
On l'utilise dans un switch
Pour l'égalité c'est simple !
Si choix = choixCom alors renvoi 0
Ensuite vous pouvez choisir de faire perdu avec les 3 possibilités (utilisez les opérateurs && et || )
Puis pour le dernier pas besoin d'un else if, fait un else car il y a pas d'autre solution
CODEZ !
Voici ma fonction (par soucis de place j'ai utilisé des noms de variables super cours !) Secret (cliquez pour afficher)
int gagne(int j, int c)
{
if (j == c)
return 0;
else if ((j == 0 && c == 1) || (j == 1 && c == 2) || (j == 2 && c == 0))
return 1;
else
return 2;
}
switch(gagne(choix,choixCOM))
{
case 0:
printf("Egalite\n\n");
break;
case 1:
printf("Perdu!\n\n");
break;
case 2:
printf("Gagne!\n\n");
break;
}
Et voilà !
J'ai tout de suite lancé la fonction dans le switch, c'est peut-être nouveau pour vous c'est pour ça que je préfère le préciser ! vous auriez pu faire ainsi aussi:
int resultat = gagne(choix, choixCom);
switch (resultat)
{
mais c'est plus long et inutile
On a fait le plus gros !
Il ne reste plus qu'une condition boléenne qui demande si le joueur veut recommencer ou pas et ajoutez diverses choses inutiles genre:
avec tout un tas de décoration abusive si cela vous chante
Pour ma part ma version me suffit emplement:
Code en entier commenté
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int gagne(int j, int c)
{
if (j == c)
return 0;
else if ((j == 0 && c == 1) || (j == 1 && c == 2) || (j == 2 && c == 0))
/* littéralement:
sinon si joueur prend pierre ET computer prend papier
OU si joueur prend papier ET computer prend ciseaux
OU si joueur prend ciseaux ET computer prend pierre
alors on renvoi 1 = perdu
*/
return 1;
else
/*
si pas égalité et pas perdu alors c'est gagné
(pas besoin de faire des conditions unitiles: y a pas d'autre choix)
*/
return 2;
}
int main(void)
{
int choix = 0, choixCOM = 0, continuer = 1;
const char *elements[] = {"pierre", "papier", "ciseaux"};
// tableaux de chaines (ou tableau à 2 dimensions)
srand(time(NULL));
while(continuer)
{
choixCOM = (rand() % (2 - 0 + 1)) + 0;
// on le place dans la boucle pour pas avoir le même chiffre dans une autre partie
system("cls");
// efface l'écran (SEULEMENT sous windows)
printf("Programme: (jeux) Pierre, papier, ciseaux.\n\n");
printf("0. Pierre\n1. Papier\n2. Ciseaux\n");
do {
printf("Votre choix: ");
scanf("%d", &choix);
} while (choix < 0 && choix > 2);
// sécurise le scanf
printf("\n\n");
printf("vous avez choisi: %s et l'ordinateur: %s\n",elements[choix], elements[choixCOM]);
// affiche les choix
switch(gagne(choix,choixCOM))
{ // prend ce que renvoi la fonction 0, 1 ou 2
case 0:
printf("Egalite\n\n");
break;
case 1:
printf("Perdu!\n\n");
break;
case 2:
printf("Gagne!\n\n");
break;
}
printf("Une nouvelle partie?\n0. Non\n1. Oui!");
scanf("%d", &continuer);
}
return 0;
}
(solution pour ceux ayant vu les chaines)
Citation : Pas de titre
Project : Console application
Compiler : GNU GCC Compiler (called directly)
Directory : C:\Documents and Settings\Mwa\Mes documents\Jules Butes\CC++\Exercices\pierre papier ciseaux\
--------------------------------------------------------------------------------
Switching to target: default
Compiling: main.c
Linking console executable: C:\Documents and Settings\Mwa\Mes documents\Jules Butes\CC++\Exercices\pierre papier ciseaux\console.exe
Process terminated with status 0 (0 minutes, 0 seconds)
0 errors, 0 warnings
tadaaaaaaaaaaaaaaaaa
C'était pas dur avouez !
Améliorations !
On en a pas fini
* Un mode 2 joueurs ? Soyons fou !
* Faire une IA de salop Si le joueur rentre ciseaux alors l'ordinateur ne pourra rentrer que: ciseaux ou pierre, en gros égalité ou perdu pour l'utilisateur
FIN
C'est fini ! N'hésitez pas à me donner vos avis, commentaires, etc c'est ce qui m'a donné l'envi de faire ce topic Et aussi en voyant que mon autre topic d'aide avait atteint 700 visites
Il n'est pas dit que ce topic ne soit pas édité.
Quand j'appuie sur 1 pour recommancer, l'ordi chosie toujours la même chose ...
aussi ton compilo n'est pas bien réglé, à la lign srand il devrait y avoir un warning
warning C4244: 'argument' : conversion de 'time_t' en 'unsigned int', perte possible de données
Pour y remedier :
srand((unsigned)time(NULL));
Pour le system("cls"):, tu aurais put faire un ifdef plus haut
enfin erreur très fréquente met le rand dans la boucle principale !
Edité merci par contre je préfère garder le code de matéo pour le chiffre aléatoire pour pas destabiliser les débutants et aussi car je ne vois pas ce que ça change (je ne comprends pas ta modif en gros).
Aussi pour ceux qui ont vu le préprocesseur, tu peut mettre des ifdef pour savoire si ils sont sur linux/windows et pour le srand le warning est explicite,
Sinon bon exercice, bel initative, c'est vrai que ça peut faire un bon tp d'entrainement après le plus ou moins
Ca me semblait être la meilleure solution, peux-tu me proposer la tienne et m'expliquer la réelle différence?
Sinon pour les conditions des préprocesseurs je vais l'ajouter aux améliorations
Et merci pour ton merci ( ), j'ai pensé que c'était un bon exercice surtout au niveau de la fonction (condition comme dans un jeu plus évolué).
Citation : FeNiX57
Je vais mis mettre de suite, un exercice en plus ne peut jamais faire de mal!
Dsl, je n'utilise pas gcc, j'utilise visual avec warning niveaux 4 ( très serrés )
Sinon je crois bien que tu as des optimisations (-O2), je sais plus ou mais j'ai vu que c'est déconseillé. (Incompatible avec le debugger mais dîte moi si je me plante).
Aller trouve nous un autre jeu a réaliser, un bien dure cette fois
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
× Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.