La programmation en C++ moderne

Apprenez la programmation de zéro jusqu'à l'infini !

a marqué ce sujet comme résolu.

Oui je pensais à remplacer par un petit Pokémon justement, ça me botte plus qu’un RPG classique. C’est une super idée, merci.

Niveau légal, j’ai le droit de réutiliser les mêmes noms que Nintendo ?

EDIT : Je préfère le Pokémon à ton autre idée parce que c’est plus ambitieux, c’est mieux pour l’échelle d’une étude de cas.

+0 -0

Non, les droits tu ne les auras pas. N’y penses même pas :)

Après les trucs qui ne font délirer, ce sont plus les IA pour jeux, même de société (genre un Mr Jack Pocket, un ricochet Robot). Seul truc: ce n’est pas abordable pour un débutant, et il n’y a pas vraiment de quoi creuser le langage.

Ceci dit, quand on regarde des trucs comme leak wars, on voit que l’on a de plus en plus besoin de routines et de moyens avancés.

PS: attention avec les jeux qui modélisent des bestioles qui se tatannent, il y a le piège de l’abus d’objets.

Non, les droits tu ne les auras pas. N’y penses même pas :)

C’est-à-dire que Pokémon c’est complètement mort ? Même le concept je veux dire ?

PS: attention avec les jeux qui modélisent des bestioles qui se tatannent, il y a le piège de l’abus d’objets.

lmghs

Il n’y aura pas de POO pour cette étude de cas. Problem solved! :)

+0 -0

Tant que tu n’utilises aucun terme officiel et typique, ça ira je pense.

D’acc. Je pense que je peux quand-même dire que je m’inspire de Pokémon, histoire d’être un peu honnête ? ^^

NB: si je faisais référence à la POO, c’est car un truc intéressant est de faire évoluer ton exo non OO au fil du cours en quelque chose qui peut éventuellement le devenir.

lmghs

Ah, c’est une bonne idée. Je note !

+0 -0

Salut, j’ai une question sur laquelle j’aimerais vos généreux avis : est-ce que constexpr est une notion avancée dans un cours de C++ moderne ? Je me demande si ça n’aurait pas sa place assez tôt, au moins pour les variables constexpr. Avec les fonctions, c’est un peu plus complexe, mais pour les variables, c’est relativement simple et peut être très utile.

Qu’en pensez-vous ?

+0 -0

Pour moi, avoir un compile time et un runtime est l’une des spécificité du C++. Et ce qui en découle : penser certaines optimisations en fonction du compile time (zero overhead). constexpr permet de montrer sur un cas simple l’importance de cette séparation et de penser compile-time. Donc oui.

+2 -0

Bonjour les agrumes !

La bêta a été mise à jour et décante sa pulpe à l’adresse suivante :

Au programme de cette MaJ : une esquisse de plan pour l’interlude + la rédaction de quelques paragraphes (quelque peu indigestes, à retravailler) au début de cette partie. Je mets en beta surtout pour vous demander si vous avez des suggestions d’ajout (ou de retrait) à cette partie. Typiquement, une idée qui me vient comme ça : est-ce qu’il serait bien d’expliquer comment utiliser un debugger ?

Je précise aussi que si la rédaction avance moins vite en ce moment, c’est que je passe du temps sur le développement du jeu pour l’étude de cas.

Merci d’avance pour vos commentaires.

+0 -0

Par tirage aléatoire, tu entends du random en informatique ?

Si oui:

Avec l’idée du pile ou face ? Ou des boules dans une urne ? C’est comme ça que c’est enseigné en mathématiques au collège/lycée, quand les probabilités sont plus instinctives que complètement calculatoires.

+0 -0

Par tirage aléatoire, tu entends du random en informatique ?

Poliorcetics

