IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C# Discussion :

Faire passer la main au joueur suivant après un temps d'exécution donné


Sujet :

C#

  1. #1
    Membre actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2012
    Messages
    345
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2012
    Messages : 345
    Points : 249
    Points
    249
    Par défaut Faire passer la main au joueur suivant après un temps d'exécution donné
    Bonjour,

    je dois concevoir le jeu Puissance4 en projet, j'arrive à une question où il est demandé d'organiser un jeu où le temps de réponse est limité. c'est à dire que si le temps de jeu du joueur1 est de 5000ms, ça sera au tour du joueur2 de jouer après les 5s que le joueur 1 ait joué ou pas. le jeu en lui-même fonctionne déjà bien mais je n'arrive pas intégrer cette contrainte.

    Pour cela, je dois rajouter un attribut
    int temps
    à la

    classe JoueurMCTS (La classe JoueurMCTS dérivée de la classe Joueur met en oeuvre l’algorithme MCTS pour un nombre d’itérations fixé. L’attribut float a est un paramètre positif qui intervient pour le choix du coup le plus prometteur lors de la phase de sélection.)
    qui doit correspondre au temps (en millisecondes) de réponse de la méthode Jouer et changer le constructeur de ma classe joueurMICTS comme ceci
    JoueurMCTS(float a, int temps)
    .

    J'ai modifié ma méthode Jouer comme ci-dessous mais cela ne fonctionne pas, à vrai dire, je ne sais pas comment faire, j'ai bidouillé ceci en ayant découvert les thread.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
     
     
    public override int Jouer(Position p)
     {
                    Thread th = Thread.CurrentThread;
                    bool fini = th.Join(temps);
     
                    racine = new Noeud(null, p);
                    while(fini)
                    {
                        // Sélection
                        Noeud no = racine;
                        do
                        {
                            no.CalculMeilleurFils(a);
                            no = no.MeilleurFils();
                        } while (no.fils.Length > 0 && no.cross > 0);
                        // Simulation
                        Resultat res = JeuHasard(no.p);
                        int re = p.j1aletrait ? 0 : 1;
                        if (res == Resultat.j1gagne) { re = 1; }
                        if (res == Resultat.j0gagne) { re = 0; }
                        // Rétropropagation
                        while (no != null)
                        {
                            no.cross += 1;
                            no.win += re;
                            no = no.pere;
                        }
                    }
                    racine.CalculMeilleurFils(a);
                    Console.WriteLine(racine);
                    return racine.indiceMeilleurFils; ;
    }
    Merci d'avance pour votre aide,

    Cordialement

  2. #2
    Membre actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2012
    Messages
    345
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2012
    Messages : 345
    Points : 249
    Points
    249
    Par défaut
    Bonjour,

    Personne pour m'apporter de l'aide ?

    😕

  3. #3
    Membre expert Avatar de jopopmk
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2011
    Messages
    1 856
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2011
    Messages : 1 856
    Points : 3 570
    Points
    3 570
    Par défaut
    Salut,

    je ne suis pas sûr que Thread.Join soit ce que tu cherches, ni même que tu aies besoin des threads.
    Perso ce que je ferais dans la fonction Jouer :

    * avant le bloc while(!fini) :
    - positionner fini à false,
    - prendre l'heure courante à la ms près (que j'appellorio baseDate),

    * à la fin du bloc while(!fini) :
    - reprendre l'heure courante à la ms près (que j'appellerai iterDate),
    - si (iterDate - baseDate) > temps alors je positionne fini à true.

    edit : je pars du principe que tu veux limiter le nombre d'itérations d'un while par une durée donnée, je n'ai pas considéré ton implémentation/besoin réel.

  4. #4
    Membre chevronné
    Homme Profil pro
    edi
    Inscrit en
    Juin 2007
    Messages
    905
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : edi

    Informations forums :
    Inscription : Juin 2007
    Messages : 905
    Points : 1 923
    Points
    1 923
    Par défaut
    Y a-t-il une contrainte qui empêche d'utiliser un Timer ?

  5. #5
    Expert éminent sénior

    Avatar de François DORIN
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juillet 2016
    Messages
    2 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2016
    Messages : 2 761
    Points : 10 543
    Points
    10 543
    Billets dans le blog
    21
    Par défaut
    Bonjour,

    Si j'ai bien compris le problème, l'approche choisi actuellement n'est effectivement pas bonne. Au delà de la mauvaise utilisation de Thread.Join, c'est sa position dans le code : il est situé dans la méthode Jouer qui appelée une fois que le joueur a fait son mouvement (et ensuite dans cette méthode tu essaies de vérifier si le délai est dépassé ou pas).

    Aussi, ce n'est la bonne approche. Tu l'as bien compris, il faut réussir à attendre la survenue d'un événement (le premier) parmi plusieurs (le joueur joue, délai dépassé). Pour cela, il y a typiquement plusieurs approches possibles :
    • ou bien faire une boucle qui scrute à un rythme plus ou moins important les changements d'états dans ton jeu ;
    • ou bien utiliser des tâches.


    Ici, je serais tenté par utilisé l'approche multitâche. Tu peux créer deux tâches, une pour faire jouer le joueur, une autre pour vérifier le délai) et ensuite te mettre en attente de la terminaison d'une des tâches (via un Task.WaitAny par exemple ou Task.WhenAny). Dès qu'une tâche a terminé son exécution, tu peux annuler les autres tâches en cours (ici, il n'y en a qu'une) et continuer l'exécution du programme.

    Tu peux aller jeter un oeil sur les articles que j'ai écrit concernant l'utilisation du pool de theads, et particulièrement [URL=http://fdorin.developpez.com/tutoriels/csharp/threadpool/part2/]le second [/C] qui traite justement de la manière de chaîner les tâches entre elles, c'est-à-dire de lancer une tâche dès qu'une autre a terminé son exécution.

Discussions similaires

  1. [PPT-2010] Passer automatiquement au slide suivant après une animation
    Par wilkorcv dans le forum Powerpoint
    Réponses: 0
    Dernier message: 07/02/2013, 14h01
  2. [XSL] passer sur le tableau suivant apres X lectures
    Par zejo63 dans le forum XSL/XSLT/XPATH
    Réponses: 18
    Dernier message: 13/07/2007, 17h53
  3. Réponses: 2
    Dernier message: 22/10/2004, 06h50
  4. Réponses: 5
    Dernier message: 08/03/2004, 10h28

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo