Vous êtes ici : Logram >> Forum >> Langage C >> Petit pépin

Petit pépin

Précédant 1 2 3 Suivant
Auteur Message
le testeur # Posté le 01/10/2008 à 17:36
Rien d'impossible
avatar
Salut

Je suis en ce moment en train de coder un tout petit jeu en tour par tour, le but est simple : le joueur choisi entre 3 option (attaque, technique, objet) et suivant le choix bah sa fait ce qu'il faut faire :p
Enfin bref, le jeu se nomme "Total Guerre" (cherchez pas de signification, sa m'a pris 2 seconde à prendre ce titre) comme ces un jeu en cour de devellopement, sa sert a rien un bon titre ^^

Il est en console !

Le problème :


Je suis en train de faire l'IA de l'ennemie de l'attaque.
J'explique vite fait, l'ordinateur choisi un nombre au hasard et suivant le nombre (entre 1 et 3) il fait l'action désigné : 1 = Attaque, 2 = technique, 3 = objet !
Ce générateur de nombre aléatoire je l'ai aps encore mis :)

Alors voila :
J'ai créer ces variables :
Code : c
  1.  
  2.     long PVennemi = 100;
  3.     long PVjoueur = 110;
  4.     long Attjoueur = 15;
  5.  

Ce que je voudrais faire :
Code : c
  1.  
  2. // Le joueur a choisi d'attaquer :
  3. PVennemi = PVennemi - Attjoueur;
  4. // Logiquement sa devrait marcher ... et faire :
  5. printf("%ld", PVennemi);
  6. // et donc afficher 100 - 15 = 85
  7.  

Ben figuré vous que sa, sa marche ! C'est ensuite que viens le problème :

Le tour est finie, aucun des perso n'est mort, on fait donc une boucle pour ré-afficher le menu des choix !


Et sa la ou sa coince !!
En effet, quand on revient grâce à la boucle, bah on revient au variables initial qui sont
Code : c
  1.  
  2.     long PVennemi = 100;
  3.     long PVjoueur = 110;
  4.     long Attjoueur = 15;
  5.  

Donc le code se répète indéfiniment !

Que faire ?


-Des pointeurs ?
-Mettre les variables en CONSTANTE ?
-Placer les variables dans une autre fonction, en créer une spécialement pour eux ?

Voila le code source de la page "ChoixAttaque.c"
Code : c
  1.  
  2.  
  3. //Programme par "le testeur"
  4. //Créer le 13/09/08
  5. //Page ChoixAttaque du jeu
  6.  
  7. #include <stdio.h>
  8. #include <stdlib.h>
  9. #include "menu2.h"
  10. #define SAUTER5LIGNE printf("\n\n\n\n\n"); // Sauter 5 lignes
  11. #define SAUTERLIGNE printf("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n"); //Sauter 14 lignes
  12. #define VALIDER printf("\n                                      "); \
  13.                    system("PAUSE"); \
  14.                    printf("\n");                // Bouton "ok" du joueur !
  15. #define TAILLE_MAX 1000 // Taille maximal des données
  16.  
  17.  
  18. int ChoixAttaque()
  19. {
  20.     long PVennemi = 100;
  21.     long PVjoueur = 110;
  22.     long Attjoueur = 15; // system aléatoire !
  23.  
  24.     printf("\n\n Vous attaquez l'ennemi.\n");
  25.     VALIDER;
  26.     printf("Vous causez %ld degats a l'ennemi.\n", Attjoueur);
  27.     PVennemi = PVennemi - Attjoueur;
  28.     if (PVennemi <= 0)
  29.         VictoireCombat();
  30.     else
  31.     {
  32.     printf("Il reste %ld Pv a votre ennemi !\n", PVennemi);
  33.     VALIDER;
  34.     IAennemi();
  35.     if (PVjoueur <= 0)
  36.         DefaiteCombat();
  37.     else
  38.     {
  39.     printf("Il vous reste %ld PV !\n", PVjoueur);
  40.     MenuCombat();
  41.     }
  42.     }
  43.     return 0;
  44. }
  45.  
  46. void VictoireCombat()
  47. {
  48.     printf("Vous avez vaincu votre adversaire, il s'ecroule devant vous, sans vie !\n");
  49. }
  50.  
  51. void DefaiteCombat()
  52. {
  53.     printf("L'ennemie vient de vous tirer dans le coeur, vous etes mort !\n");
  54. }
  55.  
  56. int IAennemi()
  57. {
  58.     long ObjetPotion = 50;
  59.     long PVennemi = 100;
  60.     long PVjoueur = 110;
  61.     long Attennemi = 15; // system aléatoire !
  62.     long ChoixEnnemi = 1; // system aléatoire !
  63.     long ChoixEnnemiTechnique = 0; // system aléatoire !
  64.  
  65.     // généré nombre aléatoire !
  66.     switch (ChoixEnnemi)
  67.     {
  68.         case 1: // 1 correspond à Attaque
  69.         {
  70.             printf("L'ennemi vous attaque !\n");
  71.             printf("Il vous cause %ld degats !\n", Attennemi);
  72.             PVjoueur = PVjoueur - Attennemi;
  73.         }
  74.         break;
  75.         case 2: // 2 correspond à Technique
  76.         {
  77.             printf("L'ennemie utilise une technique !\n");
  78.             switch (ChoixEnnemiTechnique)
  79.             {
  80.                 case 1: // Technique 1
  81.                 {
  82.                     printf("Technique n°1 : Grenade aveuglante !");
  83.                     printf("Il vous cause 50 de degats !\n");
  84.                     PVjoueur = PVjoueur - 50;
  85.                     VALIDER;
  86.                 }
  87.                 break;
  88.                 case 2: // Technique 2
  89.                 {
  90.                     printf("Technique n°2 : Grenade de niveau 2 !\n");
  91.                     printf("Il vous cause 70 de degats !\n");
  92.                     PVjoueur = PVjoueur - 70;
  93.                     VALIDER;
  94.                 }
  95.                 break;
  96.                 default:
  97.                     printf("L'ennemi ne fait rien !\n");
  98.                 break;
  99.             }
  100.         }
  101.         case 3:
  102.         {
  103.             printf("L'ennemi utilise un objet !\n");
  104.             printf("Il utilise Potion !\n");
  105.             PVennemi = PVennemi + ObjetPotion;
  106.             break;
  107.         }
  108.         default:
  109.             printf("L'ennemi ne fait rien !\n");
  110.             break;
  111.     }
  112.     return 0;
  113. }
  114.  

Je ne vous donne pas les autres pages, sa servirait a rien ^^ De plus Objet et Technique ne sont pas encore coder ^^

Edit : après relecture; sachez que si vous voyez "MenuCombat ();" sachez que c'est la fonction ou le joueur choisi ce qu'il fait. il faut bien sur qu'il fasse attaquer pour que le code revienne... ces d'ailleurs là le problème, je pense qu'il faudrait créer une autre fonction pour enregistré les PV du joueur et ennemi, mais je sais pas faire sa ^^
Dernière édition le 01/10/2008 à 17:41 par le testeur
Le testeur, pour vous servir ^^
Webmestre : HTML et CSS (très peu PHP) Scénariste et un peu graphiste.
En cours d'apprentissage du C/C++ sur le SDZ (enfin, une relecture)
pierrot # Posté le 01/10/2008 à 18:44

avatar
bonjour

Ca me rappelle un exemple de jeu qui est dans le tuto de mateo21 :) .

a+
Norber # Posté le 01/10/2008 à 18:59
Macaque en détresse!
avatar
Crée tes variables dans le main et utilise des pointeurs pour les utilisés dans tes fonctions.

PS:Je crois que int serait très suffisant pour tes variables. ;)
image utilisateur image utilisateur image utilisateur image utilisateur image utilisateur
steckdenis # Posté le 01/10/2008 à 19:01
Ca marche !
avatar
Devant tes variables PV... (bref celle qui doivent rester), mets "static" ;) .

A plus.

EDIT : Code : c
  1. static long PVEnnemi = 120; //Par exemple
Dernière édition le 01/10/2008 à 19:02 par steckdenis
Le meilleur mot de passe au monde est "M@téo21" : majuscule/minuscule, chiffres/lettres, et caractères spéciaux :p :p
le testeur # Posté le 01/10/2008 à 22:36
Rien d'impossible
avatar
Merci mais static fais quoi ?
Le testeur, pour vous servir ^^
Webmestre : HTML et CSS (très peu PHP) Scénariste et un peu graphiste.
En cours d'apprentissage du C/C++ sur le SDZ (enfin, une relecture)
Hadware # Posté le 01/10/2008 à 23:17
Il faut prendre les choses en riant, c'est essentiel.
avatar
En effet?
Static est-il un certain type de constante?
On peut rire de tout, mais pas avec n'importe qui.
~Desproge
Programmeur VB.net (Tuto SdZ en Cours)
Futur Programmeur LBasic :D
math # Posté le 02/10/2008 à 01:03
Vive le Québec libre!... Et le logiciel libre ^^
avatar
"static" permet d'initialiser les variables à la première exécution de la fonction, mais pas aux autres ( Elles garderont leur valeur précédente ).