Oui :) Mon message a été coupé, j’avais un peu plus précisé, désolé :(

Avec l’idée du pile ou face ? Ou des boules dans une urne ? C’est comme ça que c’est enseigné en mathématiques au collège/lycée, quand les probabilités sont plus instinctives que complètement calculatoires.

Poliorcetics

Je ne parle pas d’un exemple, mais vraiment en termes de langage : la manière moderne de faire des tirages aléatoires est un poil complexe, comment l’introduire simplement ? Parce que je ne vois pas comment expliquer ça à un débutant, par exemple :

std::random_device r;

std::default_random_engine e1(r());
std::uniform_int_distribution<int> uniform_dist(1, 6);
int n = uniform_dist(e1);

Comment expliquer de manière simple ? Est-ce que ça vaut le coup ?

+0 -0

Je ne suis pas sûr que ça vaille le coup. La version simplificatrice serait de dire :

  • j’ai une phase d’initialisation, les paramètres sont les bornes de l’intervalle : 1 et 6, ne cherchez pas à comprendre le reste ;
  • ensuite je tire des nombres avec tel appel.

Après, la vraie explication n’est pas extrêmement compliquée non plus :

  • les programmes utilisent usuellement des générateurs de nombres pseudo-aléatoires, durs à différencier d’un vrai aléatoire (pour les meilleurs en tout cas), pour raisons de praticité et de performance ;
  • les générateurs sont déterministes, mais imprévisibles sans connaître exactement la manière dont le générateur a été initialisé, ce qui est faisable avec différentes astuces qui font du vrai aléatoire, mais sont coûteuses en ressources (mais on ne le fait qu’une fois !) ;
  • la sortie brute du générateur n’est pas adaptée en général à un usage immédiat et est modelée pour un usage spécifique (selon une certaine distribution), sans perdre le caractère pseudo-aléatoire.

Avec ces quelques points, tu couvres grossièrement tes 4 lignes de code.


Quand j’ai appris à programmer (en C à l’époque), ça ne m’avait pas paru plus compliqué que ça. Juste un peu confus sur le fait qu’il ne fallait pas renouveler la graine à chaque fois, mais de bonnes explications permettent de s’en sortir.

+3 -0

Cela me rappelle des discussions au sujet de l’enseignement du C++ où justement une question fort similaire était posée.

Pour des purs newbs, dans une sessions de TP en fac/école, je serai presque d’avis de fournir des fonctions utilitaires à la façon de ce que j’ai vu dans un code de benchmark de C. Chandler dans un cppcon -> RNG<int>(10, 6, 15) qui génère 10 nombres de façon aléatoirement uniforme entre 6 et 15 — quitte à le libérer en BSL pour qu’ils puissent en profiter ultérieurement.

Pour des niveau plus avancés ou qui devront être totalement autonomes, là oui, il faut détailler un chouilla plus.

Salut à tous.

Après quelques temps de pause, on reprend la rédaction avec la partie III. Le premier chapitre est prêt, pas le reste. Voici le plan que nous comptons suivre mais qui ne se voit pas encore sur le tutoriel actuellement.

  1. Chapitre récapitulatif, avec bonnes pratiques, etc.
  2. Lire la documentation. Avec plusieurs exemples et exercices.
  3. Écrire la documentation. On présente l’installation de Doxygen, comment on l’utilise sur Visual Studio et Qt Editor. Parler aussi de la version Visual Studio de générer la documentation. Voir si séparé ou fusionné avec le 2.
  4. Comment débugger ? Exemples pas-à-pas.
  5. Comment installer des bibliothèques externes. Donner un exemple concret. Boost ?
  6. La compilation. Différence Debug / Release. Bibliothèque statique / dynamique. Partager son programme.
  7. Partager. Introduction rapide à git, au partage de code sur Internet, etc. Introduction rapide, on ne parle pas d’un guide complet.
@informaticienzero

Merci d’avance à tous pour vos retours. :)


Bonjour les agrumes !

La bêta a été mise à jour et décante sa pulpe à l’adresse suivante :

Merci d’avance pour vos commentaires.

Une nouvelle mise en bêta avec le début du chapitre sur la documentation. Il y a énormément à dire dedans, alors n’hésitez pas à me faire des retours pour savoir si vous le trouvez clair. Merci d’avance à tous.


Bonjour les agrumes !

La bêta a été mise à jour et décante sa pulpe à l’adresse suivante :

Merci d’avance pour vos commentaires.

Bonjour les agrumes !

La bêta a été mise à jour et décante sa pulpe à l’adresse suivante :

Au programme : la réécriture quasi complète du guide de résolution, comme c’était prévu. Le résultat me satisfait beaucoup plus que la première mouture, dites-moi ce que vous en pensez. On a aussi fait quelques corrections par-ci par-là en vue de la validation.

Les deux derniers chapitres de la seconde partie vont être envoyés en validation de manière imminente, puis on se reconcentrera sur la suite.

Merci d’avance pour vos commentaires.

+0 -0

Bonjour,

Partie III - 1 - La programmation fonctionnelle

std::transform(std::begin(nombres), std::end(nombres), std::begin(nombres), [](int nombre) -> int
{
    return nombre * nombre; 
});

Il serait peut-être intéressant d’envoyer le lecteur vers la page de la doc (sans détailler pour éviter le HS) ou tout du moins utiliser std::for_each

Lorsque vous parlerez de constexpr, il faudrait parler de cette syntaxe pour une plus grande souplesse:

template <typename T>
constexpr T foo = T(3.141592); //permet d'utiliser foo<int>, foo<float>, etc...

PS: j’éditerais si j’ai d’autres remarques
En espérant aider l’avancement du tutoriel. :D

Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte