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

Java Discussion :

Tour par tour chronométré


Sujet :

Java

  1. #1
    Expert éminent Avatar de kain_tn
    Homme Profil pro
    Inscrit en
    Mars 2005
    Messages
    1 564
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 564
    Points : 7 289
    Points
    7 289
    Par défaut Tour par tour chronométré
    Bonsoir à tous,

    Dans le cadre d'un projet de jeu, je voudrais gérer du tour par tour minuté:
    chaque tour a une durée maximale de X secondes, et il peut être écourté si le joueur décide de terminer/passer son tour.

    Est-ce que vous connaitriez une façon de faire ça? Dois-je utiliser des Thread? Des Timer?

    Autre chose, existe-t'il une façon de le faire avec du temps réel?


    Merci d'avance!
    Copier c'est copier; voler c'est vendre un CD une vingtaine d'euros!


    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    #include <stdio.h>
     
    int main(int argc, char **argv) {
     
        printf("So long, and thanks for the fish, Dennis...\n");
        return 0;
    }

  2. #2
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 551
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 551
    Points : 21 607
    Points
    21 607
    Par défaut
    Citation Envoyé par kain_tn Voir le message
    Est-ce que vous connaitriez une façon de faire ça? Dois-je utiliser des Thread? Des Timer?
    C'est une question vaste, Timer et contrôle actif sont deux méthodes correctes, suivant ce que tu fais. Il nous faut plus de contexte.

    Citation Envoyé par kain_tn Voir le message
    Autre chose, existe-t'il une façon de le faire avec du temps réel?
    La poudre aux yeux avec de faux termes techniques ne remplacera jamais le fait de dire ce qu'on veut dire.
    On ne va pas pouvoir te conseiller si on comprend pas la question.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Expert éminent Avatar de kain_tn
    Homme Profil pro
    Inscrit en
    Mars 2005
    Messages
    1 564
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 564
    Points : 7 289
    Points
    7 289
    Par défaut
    Citation Envoyé par thelvin Voir le message
    C'est une question vaste, Timer et contrôle actif sont deux méthodes correctes, suivant ce que tu fais. Il nous faut plus de contexte.
    Ok. Admettons qu'il y ait un serveur de jeu (de stratégie genre wargame) et deux joueurs A et B qui s'affrontent.
    C'est un match en tour par tour et chaque tour dure au maximum 30 secondes.

    • C'est au tour de A de jouer: début d'un compteur de trente secondes durant lesquelles le serveur accepte les informations envoyées par A (déplacement d'unités, attaques, etc) et les exécute au fur et à mesure
    • Les trente secondes sont écoulées, c'est au tour de B et le serveur démarre un compteur de trente secondes etc...


    Je pourrais utiliser un Timer avec une période de trente secondes et lire alternativement les informations envoyée par A puis par B etc...

    Le souci survient quand je veux permettre à un joueur qui a accompli toutes ses actions de "terminer" son tour (donc de raccourcir la durée du tour courant). Là, le coup du Timer ne fonctionne plus...

    Je ne sais pas si c'est plus clair là?

    Citation Envoyé par thelvin Voir le message
    La poudre aux yeux avec de faux termes techniques ne remplacera jamais le fait de dire ce qu'on veut dire.
    On ne va pas pouvoir te conseiller si on comprend pas la question.
    De la poudre aux yeux? Eh bien par "temps réel", je veux dire "temps réel dur". J'avais lu il y a un moment qu'il existait une spécification Java qui permettait de faire du temps réel dur (à condition que le système d'exploitation le permette également).
    Pour résumer, je ne veux pas qu'un tour sont prolongé parce que le garbage collector bloque ma tache ou parce qu'il y a une autre tache plus prioritaire sur ma VM...


    Voilà voilà.
    Merci à tous ceux qui ont pris le temps de me lire
    Copier c'est copier; voler c'est vendre un CD une vingtaine d'euros!


    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    #include <stdio.h>
     
    int main(int argc, char **argv) {
     
        printf("So long, and thanks for the fish, Dennis...\n");
        return 0;
    }

  4. #4
    Membre expérimenté Avatar de Ivelios
    Homme Profil pro
    Développeur Java
    Inscrit en
    Juillet 2008
    Messages
    1 031
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 031
    Points : 1 540
    Points
    1 540
    Par défaut
    Avec un Timer Swing ça se fait très simplement
    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
    int joueurCourant = 0;
     
    //...
     
    Timer t = new Timer(30000,new ActionListener(){//30secondes
     
        public void actionPerformed(ActionEvent e) {
    //Changement de joueur
            if(joueurCourant == 0){
                joueurCourant == 1;
            }else{
                joueurCourant = 0;
            }
        }
     
    });
    t.start();
     
    //...
     
    /** Si le joueur fini son tour plus tôt que prévu, il appelle finTour */
    public void finTour(){
    //CHangement de joueur
        if(joueurCourant == 0){
            joueurCourant == 1;
        }else{
            joueurCourant = 0;
        }
        t.restart();//Remet le compteur à 0
    }
    Il était une fois [...] Et ils vécurent heureux et eurent beaucoup d'enfants!

  5. #5
    Expert éminent Avatar de kain_tn
    Homme Profil pro
    Inscrit en
    Mars 2005
    Messages
    1 564
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 564
    Points : 7 289
    Points
    7 289
    Par défaut
    Merci, ça fonctionne nickel pour ce qui est de ma première question!

    Sinon pour ce qui est du temps réel dur, une idée?
    Copier c'est copier; voler c'est vendre un CD une vingtaine d'euros!


    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    #include <stdio.h>
     
    int main(int argc, char **argv) {
     
        printf("So long, and thanks for the fish, Dennis...\n");
        return 0;
    }

  6. #6
    Membre chevronné
    Inscrit en
    Mai 2006
    Messages
    1 364
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 1 364
    Points : 1 984
    Points
    1 984
    Par défaut
    Ce qu'il faut, c'est definir l'erreur que tu estimes acceptable (si tu reponds 0, alors c'est infaisable puisque le temps d'execution de ton switch de tache introduira forcement une erreur).

    Sinon, si tu as vraiment besoin d'un systeme temps reel, alors il faut un OS temps reel (type RTAI pour linux).

    Mais il faut bien comprendre que faire du temps reel, ce n'est pas seulement installer un OS temps reel, c'est aussi reflechir à l'implementation pour qu'elle respecte ces contraintes. Or, dans ton cas, sachant qu'en plus tu utilises un reseau (IP j'imagine), ca me parait une contrainte beaucoup trop dure pour ce que tu veux faire.

    Pour donner une image plus parlante, c'est comme si tu voulais avais une route de montagne avec des virages en epingle tous les 15 metres et que tu voulais utiliser une F1 pour aller plus vite. Alors que quelque soit la voiture, c'est pas possible de monter à 300 sur ce genre de route...

  7. #7
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    155
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 155
    Points : 199
    Points
    199
    Par défaut
    Sinon, tu peux utiliser les valeurs en millisecondes donnée par System.currentTimeMillis(); si tu veux une plus grande maîtrise du temps impartit.
    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
     
     
    Socket joueurA, joueurB, joueurCourant;
    long debutTour;
     
    //initialisation
    joueurCourant = joueurB;
     
    do{
      if(joueurCourant == joueurA){
        joueurCourant = joueurB;
      }else{
        joueurCourant = joueurA;
      }
      debutTour = System.currentTimeMilllis();
      envoyerNotificationDebutTour(joueurCourant);
      while(System.currentTimeMillis()<debutTour+TEMPS_MAX_TOUR){
        message = recevoirMessage(joueurCourant);
        if(System.currentTimeMillis()<debutTour+TEMPS_MAX_TOUR){
          switch(message.type){
            //plein de choix
            case FIN_TOUR:
              debutTour = 0; // valeur qui fait sortir de la boucle;
              break;
          }
        }
      }
    }while(!finduJeu);

  8. #8
    Expert éminent Avatar de kain_tn
    Homme Profil pro
    Inscrit en
    Mars 2005
    Messages
    1 564
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 564
    Points : 7 289
    Points
    7 289
    Par défaut
    Citation Envoyé par hwoarang Voir le message
    Ce qu'il faut, c'est definir l'erreur que tu estimes acceptable (si tu reponds 0, alors c'est infaisable puisque le temps d'execution de ton switch de tache introduira forcement une erreur).

    Sinon, si tu as vraiment besoin d'un systeme temps reel, alors il faut un OS temps reel (type RTAI pour linux).

    Mais il faut bien comprendre que faire du temps reel, ce n'est pas seulement installer un OS temps reel, c'est aussi reflechir à l'implementation pour qu'elle respecte ces contraintes. Or, dans ton cas, sachant qu'en plus tu utilises un reseau (IP j'imagine), ca me parait une contrainte beaucoup trop dure pour ce que tu veux faire.

    Pour donner une image plus parlante, c'est comme si tu voulais avais une route de montagne avec des virages en epingle tous les 15 metres et que tu voulais utiliser une F1 pour aller plus vite. Alors que quelque soit la voiture, c'est pas possible de monter à 300 sur ce genre de route...
    Oui, je comprends.

    Citation Envoyé par merill Voir le message
    Sinon, tu peux utiliser les valeurs en millisecondes donnée par System.currentTimeMillis(); si tu veux une plus grande maîtrise du temps impartit.
    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
     
     
    Socket joueurA, joueurB, joueurCourant;
    long debutTour;
     
    //initialisation
    joueurCourant = joueurB;
     
    do{
      if(joueurCourant == joueurA){
        joueurCourant = joueurB;
      }else{
        joueurCourant = joueurA;
      }
      debutTour = System.currentTimeMilllis();
      envoyerNotificationDebutTour(joueurCourant);
      while(System.currentTimeMillis()<debutTour+TEMPS_MAX_TOUR){
        message = recevoirMessage(joueurCourant);
        if(System.currentTimeMillis()<debutTour+TEMPS_MAX_TOUR){
          switch(message.type){
            //plein de choix
            case FIN_TOUR:
              debutTour = 0; // valeur qui fait sortir de la boucle;
              break;
          }
        }
      }
    }while(!finduJeu);
    Merci, je vais tester ça également!
    Copier c'est copier; voler c'est vendre un CD une vingtaine d'euros!


    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    #include <stdio.h>
     
    int main(int argc, char **argv) {
     
        printf("So long, and thanks for the fish, Dennis...\n");
        return 0;
    }

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Article] Architecture globale - Tour par tour
    Par askywhale dans le forum Contribuez
    Réponses: 2
    Dernier message: 23/12/2007, 15h36
  2. Jeu de Stratégie tour par tour en Java
    Par Thommas dans le forum Général Java
    Réponses: 13
    Dernier message: 30/04/2007, 17h00
  3. [AJAX] ASOW : Jeu d'action/stratégie au tour par tour développé en AJAX
    Par Gray_Fox dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 23/04/2007, 09h54
  4. [recherche] combat au tour par tour
    Par Satch dans le forum PC
    Réponses: 4
    Dernier message: 24/08/2006, 10h32
  5. IA d'un wargame tour par tour
    Par Nyx dans le forum Intelligence artificielle
    Réponses: 5
    Dernier message: 20/02/2005, 12h07

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