2013-08-30 5 views
0

C'est ma deuxième semaine d'université et mon professeur m'a confié la mission de suivre un programme python, que je connais bien, et de le transformer en programme C++. Je ne sais presque rien du C++ ayant seulement eu une conférence sur le sujet et mon livre n'arrivant pas avant deux jours. Voici le programme python ..Questions du programme Python to C++

import random 
import sys 
import time 

print("BATTLE GAME"); 

done = False 
combatRound = 0 

playerHP = 20 
playerAtk = random.randint(5, 8) 
playerDef = random.randint(5, 8) 
playerAgi = random.randint(5, 8) 

enemyHP = 20 
enemyAtk = random.randint(5, 7) 
enemyDef = random.randint(5, 7) 
enemyAgi = random.randint(5, 7) 

delayLength = 0.5 

print() 
print("-------------") 
print("FIGHTER STATS") 
print("-------------") 

print() 
print("PLAYER STATS:") 
print("HP " + str(playerHP)) 
print("ATK " + str(playerAtk)) 
print("DEF " + str(playerDef)) 
print("AGI " + str(playerAgi)) 

print() 
print("ENEMY STATS:") 
print("HP " + str(enemyHP)) 
print("ATK " + str(enemyAtk)) 
print("DEF " + str(enemyDef)) 
print("AGI " + str(enemyAgi)) 

print() 
choice = input("Ready to begin? (yes/no) ") 

while (choice != "yes"): 
    print("Well, what are you waiting for? \n") 
    choice = input("Ready to begin? (yes/no) ") 

while (done == False): 
    combatRound += 1 
    print() 
    print("###########################################") 
    print("-------------------------------------------") 
    print("ROUND " + str(combatRound)) 
    print("PLAYER:\t HP " + str(playerHP) + " ATK " + str(playerAtk) + " DEF " + str(playerDef) + " AGI " + str(playerAgi)) 
    print("ENEMY:\t HP " + str(enemyHP) + " ATK " + str(enemyAtk) + " DEF " + str(enemyDef) + " AGI " + str(enemyAgi)) 
    print("-------------------------------------------") 
    print("1. Quick Attack") 
    print("2. Standard Attack") 
    print("3. Heavy Attack") 
    playerChoice = input("What will you do? ") 
    playerChoice = int(playerChoice) 

    while (playerChoice < 1 or playerChoice > 3): 
     playerChoice = input("Invalid choice, choose between 1 and 3: ") 
     playerChoice = int(playerChoice) 

    enemyChoice = random.randint(1, 3) 
    print("Enemy chooses option " + str(enemyChoice)) 
    print("-------------------------------------------") 

    # Adjust player and enemy stats based on the type of attack they're doing 
    adjustedPlayerAtk = playerAtk 
    adjustedPlayerAgi = playerAgi 

    adjustedEnemyAtk = enemyAtk 
    adjustedEnemyAgi = enemyAgi 

    if (playerChoice == 1): 
     adjustedPlayerAgi += 2 
     adjustedPlayerAtk -= 1 
    elif (playerChoice == 3): 
     adjustedPlayerAgi -= 1 
     adjustedPlayerAtk += 2 

    if (enemyChoice == 1): 
     adjustedEnemyAgi += 2 
     adjustedEnemyAtk -= 1 
    elif (enemyChoice == 3): 
     adjustedEnemyAgi -= 1 
     adjustedEnemyAtk += 2 

    # Begin battle 
    print("PLAYER attacks ENEMY!") 
    time.sleep(delayLength) 

    randDiff = random.randint(0, adjustedPlayerAgi) 
    time.sleep(delayLength) 

    if (randDiff >= 1): 
     # Calculate damage 
     damage = int(adjustedPlayerAtk - enemyDef/2) 
     print("PLAYER hits ENEMY for " + str(damage) + " damage!") 
     enemyHP -= damage 

    else: 
     print("PLAYER misses!") 

    time.sleep(delayLength) 


    print("ENEMY attacks PLAYER!") 
    time.sleep(delayLength) 

    randDiff = random.randint(0, adjustedEnemyAgi) 
    time.sleep(delayLength) 

    if (randDiff >= 1): 
     # Calculate damage 
     damage = int(adjustedEnemyAtk - playerDef/2) 
     print("ENEMY hits PLAYER for " + str(damage) + " damage!") 
     playerHP -= damage 

    else: 
     print("ENEMY misses!") 

    time.sleep(delayLength) 

    # Check to see if either player is knocked out 
    if (playerHP <= 0): 
     print("PLAYER has fallen!") 
     done = True 

    elif (enemyHP <= 0): 
     print("ENEMY has fallen!") 
     done = True 

