FightSimulator1
| Huntil |
Posté le 29 Déc 2007 à 15:11
|
|
![]() Messages : 1012 GCPoints : 289843 |
Bon, comme je n'arrive pas à me concentrer quand je n'ai pas de projet, je viens de me lancer dans la création d'un petit Simulateur de combat tout ce qu'il y a de plus basique pour apprendre le C++. Merci à Dartib pour le tuto sur CB
Copyright © 2007 - 2010 Huntil
"Il faut toujours un drame" |
|
| Mod |
Posté le 29 Déc 2007 à 15:16
|
|
![]() Messages : 4954 GCPoints : 2100823 |
Quand tu dis "simulateur de combat" et en titre "FlightSimulator1", tu parles d'un jeu de shoot ? Et quelle librairie comptes-tu utiliser ? |
|
| Huntil |
Posté le 29 Déc 2007 à 15:39
|
|
![]() Messages : 1012 GCPoints : 289843 |
non, le titre c'est pour le fun. J'ai bien présicer "tout ce qu'il y a de plus basique". Pour l'instant j'en suis encore à la console. C'est mon tout premier programme en C++, alors faut pas trop en demander hein
Copyright © 2007 - 2010 Huntil
"Il faut toujours un drame" |
|
| Darktib |
Posté le 29 Déc 2007 à 15:43
|
|
![]() Messages : 4017 GCPoints : 347288 |
Merci Faut bien commencer quelque part, non? Un petit conseil : fait ce projet sur la console uniquementt. Ca te permettra de mieux connaitre le C apres. Met des truc genre plusieurs armes,etc... Bon, je m'emballe, la^^ |
|
| Huntil |
Posté le 30 Déc 2007 à 16:54
|
|
![]() Messages : 1012 GCPoints : 289843 |
Bon ce matin jme suis tapé: les flux avec iostream, les structures, les pointeurs, les références, using namespace, les classes, les constructeurs, les destructeurs, etc... (pas mal hein ? - j'ai un constructeur par défaut qui initialisais les variables membres à l'intérieur des accolades, mais j'avais des valeurs qui ne correspondaient à rien, alors j'ai fait une liste d'initialisation et là, miracle, ça marche. Donc si on pouvait m'expliquer pourquoi ça ne marchait pas. -quand on demande à l'utilisateur de faire un choix et qu'il tape des lettres au lieu d'un nombre le programme ce met à tourner en boucle. Pourquoi -pour sauter plusieurs lignes d"un coup j'utilse des "endl" à répétitions. Mon frère m'a parlé d'une bibliothèque "iomanip" mais j'ai pas réussi à trouver d'infos C'est tout ce qui me vient à l'esprit maintenant, mais vous inquiétez pas, y en a plein d'autres Merci d'avance.
Copyright © 2007 - 2010 Huntil
"Il faut toujours un drame" |
|
| Mod |
Posté le 30 Déc 2007 à 17:08
|
|
![]() Messages : 4954 GCPoints : 2100823 |
1/ Voir le code de ton objet et ton appel serait utile, là j'ai un peu de mal à imaginer ce que ça donne ^^'. 2/ Voir le code serait aussi utile ici ^^. 3/ Je n'ai jamais entendu parler de iomanip, et personnellement si je dois passer des lignes c'est des endl tout le temps. Bref, ma réponse serait : le std::endl est ton ami. Sinon, tu peux te coder une fonction de ce genre qui te passe automatiquement des lignes : Code : string PasserLignes(int nombreDeLignes)
{
string lignes("");
for(int i=1;i<=nombreDeLignes;i++)
lignes = lignes << endl;
return lignes;
}Et pour ton texte tu ferais quelque chose comme : Code : cout << "Texte" << PasserLignes(5); (Je n'ai pas testé le code mais ça devrait ressembler à quelque chose de ce genre).
Dernière édition le 30 Déc 2007 à 17:08
|
|
| Huntil |
Posté le 30 Déc 2007 à 17:23
|
|
![]() Messages : 1012 GCPoints : 289843 |
Bon, comme j'ai pas fait grand chose je peux faire un copié-collé combattant.h : Code : #ifndef DEF_COMBATTANT
#define DEF_COMBATTANT
#include <string>
class Combattant
{
private:
std::string nom;
int pv;
int attaque;
int mana;
int reflex;
public:
Combattant();
~Combattant();
void definir();
void attaquer(Combattant &cible);
void status();
std::string getNom() const;
int getReflex() const;
};
#endif
combattant.cpp : Code : #include <iostream>
#include <string>
#include "combattant.h"
using std::cout;
using std::cin;
using std::endl;
using std::string;
Combattant::Combattant(): nom("Player"), pv(100), attaque(10), mana(5)
{
}
Combattant::~Combattant()
{
}
void Combattant::definir()
{
cout << "Nom ?" << endl; cin >> nom;
cout << "Vitalite ?" << endl; cin >> pv;
cout << "Force ?" << endl; cin >> attaque;
cout << "Mana ?" << endl; cin >> mana;
cout << "Relexe ?" << endl; cin >> reflex;
cout << endl;
}
void Combattant::attaquer(Combattant &cible)
{
cible.pv -= attaque;
if (cible.pv < 0)
{
cible.pv = 0;
}
}
void Combattant::status()
{
cout << nom << endl;
cout << "---------" << endl;
cout << "Vie: " << pv <<endl;
cout << "Attaque: " << attaque << endl;
cout << "Mana: " << mana << endl;
cout << "Reflexe: " << reflex << endl;
cout << endl << endl;
}
std::string Combattant::getNom() const
{
return nom;
}
int Combattant::getReflex() const
{
return reflex;
}main.cpp : Code : #include <iostream>
#include <string>
#include "combattant.h"
using std::cout;
using std::cin;
using std::endl;
using std::string;
int main()
{
Combattant c1, c2;
int choix;
while(1)
{
cout << "Fight Simulator" << endl;
cout << "***************" << endl << endl;
cout << "1. Modifier combattant" << endl;
cout << "2. Afficher combattant" << endl;
cout << "3. Lancer simulation" << endl;
cout << endl;
cout << "Votre choix ? (1,2,3): ";
cin >> choix;
cout << endl;
if(choix == 1)
{
cout << "Quelle combattant voulez-vous modifier ? " << endl;
cout << "1. " << c1.getNom() << endl;
cout << "2. " << c2.getNom() << endl;
cout << "Votre choix ?";
cin >> choix;
cout << endl;
if(choix==1)
{
c1.definir();
}
else if(choix==2)
{
c2.definir();
}
}
else if(choix==2)
{
cout << "Quelle combattant voulez-vous afficher ? " << endl;
cout << "1. " << c1.getNom() << endl;
cout << "2. " << c2.getNom() << endl;
cout << "Votre choix ?";
cin >> choix;
cout << endl;
if(choix==1)
{
c1.status();
}
else if(choix==2)
{
c2.status();
}
}
else if(choix==3)
{
}
else
{
break;
}
}
return 0;
}
Notez que j'ai supprimé le début de code de la simulation dans le main. Et pendant que je faisais gentiment mon copié-collé d'autre questions me sont revenus en mémoire -la signifiaction précise des lignes de préprocesseurs (c'est bien comme ça qu'on dit ?) ? -les erreurs dans mon code quelles quels soient et les améliorations possibles que vous voyez
Copyright © 2007 - 2010 Huntil
"Il faut toujours un drame" |
|
| Mod |
Posté le 30 Déc 2007 à 17:53
|
|
![]() Messages : 4954 GCPoints : 2100823 |
Il me faudrait le code de ton constructeur lorsqu'il ne fonctionnait pas Pour la question sur la boucle infinie, je regarde ça. [Edit] Quand tu tapes des lettres, tu essaies de mettre du texte dans une variable entière... Ce qui fait partie des choses à ne pas faire, on teste généralement les entrées lorsqu'il s'agit d'entrer des chiffres et non des lettres. Je n'avais jamais fait attention que ça pouvait avoir ce genre d'effet... C'est un plantage comme un autre. Suggestions d'amélioration : - Plutôt que d'utiliser des using std::fonction, utilise un using namespace std, tu auras directement accès à toutes les fonctions de l'espace de nom standard. - Si tu dois gérer beaucoup de combattants différents, ctu peux créer une liste chaîné d'objet ou plus simple un tableau d'objets pour accéder directement à l'objet plutôt qu'en passant par des conditions à foison, ça serait plus simple. Bien sûr si ce n'est que pour deux objets, ça n'a pas d'interêt. (J'ai édité ton message pour pouvoir avoir l'indentation du code).
Dernière édition le 30 Déc 2007 à 18:23
|
|
| Huntil |
Posté le 30 Déc 2007 à 18:49
|
|
![]() Messages : 1012 GCPoints : 289843 |
Tiens j'avais pas vu la balise code Sinon pour le constructeur c'et simple: Code : Combattant::Combattant():
{
string nom = "Player";
int pv = 100;
int attaque = 10;
int mana =5;
}Pour les using std::fonction je sais que dans mon cas ce n'est pas important, mais pour des raisons pratiques il est déconseillé de l'utiliser dans les gros programmes avec de très nombreuses fonctions. Alors autant prendre les bonnes habitudes du départ Pour les combattants je pense leurs allouer dynamiquement la mémoire dans le constructeur tout en en limitant le nombre (200 par exemple) et permettre de les enregistrer dans un fichier texte. Mais il y a encore du boulot
Copyright © 2007 - 2010 Huntil
"Il faut toujours un drame" |
|
| Mod |
Posté le 30 Déc 2007 à 19:46
|
|
![]() Messages : 4954 GCPoints : 2100823 |
Pour ton constructeur, c'est normal que ça ne fonctionne pas, lorsque tu fais ça : Code : Combattant::Combattant():
{
string nom = "Player";
int pv = 100;
int attaque = 10;
int mana =5;
}Tu déclares et définies quatre variables dans la portée du constructeur. Là, tu n'utilises pas les variables définies dans ton objet, tu en créés de nouvelles. Tu aurais normalement dû faire ça : Code : Combattant::Combattant():
{
nom = "Player";
pv = 100;
attaque = 10;
mana =5;
}Les attributs sont créées en même tant que l'objet, pas la peine de les redéclarer dans le constructeur, donc. Et de préférence, essaie d'utiliser le mot clé "this" lorsque tu utilises des attributs, ça évite tout problème côté compilateur, ça éclaircit un peu le code, et ça permet de faire la différence avec les variables locales : Code : Combattant::Combattant():
{
this->nom = "Player";
this->pv = 100;
this->attaque = 10;
this->mana =5;
}[Edit] Pour le préprocesseur, c'est les commandes, ou le fonctionnement qui t'intéresse ?
Dernière édition le 30 Déc 2007 à 19:47
|
|
| Darktib |
Posté le 30 Déc 2007 à 20:12
|
|
![]() Messages : 4017 GCPoints : 347288 |
Visiblement ca avance bien Mais perso je t'aurai conseillé d'y aller plus doucement... |
|
| noob4ever |
Posté le 30 Déc 2007 à 23:52
|
|
![]() Messages : 295 GCPoints : 48742 |
salut, Citation :
En utilisant le flux cin, tu prends automatiquement ce risque ! Si ce que l'utilisateur rentre n'est pas conforme avec le format ---> boucle infinie . Si tu veux êtres sécurisé à 100%, fait comme en C#, tu stock la saisie de l'utilisateur dans un string ( ainsi pas de problème de format ), et tu converties le string en entier ou en float ( suivant tes besoins ) . Tu peux vérifier le résultat de la conversion avec un booleen, et répété l'action tant que la conversion n'est pas valide :) Citation :
iomanip n'est pas une bibliothèque mais un fichier d'en-tete . tu peux faire une fonction comme Mod te la proposer ou alors faire des 'n', ou alors utiliser iomanip :) un bon lien pour iomanip : http://msdn2.microsoft.com/en-us/library/ydd54a6t(VS.80).aspx Aussi, je ne vois pas pourquoi utilisé le C++ pour ce genre d'application bye
Dernière édition le 31 Déc 2007 à 15:06
What did C:/DARTHVADER said to C:/DARTHVADER/LUKESKYWALKER ?
I'm your folder |
|
| Darktib |
Posté le 31 Déc 2007 à 15:07
|
|
![]() Messages : 4017 GCPoints : 347288 |
Il s'agit d'une application dont le but est d'apprendre le C++ d'apres ce que j'ai compris, c'est pour ca que c'est en C++^^ |
|
| noob4ever |
Posté le 31 Déc 2007 à 16:01
|
|
![]() Messages : 295 GCPoints : 48742 |
je sais qu'en postant ce message je vais peut-etre me faire des enemis mais bon ... Son but est clairement établie a mes yeux : il veut apprendre le paradigme de la programmation orienté objet, et pour cela il utilise C++ . Donc il "n'apprend" pas vraiment le C++ en faite, un langage n'est que syntax, et ça c'est vite acquis. En C#, tu es 100% orienté objet, donc je pense que pour apprendre la POO, il est judicieux de le faire en C# . Je peux te conseiller un très bon livre sur le paradigme orienté objet et qui traite de la syntax de C# : http://www.amazon.fr/C-2-0-Guide-pratique-d%C3%A9veloppeur/dp/2100493272/ref=pd_bbs_sr_3?ie=UTF8&s=books&qid=1199113475&sr=8-3 ( j'espère que tu es sous windows, car Mono ne gère que la version 1.1 du framework dotNet ) Pour une fois, je trouve que wikipedia a fait un très bon article très explicite : http://fr.wikipedia.org/wiki/C_sharp regarde les différences entre Java et C# si tu n'es pas totalement conquis. PS: désolé des fautes je suis prit par le temps là ... @+
What did C:/DARTHVADER said to C:/DARTHVADER/LUKESKYWALKER ?
I'm your folder |
|
| Darktib |
Posté le 31 Déc 2007 à 16:04
|
|
![]() Messages : 4017 GCPoints : 347288 |
Je suis d'accord avec toi pour les langages POO, mais d'apres son premier post il veut apprendre le C++... et pas que la POO... D'autant plus que pour les jeux vidéos le C++ est tres utilisé...et comme on est sur un site de game making^^ |
|
| noob4ever |
Posté le 31 Déc 2007 à 16:14
|
|
![]() Messages : 295 GCPoints : 48742 |
Citation :
Oui c'est vrai, mais enfaite non On utilise C++ en jeux video car c'est + bas niveau, donc + de controle DONC + d'optimisation . Je peux comprendre qu'on utilise C++ pour world of warcraft, on a besoin de rapidité extreme, ( certaine partie on été codé en ASM ). Mais maintenant, on a des compilateurs qui optimise telement le code, que ce n'est même plus necessaire de le faire a la main ! ça m'etonerai que parmis la communauté, certains vont nous pondres des jeux digne d'une optimisation a la main ! Pour revenir a C# ( lol ), il dispose d'un ramasse miette, ça permet de nettoyer la mémoire inutilisé contrairement a C++ qui n'en a pas . ( enfin si il y a quelque lib mais rien de bien convaincant ) tout ça pour remettre en question l'utilisation abondante et parfois inutile du C++ . Mais C++ reste un très bon langage quand on l'utilise en ayant des besoin adapté, de + avec la nouvelle norme il deviendra encore + interessant . article de wikipedia sur la prochaine norme C++ : http://fr.wikipedia.org/wiki/C%2B%2B0x PS: la syntax du C# est proche du C++ donc pas trop de souci de ce coté là . ( pas similaire a 100% bien sur )
What did C:/DARTHVADER said to C:/DARTHVADER/LUKESKYWALKER ?
I'm your folder |
|
| Darktib |
Posté le 31 Déc 2007 à 16:34
|
|
![]() Messages : 4017 GCPoints : 347288 |
On utilise le C++ dans les jeux surtout pour la rapidité... (la POO se trouve dans pas mal de langages, donc c'est pas un soucis) Il existe des jeux en d'autres langages (comme ceux en Darkbasic par exemple),mais quelque fois faut mieux utiliser le C++ : j'ai joué a dofus il n'y a pas si longtemps, et niveau performances c'est la cata... faut dire aussi que c'est du flask Autres avantages du C++ : c'est ultra-compatible et c'est non-proprietaire... Et merci pour l'article sur la nouvelle norme, apparrement il y aura pas mal de bonheur^^ Sinon il me semble que le C# c'est payant? c'est MS qui l'a fait? |
|
| noob4ever |
Posté le 31 Déc 2007 à 17:05
|
|
![]() Messages : 295 GCPoints : 48742 |
Quand je parle d'optimisation, je parle aussi de rapidité, on est daccord hein ? je ne connais pas DarkBasic donc je ne dirais rien . je vois pas ce que tu veux dire avec le flash ? Citation :
C# aussi C'est microsoft qui a developpé C# en effet, mais tu va voir qu'ils ne sont pas si con que ça en regardant ces liens : microsoft rend publique le code source de certaines partie du framework : http://weblogs.asp.net/scottgu/archive/2007/10/03/releasing-the-source-code-for-the-net-framework-libraries.aspx Mono : http://fr.wikipedia.org/wiki/Mono_%28logiciel%29 Mono supporte très bien le framework 1.1 ( windows en est a 3.5 ), le common langage runtime et le C# 2.0 devient possible . de + si tu aurais regarder la page wikipedia sur C#, tu aurais vu que C# est standarisé. bref C# n'est plus proprietaire et ça marche très bien sur windows et linux . tu peux télécharger Visual 2008 C# express pour programmer sous windows : http://www.microsoft.com/express/download/ la version 2008 est en anglais, mais si tu veux la version 2005 est dispo en français : http://msdn2.microsoft.com/fr-fr/express/aa975050.aspx Et je me répète, la rapidité n'a plus de sens, quand vous compilez en release avec toute les optimisations ( Ox ) vous avez un programme très optimiser, pas besoin de l'optimiser a la main !
Dernière édition le 31 Déc 2007 à 17:24
What did C:/DARTHVADER said to C:/DARTHVADER/LUKESKYWALKER ?
I'm your folder |
|
| shadosan |
Posté le 31 Déc 2007 à 19:40
|
|
![]() Messages : 194 GCPoints : 8461 |
Citation :
Hm, j'avoue que ca aide (-Ox, comme tu dit) , mais de là à dire qu'un programme en C ou en C++ n'as pas besoin d'optimisation avec ça ! x_x Désolé, mais je vois assez mal comment un programme codé avec ses pied [ en disant ça, je vise personne ] peut être aussi rapide qu'un programme optimisé à la main (c-a-d, trouver des algo rapide pas foireux) (tout en ayant au final le même résultat à l'écran) ... Citation :
Faux ! Il est propriétaire. Les codes montré sont en "read-only", c'est-à-dire que tu n'as pas le droit de le modifier, ou de l'utiliser. Il est livré pour une fin de debugage, ou de référence. Le code est livré sous cette license : http://www.microsoft.com/resources/sharedsource/licensingbasics/referencelicense.mspx
Dernière édition le 31 Déc 2007 à 19:59
|
|
| noob4ever |
Posté le 31 Déc 2007 à 19:59
|
|
![]() Messages : 295 GCPoints : 48742 |
Code :#include <iostream>
int main()
{
std::cout << "Hello World!" << std::endl;
std::cout << "Hello World!" << std::endl;
std::cout << "Hello World!" << std::endl;
std::cout << "Hello World!" << std::endl;
std::cout << "Hello World!" << std::endl;
std::cout << "Hello World!" << std::endl;
std::cout << "Hello World!" << std::endl;
/* jusqu'a 203 hello world */
return 0;
}
résultat : 14 ko Code : #include <iostream>
int main()
{
for (int i=0; i<204; i++)
std::cout << "Hello World!" << std::endl;
return 0;
}résultat : 10 ko Bien sur, pour un programme beaucoup plus gros, l'écart se creseura, mais tu vois, il faut vraiment codé comme un naze pour arriver a avoir une GROSSE différence . mais tu as raison, il faut optimiser son programme a la main même si le compilo le fait pour nous. Surtout pour des jeux genre world of warcraft, et encore ce jeu a des parties codé en assembleur telement elles ont besoin d'êtres optimisées .... edit: C# a été normalisé par ECMA et est devenue un standard iso, il n'est plus proprietaire .... Comment tu crois que Mono a implémenté son compilo ?
Dernière édition le 31 Déc 2007 à 20:03
What did C:/DARTHVADER said to C:/DARTHVADER/LUKESKYWALKER ?
I'm your folder |
|




