Rudiment C# - déclarer et utiliser une fonction alléatoire allant de 0 à 6 sur X

Signaler
Messages postés
7
Date d'inscription
dimanche 3 juin 2012
Statut
Membre
Dernière intervention
3 juin 2012
-
Messages postés
1540
Date d'inscription
lundi 26 mai 2003
Statut
Membre
Dernière intervention
1 août 2013
-
[b]Je ne connais pas le thème de mon post.
Il s'agit ici de mon troisième programme en 4 semaines.
Je suis totalement néophyte et en auto-formation
Je ne possède donc pas encore totalement le vocabulaire nécessaire pour classer mon post correctement./b

Après mon premier programme "hello world!" j'ai réussis à en créer un deuxième calculant la commande d'articles,la remise et les frais de port dans le cadre de ma formation AFPA en développeur logiciel niveau III qui a débuté le 9 mai dernier.("Hello world! donc");

[b]Mon PDF de formation datant de 2008, il m'apprend beaucoup d'erreurs (exemple parmi d'autres: le caractère $ peut être utilisé pour la nomination d'un namespace ou d'une variable--->c'est faux!
La nomination ne prend en compte que les caractères de a à z , de A à Z ,le caractère underscore _ , et enfin les chiffres de 0 à 9 avec condition toute fois de ne pas commencer la nomination par un chiffre.Ainsi on ne peut pas nommer un namespace ou une variable 0cacachuètte ou 22VoilaLaPolice mais nous pourrons l’appeler cacahuètte0 ou cacahuet0te.)
/b
--j'ai cherché le PascalCode sur wikipedia du coup---

Ainsi donc, mon PDF contient de multiples exemples d'inductions en erreurs qu'il me prendrait des pages à vous citer.

Alors je suis sorti du sentier mal battu par mon établissement de formation pour me former solo, et me suis intéressé à "comment rentrer une valeur aléatoire et lui donner une fonction?"
J'ai donc développé un jeu de dés traditionnel chinois avec un bol (ouai enfin, en console quoi, un bol vite fait).
c'est mon 3eme programme à tourner correctement.
Je n'en comprend pas moi-même la totalité du code aussi ai-je commenté ce que je savais avec //


Voici le code inachevé et incorrect du jeu en question et mes questions en-suites si vous le voulez bien:




using System;
using System.Collections.Generic;
using System.Linq;
using System.Text; // J'appel mes bibliothèques

namespace ConsoleApplication2
{
class Program
{
static void Main(string[] args) //je définis ma fonction Main
{

//Je déclare mes variables ici
int nb1 = 0;
int nb2 = 0;
int nb3 = 0;
int nb4 = 0;
int louper = 0;
string enter = "";
string saisie = "";


//je définis les paramètres d'affichage de ma console
Console.SetWindowSize(50, 15);
Console.Title = "Jeux du Chichorin";
Console.CursorVisible = false;
Console.BackgroundColor = ConsoleColor.White;
Console.ForegroundColor = ConsoleColor.Black;

Random rnd = new Random(); //Je définis ma variable aléatoire je sais pas trop comment...(mal compris)

while (enter == "") //Je crée une boucle pour que mon programme se ré-éxécute à la fin de sa première exécution si on appuie sur Entrée
{

for (int i = 0; i < 1000; i++) //for c'est pour la boucle aussi mais j'ai pas bien compris pourquoi et comment je l'utilisais car mon PDF est vraiment très mal expliqué
{
nb1 = rnd.Next(0, 6);
nb2 = rnd.Next(0, 6);
nb3 = rnd.Next(0, 6);
nb4 = rnd.Next(0, 8);//augmenter la valeur 8 pour diminuer le % de tirs en dehors du bol. Je sais pas pourquoi, je l'ai juste remarqué en testant mon programme mais c'est toujours bon à prendre ^^

Console.Clear(); //si j'ai bien compris ça éfface de la mémoire tampon de la console et de la fenêtre de console correspondante les informations d'affichage.


//ici,je "dessine" mon bol et l'affiche avec les 3 dés dedans

Console.WriteLine("\n\t\t / \");
Console.WriteLine("\t\t( )");
Console.WriteLine("\t\t \\ /");
Console.WriteLine("\t\t \\ [" + nb1 + "] [" + nb2 + "] [" + nb3 + "] /");
Console.WriteLine("\t\t \\_____________/\n\n\n");

}


//ici,je déclare mes conditions if,if else,if else,if else, else

if (nb1 == 0)
{
if (nb4 == 0)
{
louper = 1;
}
else
{
nb1 = rnd.Next(1, 6);
}
}
if (nb2 == 0)
{
if (nb4 == 0)
{
louper = 1;
}
else
{
nb2 = rnd.Next(1, 6);
}
}
if (nb3 == 0)
{
if (nb4 == 0)
{
louper = 1;
}
else
{
nb3 = rnd.Next(1, 6);
}
}
Console.Clear();
if (louper == 1)
{
Console.WriteLine("\n\n");
Console.WriteLine("\n\n Un dé est tombé à coter du bol. Sois pas deg'\n");
louper = 0;
}
Console.WriteLine("\n * Touche [1] pour lire les règles\n\n\t / \");
Console.WriteLine("\t ( )");
Console.WriteLine("\t \\ /");
Console.WriteLine("\t \\ [" + nb1 + "] [" + nb2 + "] [" + nb3 + "] /");
Console.WriteLine("\t \\_____________/\n\n\n");


//if (nb1 ? && nb2 ? && nb3 == ?)
//{
//}

//else if (nb1 ? && nb2 ? && nb3 == ?)
//{
//}

//else if (nb1 ? && nb2 ? && nb3 == ?)
//{
//}

//else if (nb1 ? && nb2 ? && nb3 == ?)
//{
//}

//else if (nb1 ? && nb2 ? && nb3 == ?)
//{
//}

//else if (nb1 ? && nb2 ? && nb3 == ?)
//{
//}

//else if (nb1 ? && nb2 ? && nb3 == ?)
//{
//}

//else if (nb1 ? && nb2 ? && nb3 == ?)
//{
//}

//else (nb1 ? && nb2 ? && nb3 == ?)
//{
//}

Console.WriteLine(" * Touche [Entrée] pour relancer les dès");
enter = Console.ReadLine();


}
}
}
}
______________________________________________________________________________________________________________________________________________________

J'ai donc déclaré ma variable string saisie = "";

Afin de récupérer la saisie de l'utilisateur suite à un
Console.WriteLine(" *Touche [1] pour lire les règles");
Console.ReadLine();
saisie = 1;

Mais je ne sais pas comment intégrer ça à mon code

Donc je me demande:
-Mon code est-il bon?

-Que n'ai-je pas compris au niveau des boucles et des conditions?

-Comment intégrer l'affichage des règles sur pression de la touche [1] sans que ça dérange le reste de l'affichage du programme?

-Et comment fonctionne ma variable:
Random rnd = new Random();
avec:
rnd.Next
?

4 réponses

Messages postés
7
Date d'inscription
dimanche 3 juin 2012
Statut
Membre
Dernière intervention
3 juin 2012

Merci d'avance de votre aide
Messages postés
1860
Date d'inscription
lundi 28 novembre 2005
Statut
Modérateur
Dernière intervention
14 février 2015
43
Salut

Voici mes remarques :
using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; // J'appel mes bibliothèques
Il ne s'agit pas d'un appel de bibliothèques. L'appel se fait via les références de ton projet. Les using ne servent qu'à simplifier l'écriture en t'évitant de taper à chaque fois le namespace de ta classe.
Exemple, normalement tu devrais taper System.Random, mais comme tu as fait "using System", il va accepter que tu ne tapes que Random.

int louper = 0;
D'après ce que je vois, louper n'a comme valeur que 0 ou 1 et de sert à voir si tu as loupé ton coup. Dans ce cas, le type approprié n'est pas "int" mais "bool", qui accepte comme valeur "false" (ce par quoi tu remplace tes 0) et "true" (ce par quoi tu remplaces tes 1). De plus, ta variable n'a pas de raison de porter comme nom l'infinitif du verbe. Ce serait mieux de l'appeler "loupé", sauf que les accents sont déconseillés. Donc "loupe".

Random rnd = new Random(); //Je définis ma variable aléatoire je sais pas trop comment...(mal compris)
Random n'est pas un nombre aléatoire, mais un générateur de nombre aléatoire. Ici, tu crées ton générateur, et quand tu fais rnd.Next(x, y), ça te génère un nombre aléatoire entre x (inclus) et y (exclus).

nb4 = rnd.Next(0, 8);//augmenter la valeur 8 pour diminuer le % de tirs en dehors du bol. Je sais pas pourquoi, je l'ai juste remarqué en testant mon programme mais c'est toujours bon à prendre ^^ 
Si tu regardes tes conditions, les seuls cas où tu rates ton coup, nb4 est à 0. Dans cette ligne, tu définis que nb4 est compris entre 0 (inclus) et 8 (exclus). Tu as donc un risque sur 8 de POUVOIR rater ton coup (je dis bien pouvoir, car ça ne se base pas uniquement là dessus). Evidemment, si tu remplaces par rnd.Next(0, 1000), tu as un risque sur 1000. Donc plus le nombre est grand, plus tu as de chances de ne pas pouvoir rater ton coup.

Console.Clear(); //si j'ai bien compris ça éfface de la mémoire tampon de la console et de la fenêtre de console correspondante les informations d'affichage.
Là, c'est très simple. Console.Clear() efface tout ce que tu as dans la console et te replace en haut à gauche.


Concernant l'aide, inutile de faire une variable saisie, puisqu'il y a déjà la variable enter.

Tu remplaces
Console.WriteLine(" * Touche [Entrée] pour relancer les dès"); 
enter = Console.ReadLine(); 
par
do
{
    Console.WriteLine(" * Touche [Entrée] pour relancer les dès"); 
    Console.WriteLine(" * Touche [1] pour lire les règles");
    enter = Console.ReadLine();
    if (enter == "1")
    {
        // Affichage des règles
    }
} while (enter == "1");


for (int i = 0; i < 1000; i++) //for c'est pour la boucle aussi mais j'ai pas bien compris pourquoi et comment je l'utilisais car mon PDF est vraiment très mal expliqué
Je ne comprends pas trop l'intérêt de cette boucle (mais je ne comprends pas exactement ton jeu non plus). Ta boucle va te faire lancer 1000 fois les 3 dés à chaque fois que tu appuies sur Entrée.

nb1 = rnd.Next(1, 6);
Tu indiques à plusieurs endroits qu'il s'agit de dés. Si ce sont des dés à 6 faces, il faut remplacer par rnd.Next(1, 7), puisque la valeur maximum n'est pas inclue.

Lors de tes conditions, tu fais
if (quelque chose)
{
    if (nb4 == 0)
    {
        louper = 1;
    }
    else
    {
        quelque chose
    }
}

Tu peux rendre ton code plus lisible ainsi (j'ai aussi remplacé le nom par "loupe" et son type par "bool")
if (nb4 == 0)
{
    if (nb1 0 || nb2 0 || nb3 == 0) // Le symbole || correspond à "ou"
    {
        loupe = true;
    }
}
else
{
    if (nb1 == 0)
    {
        nb1 = rnd.Next(1, 7);
    }
    if (nb2 == 0)
    {
        nb2 = rnd.Next(1, 7);
    }
    if (nb3 == 0)
    {
        nb3 = rnd.Next(1, 7);
    }
}


Krimog : while (!(succeed = try())) ;
- Nous ne sommes pas des décodeurs ambulants. Le style SMS est prohibé. -
Messages postés
1540
Date d'inscription
lundi 26 mai 2003
Statut
Membre
Dernière intervention
1 août 2013
12
Salut,[list]
[*] de la qualité du code :
- côté forme, ton code n'est pas indenté, pas simple à lire,
- ne connaissant pas le fonctionnement recherché je peux pas trop parler du fond, si ce n'est que je comprends pas ta boucle for 1000,
- je ne vois pas pourquoi tu dessines ton bol dans cette boucle alors que tes tests conditionnels sont pas encore fait, un souci de copier/coller des exo m'est avis,
- tu n'as pas de touche d'échappement pour arrêter le jeu, ça s'arrête pour n'importe quelle touche hors "Entrée" (et donc impossibilité de capturer le [1] pour afficher les règles),
- tu devrais pas afficher en noir sur blanc, ça arrache les yeux ^^

[*] de la boucle générale d'un programme :
ta boucle semble correcte (le while, pas le for 1000), mais comme dit plus tôt ta condition n'est pas suffisante pour capturer les différentes saisies acceptées. Je te propose de boucler plutôt sur un truc comac :
while (enter.ToLower() != "q") {
    if (enter.ToLower() == "j") {
        // le code du tirage au sort + l'affichage du bol
    } else if (enter.ToLower() == "i") {
        // le code d'affichage des règles
    } else {
        // si la touche ne correspond à rien,
        // * soit on quitte le programme avec break de la boucle
        // * soit on informe gentiment l'utilisateur de sa bêtise, à la manière de l'affichage des règles
    }
}


Avec "q" correspondant à la touche à taper pour quitter le jeu (plus une petite astuce au cas où le "q" serait saisi en majuscule), "j" pour (re)jouer et "i" pour obtenir les info

[*] de l'affichage des règles :
C'est exactement comme l'affichage du bol : tu Clear(), tu Write() les règles, et tu ReadLine() la nouvelle saisie de l'utilisateur ("q", "j", ou "i" dans mon exemple).

[*] du fonctionnement des nombres pseudo-aléatoires :
Ton utilisation de Random est correcte. Pour plus de détail tu peux regarder la fiche MSDN de la classe Random (tu peux notamment initialiser ton objet avec un seed (entier) pour plus d'aléa).
/listBon apprentissage


PS : $ ne sert pas en C#, c'est pas une doc sur le PHP que tu as ?
Messages postés
1540
Date d'inscription
lundi 26 mai 2003
Statut
Membre
Dernière intervention
1 août 2013
12
Tiens ! ça t'apprendra à pas indenter ton code : deux pavés à lire pour le prix d'un