# Game main loop 

# At this point, either player or enemy has fallen. 
print() 
print(" ##################################### ") 
print(" ####         ####") 
print("#   G A M E  O V E R    #") 
print("# ######################################### #") 
print("##           ##") 
print() 

if (playerHP <= 0): 
    print("Too bad, you lose!") 
elif (enemyHP <= 0): 
    print("Congratulations, you won!") 

Et voici mon code C++

#include <iostream> 
#include <string> 
#include <random> 
using namespace std; 


    int playerHP = 20, int enemyHP = 20; 
    int playerAtk =random.randint(5,8); //How do you do random in C+++ 
    int playerDef = random.randint(5,8); 
    int playerAgi = random.randint(5,8); 
    int enemyAtk = random.randint(5,7); 
    int enemyDef = random.randint (5,7); 
    int enemyAgi = random.randint (5,7); 
    float delayLength=.5; 
    cout<<"---------------"<< endl; 
    cout<<"FIGHTER STATS"<< endl; 
    cout<<"----------------"<<endl; 
    cout<<"Player Stats:"<<endl; 
    cout<<"HP "<<playerHP<<endl; 
    cout<<"ATK "<<playerAtk<<endl; 
    cout<<"DEF "<<playerDef<<endl; 
    cout<<"AGI "<<playerAgi<<endl; 
    cout<<"ENEMY STATS:"<<endl; 
    cout<<"HP "<<enemyHP<<endl; 
    cout<<"ATK "<<enemyAtk<<endl; 
    cout<<"DEF "<<enemyDef<<endl; 
    cout<<"AGI "<<enemyAgi<<endl; 
    while (playerHP>0 || enemyHP>0) 
    { 
     int combatRound=0; 
     int playerChoice; 
     int enemyChoice; 
     int adjustedPlayerAtk; 
     int adjustedPlayerAgi; 
     int adjustedEnemyAtk; 
     int adjustedEnemyAgi; 
     int randDiff; 
     int damage; 
     int damage2; 
     int randDiff2 
     combatRound +=1 
     cout<<""<<endl; 
     cout<<"############################"<<endl; 
     cout<<"----------------------------"<<endl; 
     cout<<"Round "<<combatRound<<endl; 
     cout<<"Player:"<<playerHP<<playerAtk<<playerAgi<<endl; 
     cout<<"Enemy:"<<enemyHP<<enemyAtk<<enemyAgi<<endl; 
     cout<<"----------------------------"<<endl; 
     cout<<"1. Quick Attack"<<endl; 
     cout<<"2. Standard Attack"<<endl; 
     cout<<"3. Heavy Attack"<<endl; 
     cout<<"What will you do? "<<endl; 
     cin>>playerChoice; 
     while playerChoice != 1 || 2 || 3 
      cout<<"Invalid choice, choose between 1 and 3:"<<endl; 
      cout<<"What will you do?"<<endl; 
      cin>>playerChoice; 

     enemyChoice=random.randint (1,3); 
     cout<< "Enemy chooses option "<<enemyChoice<<endl; 
     cout<<"--------------------------------"<<endl; 
     if playerChoice ==1 
      adjustedPlayerAgi +=2 
      adjustedPlayerAtk -=1 
     if playerChoice ==3 
      adjustedPlayerAgi -=1 
      adjustedPlayerAtk +=2 
     if enemyChoice ==1 
      adjustedEnemyAgi += 2 
      adjustedEnemyAtk -= 1 
     if enemyChoice ==3 
      adjustedEnemyAgi -= 1 
      adjustedEnemyAtk += 2 
     cout<<"PLAYER attacks ENEMY!"<<endl; 
     time.sleep(delayLength) //How do you do this in C++? 
     randDiff = random.randint(0, adjustedPlayerAgi) 
     time.sleep(delayLength) 
     if randDiff >=1 
      damage=(adjustedPlayerAtk-enemyDef/2) 
      enemyHP -= damage 
     else 
      cout<<"PLAYER misses!"<<endl; 
     time.sleep (delayLength) 

     cout<<"ENEMY attacks PLAYER!"<<endl; 
     time.sleep(delayLength) 
     randDiff2= random.randint(0,adjustedEnemyAgi) 
     time.sleep(delayLength) 
     if randDiff >=1 
      damage2= (adjustedEnemyAtk - playerDef/2) 
      cout<<"ENEMY hits PLAYER for "<<damage2<<"damage!"<<endl; 
      playerHP -= damage2 
     else 
      cout<<"ENEMY misses!"<<endl; 
     time.sleep (delayLength) 

    } 

cout<<""<<endl; 
cout<<"GAME OVER"<<endl; 
if playerHP <=0 
    cout<<"Too bad you lose"<<endl; 
if enemyHP <=0 
    cout<<"YOU WON"<<endl; 

Je n'ai honnêtement aucune idée correcte ou comment il est mauvais. Je l'écris actuellement dans le bloc-notes parce que le professeur ne nous a pas donné accès à Visual Studios. Tous les conseils, astuces ou conseils sont EXTRÊMEMENT appréciés. Encore une fois, je m'excuse de l'aspect désagréable mais j'ai vraiment fait de mon mieux et j'ai hâte d'en apprendre plus sur cette nouvelle langue passionnante.

+1

Attendez que le livre arrive? Si vous êtes sérieux au sujet de l'apprentissage du C++, une semaine ne va pas faire la différence. –

+0

Kerrek SB a raison: j'apprends le C++ depuis plus de 20 ans (certes, il change aussi pendant que je progresse). BTW, juste parce que vous n'avez pas accès à Visual Studio, ne signifie pas que vous ne pouvez pas utiliser un compilateur! Vous pouvez compiler et exécuter [C++ en ligne] (http://ideone.com) ou obtenir [gcc] (http://gcc.gnu.org/) ou [clang] (http://clang.llvm.org/) qui sont tous deux gratuits. –

+0

Apprendre le C++ est une chose incroyable à faire; cependant si vous voulez le rendre plus facile (je ne suggère pas de le faire pour toujours, c'est une solution rapide) alors vous pouvez créer votre propre bibliothèque qui a des fonctions python, mais les fait en C++, par exemple avoir une fonction appelée ' print' et utilise 'cout'. – lewisjb

Répondre

1

Pour faire des nombres aléatoires en C++:

rand() % 10 + 1 

Cela vous donnera une valeur aléatoire entre 1 et 10. rand() donnera un nombre aléatoire de 0 à RAND_MAX (32727); alors utilisez les maths pour transformer tous les nombres dans la gamme que vous voulez.

aussi:

Assurez-vous d'utiliser ; à la fin

combatRound +=1 est un exemple de l'endroit où vous ne l'avez pas.

Assurez-vous également que vous utilisez ( et )

if playerChoice == 1 est un exemple de l'endroit où vous ne l'avez pas.

Et: while playerChoice != 1 || 2 || 3

devrait être

while(playerChoice != 1 && playerChoice != 2 && playerChoice != 3)

Et enfin:

retard dans C++:

Si vous utilisez Windows (utilisez aussi include <windows.h>): Sleep() et utiliser mil liseconds

Et si vous utilisez UNIX, utilisez sleep et il est en secondes (utilisez include <unistd.h>). L'utilisation de l'opérateur restant (%) sur le résultat de rand() est un moyen d'obtenir des nombres aléatoires.

+0

@ DietmarKühl Désolé! C'était une faute de frappe! – lewisjb

+0

de 0, à max quoi? –

+0

@NeilKirk Valeur maximale de rand(), je crois que c'est 32727. – lewisjb

0

C'est assez bon pour "hasard aléatoire", comme votre application de jeu, mais ne l'utilisez pas dans une simulation sérieuse. Il y a deux problèmes. Tout d'abord, les bits de poids faible de nombreux générateurs de nombres aléatoires ne sont pas aussi indépendants statistiquement des valeurs précédentes que le nombre entier. Deuxièmement, il existe une plage de correctifs pour le résultat complet, allant de 0 à une constante définie par l'implémentation RAND_MAX (définie avec rand() dans <cstdlib>).Cela donne (RAND_MAX+1) différentes valeurs, et si votre diviseur ne divise pas uniformément (RAND_MAX+1), alors vous obtiendrez des valeurs légèrement plus basses que les valeurs élevées.

Une meilleure façon d'utiliser rand() est de suivre le modèle de Python. Dans les étapes:

  1. Une fois, au début de votre programme, appelez srand() pour mettre la graine de départ. Normalement, vous ne voulez pas répéter la même séquence de randoms dans deux passages du programme. La manière habituelle de c'est d'inclure <ctime> et:

    srand(time(NULL));

  2. Définir une fonction comme celle random.random() Python qui renvoie un double de 0 (inclus) à 1 (exclusive):

    double random()

    {

    return rand() * (1.0/(RAND_MAX + 1.0));

    }

  3. définir une fonction comme randint(a,b) de python retournant un entier compris entre a et b (y compris sur les deux extrémités):

    int randint(int a, int b)

    {

    return a + (int)((b+1-a)*random());

    }

Cela vous donnera la fonctionnalité randint() dont vous avez besoin pour un remplacement direct.


En parlant de % et C++ vs Python, une chose à prendre en compte est l'opérateur C/C++ % est un opérateur reste, alors que Python utilise le (supérieur, à mon humble avis) définition de la fonction modulo. Les définitions sont les mêmes lorsque les deux arguments sont positifs, mais vous obtiendrez généralement une réponse que vous ne voulez pas lorsqu'un argument est négatif.


Pour la fonction de sommeil, la meilleure solution pour Visual C++ est d'inclure <windows.h> et utiliser la fonction Sleep():

http://msdn.microsoft.com/en-us/library/windows/desktop/ms686298%28v=vs.85%29.aspx

Le type d'argument DWORD est équivalent à non signé ou non signé long et représente le nombre de millisecondes, alors dormez pour (unsigned)(1000*python_sleep_value):

void sleep(double seconds) 
{ 
    Sleep((unsigned)(seconds*1000)); 
} 

Une solution standard est d'utiliser la fonction C++ 11 std::this_thread::sleep_for, en incluant <thread> et <chrono>.Il y a un exemple, en utilisant également millisecondes, ici:

http://en.cppreference.com/w/cpp/thread/sleep_for


Autres choses:

  • sont boutistes de points-virgules déclaration, non séparateurs de déclaration.

  • Les parenthèses sont requises dans certaines conditions. (Aucun deux-points.)

  • Tout doit être défini au moment de la compilation.

  • Les classes et les objets sont assez différents. Oubliez tout ce que vous saviez d'eux en Python, sauf que l'encapsulation et l'héritage sont de Bonnes Idées. Amusez-vous bien ... et j'espère que cela vous aidera.

+0

Donc disons que je voudrais un nombre aléatoire entre 5 et 8. Comment pourrais-je faire cela? Pourrais-je créer un tableau tel que [5,6,7,8], puis utiliser rand de quelque façon? – Bob

+0

Avec ces fonctions, c'est juste randint (5,8). –