CONNEXION
  • RetourJeux
    • Sorties
    • Hit Parade
    • Les + populaires
    • Les + attendus
    • Soluces
    • Tous les Jeux
    • Gaming
  • RetourActu Gaming
    • News
    • Astuces
    • Tests
    • Previews
    • Toute l'actu gaming
  • RetourBons plans
    • Bons plans
    • Bons plans Smartphone
    • Bons plans Hardware
    • Bons plans Image et Son
    • Bons plans Amazon
    • Bons plans Cdiscount
    • Bons plans Decathlon
    • Bons plans Fnac
    • Tous les Bons plans
  • RetourJVTech
    • Actus High-Tech
    • Intelligence Artificielle
    • Smartphones
    • Mobilité urbaine
    • Hardware
    • Image et son
    • Tutoriels
    • Tests produits High-Tech
    • Guides d'achat High-Tech
    • JVTech
  • RetourCulture
    • Actus Culture
    • Culture
  • RetourVidéos
    • A la une
    • Gaming Live
    • Vidéos Tests
    • Vidéos Previews
    • Gameplay
    • Trailers
    • Chroniques
    • Replay Web TV
    • Toutes les vidéos
  • RetourForums
    • Hardware PC
    • PS5
    • Switch 2
    • Xbox Series
    • Switch
    • Pokemon pocket
    • FC 25 Ultimate Team
    • League of Legends
    • Tous les Forums
  • PC
  • PS5
  • Xbox Series
  • Switch 2
  • PS4
  • One
  • Switch
  • iOS
  • Android
  • MMO
  • RPG
  • FPS
En ce moment Genshin Impact Valhalla Breath of the wild Animal Crossing GTA 5 Red dead 2
Liste des sujets

[C] Problème de boucle à 2 conditions ..

vexover
vexover
Niveau 9
26 juin 2006 à 22:21:52

Bien voila, j´ai commencer hier l´elaboration d´un Systeme de combat, que j´ai écris en console d´application en premier temps et que je retranscrirait en fenetre graphique avec animation et tout le tralala grace à la SDL, mais mon problème estle suivant :

j´utilise une boucle while pour que le combat se termine quand un des 2 protagonistes ( la en loccurence le joueur et le pc ) descend à 0 de HP. j´ai donc naïvement cru que je pourrais faire :

while( HPEnemie > 0 || HPJoueur > 0 )

mais ceci n´a pas l´air de marché et quand l´enemi atteint 0 le combat continue,

voici le code complet (il n´est bien sur pas finimais le peu de code que j´ai ecrit devrait fonctionner correctement sans cette boucle ...) :

  1. include <stdio.h>
  2. include <stdlib.h>

int main(int argc, char *argv[])
{
srand(time(NULL));
long MAX = 100;
long MIN = 0;
long choixCombat = 0;
char nomJoueur[100] = "freeman";

long constitutionJoueur = 5;
long constitutionEnemie = 5;

long HPJoueur = constitutionJoueur * 50;
long HPEnemie = constitutionEnemie * 50;

long precisionJoueur = 0;
long precisionEnemie = 0;

long esquiveJoueur = 0;
long esquiveEnemie = 0;

long forceJoueur = 5;
long forceEnemie = 5;

long attaque = 0;
long attaqueHazard = 0;

long degats = 0;
long degatsHazard = 0;

long MINdegats = (forceJoueur * 10) - ((forceJ
oueur * 10 ) / 10 );//calcul pour laisser une marge de 10 % sur les degats minimaux pour le rand degatsHazard ci dessous
long MAXdegats = (forceJoueur * 10) + ((forceJ
oueur * 10 ) / 10 );//calcul pour laisser une marge de 10 % sur les degats maximaux pour le rand degatsHazard ci dessous

while( HPEnemie > 0 || HPJoueur > 0 )
{
printf("1. Attaquer \n");
printf("2. Skills \n");
printf("3. objets \n");
printf("\n\nChoix : ");
scanf("%ld", &choixCombat);

if(choixCombat == 1)
{

degatsHazard = (rand() % (MAXdegats - MINdegats + 1)) + MINdegats;

attaqueHazard = (rand() % (MAX - MIN + 1)) + MIN;

attaque = attaqueHazard + precisionJoueur - esquiveEnemie;

if( attaque >= 90 )
{
degats = degatsHazard + ((forceJoueur * 10) / 5);
printf("\n\nVous assenez un coups a la tete de votre adversaire ( degats +20 pour cent ).\n\n- %ld HP.\n\n\n", degats);
}

else if( attaque >= 70 && attaque < 90 )
{
degats = degatsHazard + ((forceJoueur * 10) / 10);
printf("\n\nVous plantez votre arme dans le torse de l´enemie ( degats +10 pour cent ).\n\n- %ld HP.\n\n\n", degats);
}

else if( attaque >=40 && attaque < 70)
{
degats = degatsHazard;
printf("\n\nVous atteignez l´enemie a l´epaule ( degats normaux ).\n\n- %ld HP.\n\n\n", degats);
}

else if( attaque >= 30 && attaque < 40 )
{
degats = degatsHazard - ((forceJoueur * 10) / 10);
printf("\n\nVous frappez l´enemie a la jambe ( degats -10 pour cent ).\n\n- %ld HP.\n\n\n", degats);
}

else if( attaque >= 20 && attaque < 30 )
{
degats = degatsHazard - ((forceJoueur * 10) / 5);
printf("\n\nVous effleurer a peine l´enemie ( degats -20 pour cent ).\n\n- %ld HP.\n\n\n", degats);
}

else
{
printf("\n\nVotre attaque loupe \n\n\n");
}
HPEnemie = HPEnemie - degats;
if(HPEnemie < 0)
{
printf("HP Enemie = 0\n\n");
}
else
{
printf("HP Enemie = %ld\n\n", HPEnemie);
}
printf("HP %s = %ld\n\n", nomJoueur, HPJoueur);
}
}

system("PAUSE");
return 0;
}