Mais, bon, selon moi, le mieux serait de déclarer les variables dans ton main et de les passer en paramètre...

Citation : le testeur
1 = Attaque, 2 = technique, 3 = objet

Pour plus de compréhension, tu pourrais aussi utiliser un enum ou des constantes :D

le testeur # Posté le 02/10/2008 à 06:45
Rien d'impossible
avatar
ces ce que je voudrais faire (plus logique) mais comment je l'ai rend accessible de tous ?
Le testeur, pour vous servir ^^
Webmestre : HTML et CSS (très peu PHP) Scénariste et un peu graphiste.
En cours d'apprentissage du C/C++ sur le SDZ (enfin, une relecture)
Hadware # Posté le 02/10/2008 à 12:34
Il faut prendre les choses en riant, c'est essentiel.
avatar
Bah tu les déclare en Public, nan?
On peut rire de tout, mais pas avec n'importe qui.
~Desproge
Programmeur VB.net (Tuto SdZ en Cours)
Futur Programmeur LBasic :D
steckdenis # Posté le 02/10/2008 à 16:32
Ca marche !
avatar
tu les mets en global Les statics sont beaucoup mieux, car tu garde les avantages des variables locales (justement, locales, donc pas moyen de malencontreusement les écraser) avec les avantages des globales (elles ne sont pas temporaires).

Si tu veux qu'elles soient accessibles partout, le mieux est encore de les mettre globales.

A plus.
Le meilleur mot de passe au monde est "M@téo21" : majuscule/minuscule, chiffres/lettres, et caractères spéciaux :p :p
Tryss # Posté le 02/10/2008 à 17:34

avatar
C'est juste que ton code est mal pensé, déjà l'idée à la base serrait d'avoir toutes les infos concernant ton joueur stockées dans une structure, de même pour les infos de l'ennemi.

Après il te suffit de modifier tes fonctions pour qu'au lieu de prendre les valeurs locales elles prennent les valeurs de ces structures.

Code : c
  1.  
  2.  
  3. typedef struct joueur
  4. {
  5.    int pv = 100;
  6.    int attaque = 15;
  7. } joueur;
  8.  
  9. typedef struct monstre
  10. {
  11.    int pv = 50;
  12.    int attaque = 10;
  13. }
  14.  
  15. int ChoixAttaque(Joueur *joueur, Monstre *monstre )
  16. {
  17.  
  18.     printf("\n\n Vous attaquez l'ennemi.\n");
  19.     VALIDER;
  20.     printf("Vous causez %ld degats a l'ennemi.\n", joueur->attaque);
  21.     monstre->pv -= joueur->attaque;
  22.  
  23.     if (monstre->pv <= 0)
  24.     }
  25.         VictoireCombat();
  26.     }
  27.     else
  28.     {
  29.       printf("Il reste %ld Pv a votre ennemi !\n", monstre->pv);
  30.       VALIDER;
  31.       IAennemi(monstre, joueur);
  32.  
  33.       if (PVjoueur <= 0)
  34.       {
  35.         DefaiteCombat();
  36.       }
  37.       else
  38.       {
  39.         printf("Il vous reste %ld PV !\n", joueur->pv);
  40.         MenuCombat();
  41.       }
  42.     }
  43.     return 0;
  44. }
  45.  
  46.  


PS: et les variables globales c'est le MAL ]:)

L'avantage de cette methode, c'est qu'il est possible, en agrandissant la structure, de tout enregistrer sur le joueur dedans, et concernant les monstres, d'avoir pour chaque monstre ses types d'attaques, dommages et particularités.
Dernière édition le 02/10/2008 à 17:38 par Tryss
le testeur # Posté le 02/10/2008 à 18:24
Rien d'impossible
avatar
Salut

Je te remercie du code, mais je ne vais pas utiliser un code que je comprend pas et que je ne pourrais pas refaire ^^

Pourrais tu m'expliquer le code ?
Le testeur, pour vous servir ^^
Webmestre : HTML et CSS (très peu PHP) Scénariste et un peu graphiste.
En cours d'apprentissage du C/C++ sur le SDZ (enfin, une relecture)
frdemahieu # Posté le 02/10/2008 à 18:31
Nice to logr 'am
avatar
Pour faire simple Code : c
  1.  
  2.                                      structure
  3.                                       /     \
  4.                                variable1   variable2    
  5.  

Pour aller chercher variable1 ont fait structure->variable1.
Pour plus amples information -> http://www.siteduzero.com
Dernière édition le 02/10/2008 à 18:33 par frdemahieu
On peut tout faire lorsque l'on commence avec rien.
On attends vos tuto et vos news !!!
le testeur # Posté le 02/10/2008 à 18:35
Rien d'impossible
avatar
(dsl double post)

J'ai essayé avec Static, sa marche mais seulement pour les PV de l'ennemi.
En effet, malgré l'attaque de l'ennemi sur le PV du joueur, bah il baisse pas ^^
Le testeur, pour vous servir ^^
Webmestre : HTML et CSS (très peu PHP) Scénariste et un peu graphiste.
En cours d'apprentissage du C/C++ sur le SDZ (enfin, une relecture)
Tryss # Posté le 02/10/2008 à 18:44

avatar
Une structure c'est une super-variable qui regroupe des variables, un peu comme une grosse boite ;)

Contrairement a un tableaux, les variables peuvent être de types differents (on peut même faire des structures qui contiennent des structures :p )

Pour acceder à un element de la structure on utilise l'operateur . : structure.variable

Mais lorsqu'on a passé la structure par adresse, il faudrai faire *(structure).variable qui est plus simplement remplacé par structure->variable (plus pratique, mais les deux ecritures sont equivalentes)

PS: essaye de declarer tes static une seule fois ^^


Dernière édition le 02/10/2008 à 18:45 par Tryss
frdemahieu # Posté le 04/10/2008 à 18:57
Nice to logr 'am
avatar
Bha c'est comme j'ai dit quoi. :-°
On peut tout faire lorsque l'on commence avec rien.
On attends vos tuto et vos news !!!
le testeur # Posté le 05/10/2008 à 21:25
Rien d'impossible
avatar
un pote a mon lycée a essayer ce week de trouver une soluce sans utiliser le tableaux des variables, je vous dis ce que sa donne des qu'il me donne les codes ! ^^
Le testeur, pour vous servir ^^
Webmestre : HTML et CSS (très peu PHP) Scénariste et un peu graphiste.
En cours d'apprentissage du C/C++ sur le SDZ (enfin, une relecture)
frdemahieu # Posté le 06/10/2008 à 18:41
Nice to logr 'am
avatar
C'est pas un tableau c'est une Structure :angry:
On peut tout faire lorsque l'on commence avec rien.
On attends vos tuto et vos news !!!
le testeur # Posté le 08/10/2008 à 14:48
Rien d'impossible
avatar
Oui, mais en gros c'est un tableau pour classer des variables :lol:
Le testeur, pour vous servir ^^
Webmestre : HTML et CSS (très peu PHP) Scénariste et un peu graphiste.
En cours d'apprentissage du C/C++ sur le SDZ (enfin, une relecture)
andman # Posté le 08/10/2008 à 16:24
Bière qui roule perd toute sa mousse
avatar
Désolé, mais fredmahieu a raison. Les tableaux c'est vraiment tout autre chose que les structures. On peut pas comparer ...
On a besoin de vos News !! || Et de vos tutos !!
Spéciale dédicace : Un clavier azerty en vaut 2.
Autre dédicace (animalmuppet) :Et oui, Noël approche!
Précédant 1 2 3 Suivant