Bonjour,
Présentation
Je me présente rapidement afin que vous sachiez quand même de quoi il retourne :
- Je suis actuellement un (grand) débutant en programmation et en informatique en général
- J'ai 16 ans et des brouettes si ça n'a pas encore changé, j'adore les maths, la physique et la création de tous pleins de trucs utiles ou pas du tout
- Je me suis lancé dans la programmation en juin dernier environ, quand Apple a présenté Swift. Après cela j'ai regardé partout où je le pouvais afin de voir ce qui me plaisait vraiment et surtout dans le but de commencer par un langage déjà bien travaillé, pour avoir des ressources en français et en anglais de qualité
- J'ai récemment décidé de regarder du côté de la sécurité logicielle et du libre (dès que je saurais le faire je compte contribuer à des projets comme ZdS )
- J'ai tout d'abord regardé Python (proche de Swift mais plus ancien et avec plus de ressources disponibles sur le Net) mais j'ai finalement décidé il y a peu de commencer par le C, afin de m'attaquer tout d'abord aux bases pour faciliter l'apprentissage d'un langage OO ensuite
J'ai pris, pour apprendre le C, un cours de référence parmi la communauté française : celui disponible en ligne sur OpenClassrooms.
Après avoir lu de nombreux articles (principalement sur ce site d'ailleurs !) sur la lisibilité d'un code source, sa logique et tout le barda, j'ai décidé qu'il était temps de savoir si je partais dans la bonne direction à ce sujet.
Dans le cadre de code qui se trouve au paragraphe Ma Solution, vous trouverez donc le code source en C de l'exercice proposé ici.
Énoncé
Voici l'énoncé dans son intégralité, afin de vous éviter la relecture de l'ensemble de la page d'OpenClassroms plusieurs fois
Le principe du programme
Principe de base
- L'ordinateur tire au sort un nombre entre 1 et 100.
- Il vous demande de deviner le nombre.
- Vous entrez donc un nombre entre 1 et 100.
- L'ordinateur compare le nombre que vous avez entré avec le nombre « mystère » qu'il a tiré au sort. - Il vous dit si le nombre mystère est supérieur ou inférieur à celui que vous avez entré.
- Puis l'ordinateur vous redemande le nombre.
- Et il vous indique si le nombre mystère est supérieur ou inférieur.
- Et ainsi de suite, jusqu'à ce que vous trouviez le nombre mystère.
Améliorations possible
- Faites un compteur de « coups ». Ce compteur devra être une variable que vous incrémenterez à chaque fois que vous passez dans la boucle. Lorsque l'utilisateur a trouvé le nombre mystère, vous lui direz « Bravo, vous avez trouvé le nombre mystère en 8 coups » par exemple.
- Pouvoir faire plusieurs parties de suite. Lorsque l'utilisateur a trouvé le nombre mystère, le programme s'arrête. Pourquoi ne pas demander s'il veut faire une autre partie ?
- Implémentez un mode 2 joueurs ! Attention, je veux qu'on ait le choix entre un mode 1 joueur et un mode 2 joueurs !
- Créez plusieurs niveaux de difficulté. Au début, faites un menu qui demande le niveau de difficulté. Par exemple :
- 1 = entre 1 et 100 ;
- 2 = entre 1 et 1000 ;
- 3 = entre 1 et 10000.
Le but du jeu, bien sûr, est de trouver le nombre mystère en un minimum de coups.
Ma solution
J'ai mis en place toutes les améliorations proposées.
De plus tout est en anglais (je me force à le faire) mais je ne suis pas sur que tout soit parfaitement correct.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 | // // main.c // LessOrMore // // Created by Poliorcetics on 08/02/2015. // Copyright (c) Poliorcetics. All rights reserved. // #include <stdio.h> #include <stdlib.h> #include <time.h> // for the random int main(int argc, const char * argv[]) { // Initialization of random srand(time(NULL)); // Initialization of constants const int MIN = 1; // MIN constant, for the range // Initialization of variables int continuePlaying = 0; // Used as a boolean (default = 0) int numberOfPlayer = 1; // The number of player (1 or 2, default = 1) int searchedNumber; // The number to found int typedNumber; // The number the player enter in the shell int numberOfTests = 0; // The number of tests to find the mysterious number int difficulty = 1; // The difficulty of the game (default = 1) int maximumNumber = 100; // The maximum number of the range (default = 100) // MAIN GAME LOOP do { // Introduce the game in the shell printf("=== Less Or More Game ===\n\n"); // Choice of the difficulty printf("-- Difficulty --\n"); printf("1. Mysterious number is in range [1;100]\n"); printf("2. Mysterious number is in range [1;1000]\n"); printf("3. Mysterious number is in range [1;10000]\n"); printf(">> To choose a difficulty, enter 1, 2 or 3.\n"); // Loop for the choice of the difficulty do { printf("Choose a difficulty (1, 2 or 3): "); scanf("%d",&difficulty); // Initialization of the 'maximumNumber' of the range continuePlaying = 1;// Go out of the loop if the user doesn't enter // an invalid number switch (difficulty) { case 1: maximumNumber = 100; break; case 2: maximumNumber = 1000; break; case 3: maximumNumber = 10000; break; default: printf("You choose a wrong difficulty, choose again.\n"); continuePlaying = 0; // The user finally make a mistake break; } } while (continuePlaying == 0); //Select the number of player(s) // Display printf("\n-- Number of Player --\n"); // Choice do { // Display to select printf("Please, select a number of player (1 or 2) :\n"); scanf("%d", &numberOfPlayer); // Result of the selection switch (numberOfPlayer) { case 1: case 2: continuePlaying = 1; break; default: printf("ERROR: the selected number of player is wrong.\n"); continuePlaying = 0; break; } } while (continuePlaying == 0); if (numberOfPlayer == 2) { // Display printf("\n-- Two Players Mode --\n"); printf("Player One : enter the secret number (in range [%d;%d]): ", MIN, maximumNumber); // Initialization of searchedNumber scanf("%d",&searchedNumber); // To hide the secret number to the second player for (int i = 0; i < 1000; i++) { printf("\n"); } } else // numberOfPlayer == 1 { // Display printf("\n-- Single Player Mode --\n"); printf("Calculation of the mysterious number ..."); // Initialization of 'searchedNumber' searchedNumber = (rand() % (maximumNumber - MIN + 1)) + MIN; // printf("\n%d\n",searchedNumber); // Uncomment if you want the solution in 'One Player Mode' } // Rules of the Game // Displayed every new turn. printf("\n-- Rules --\n"); printf("1. The game (or the first player) will create a mysterious \ number.\n"); printf("2. The game will ask you to enter a number.\n"); printf("3. This number MUST BE include in the selected range [%d;%d]." , MIN, maximumNumber); printf("\n4. This number MUST BE an integer.\n"); printf("5. If the number you type is in range and is higher \ than the mysterious number, the game will say \"That's less !\", else it will \ say \"That's more !\".\n"); printf("6. You have to find the mysterious number with a minimum \ number of test.\n"); // Display in the shell (for fun) printf("\nHave Fun !\n\n"); printf("-- Game --\n"); // If numberOfPlayer == 2, we announced that it's now to the second // player to play if (numberOfPlayer == 2) { printf("\nSecond Player, it's your turn !\n"); } // Beginning of a turn do { // Increment of 'numberOfTests' numberOfTests++; // The player is invited to enter a number printf("Please, enter an integer between %d and %d included : ", MIN, maximumNumber); scanf("%d",&typedNumber); // The number IS NOT in range if (typedNumber > maximumNumber) { printf("ERROR : The number you entered is too high.\n"); } else if (typedNumber < MIN) { printf("ERROR : The number you entered is too low.\n"); } // The number IS in range else { // Verification of 'typedNumber' if (typedNumber < searchedNumber) { printf("That's more !\n"); } else if (typedNumber > searchedNumber) { printf("That's less !\n"); } else // typedNumber == searchedNumber // End of the Game { printf("\n>>> YOU WIN ! CONGRATULATIONS ! <<<\n"); printf("You've made %d test(s) to find the mysterious \ number, which was %d.\n", numberOfTests, searchedNumber); } } } while (typedNumber != searchedNumber); // End of a turn if typedNumber == searchedNumber // Ask the current player to know if he wants to play again printf("\nDo you want to play again ? (Enter 0 to quit, enter any \ number to play again)\n"); scanf("%d", &continuePlaying); printf("\n\n"); } while (continuePlaying !=0); // END OF THE MAIN GAME LOOP // Notes printf("-- Notes -- \n"); printf("Game made by Poliorcetics.\n"); printf("Version : 4.0.1\n\n"); return 0; } |
Voici mes questions :
1. Est-ce que ce code est compréhensible, commentaires inclus ?
2. La logique adoptée au niveau rédaction est-elle viable (toujours mettre des {}
par exemple, même pour une seule instruction) ?
3. La logique utilisée pour résoudre le problème est-elle juste elle aussi (je sais qu'il existe plusieurs solutions, j'aimerais surtout savoir si j'ai fait des choses totalement inutiles ) ? Pour cette question, prenez en compte le fait que les fonctions, j'en ai entendu parler mais je ne sais pas encore les faire .
4. La question subsidiaire* Pour ceux qui auront eu le courage de le copier/compiler : tourne-t-il correctement chez vous ?
Voilà, j'ai enfin tout dit, merci d'avance à vous tous !