_Xaar
_Xaar
Niveau 10
26 juin 2006 à 22:39:58

Ce ne serait pas plutôt && au lieu de || ? Tant que les deux sont au-dessus de zéro on continue, sinon on arrête.

[_Pator_]
[_Pator_]
Niveau 10
26 juin 2006 à 22:57:27

Au debut tu déclare plein de vrables "Long", tu crois que ça pourrait aller plus vite avec des "int"

Ché pas, j´dis ça comme ça ^^

Lapintade
Lapintade
Niveau 30
27 juin 2006 à 11:07:12

long ca sert a rien du tout, surtout pour des calculs comme ca, int suffit.

(mais ca ira pas plus vite avec des int)

vexover
vexover
Niveau 9
27 juin 2006 à 11:40:16

_Xaar ---> && signifie "et" hors si je met ce signe le jeu ne s´arrêtera que quand les deux protagonistes auront atteint 0, moi ce que je voudrais c´est que le jeux s´arrête quand UN des protagoniste aie atteint 0 .

[_Pator_], lapintade ---> Ha bon, j´ai toujours cru que long et int étaient strictement identiques, hé bien merci du conseil ^^, mais ça ne resout pas le problème :snif:

vexover
vexover
Niveau 9
27 juin 2006 à 11:49:10

Ha non Xaar tu avais raison, c´est avec le signe && qu´il faut le faire et pas ||, car un signe || est inutile dans ce cas la et il faut utiliser le signe qui signife "et", merci beaucoup !!

Lapintade
Lapintade
Niveau 30
27 juin 2006 à 12:14:22

Suivant les machine "long" et "int" peuvent etre different (en general "long"=64bits "int"=32bits) ou alors identique.

Essaie de faire un :
printf("%d\n", sizeof(long));
printf("%d\n", sizeof(int));
et tu verras

Vengeur41
Vengeur41
Niveau 10
27 juin 2006 à 12:22:29

while( HPEnemie > 0 || HPJoueur > 0 ) signifie
la boucle continue tant que les hp ennemis ou joueur sont supérieurs.
Donc si juste l´ennemi meurt, la boucle s´arrete pas.
Donc en effet c´est bien &&.

Tu peux aussi utiliser break dans ta boucle, c´est parfois moins prise de tete :)

vexover
vexover
Niveau 9
27 juin 2006 à 21:44:33

merci bien vengeur pour se precisions ^^.
Lapintade, c´est bien ce qui me semblait j´avais deja fait des sizeof pour tester et chez moi long et int sont tous 2 egaux à 4 octets, c´est pour ça que je pensais qu´il étaient identiques .

dnob700
dnob700
Niveau 10
27 juin 2006 à 23:14:25

Je ne connais pas d´archi courante ou les int et les long diffère. Sur un proco 32 bits type pentium les int et long sont tout deux en 32 bits (avec les compilo "de bases") (et les long long ou __int64 ou int64_t selon le système, sont en 64 bits).

Par contre, sur des amd64 là, ils font tout les deux 64 bits.

bref, je crois qu´on peut vraiment considérer qu´il s´agit de synonyme. Mais si quelqu´un connait un cas où ça diffère, ça m´interesse bien de savoir.

Sous forums
  • Aide à l'achat Mac
  • Macintosh
  • Création de sites web
  • Création de Jeux
  • Linux
  • Programmation
  • Internet
  • Steam Deck
  • Hardware
La vidéo du moment