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

Algorithmes et structures de données Discussion :

Position dans un classement à chaque passage de checkpoint ?


Sujet :

Algorithmes et structures de données

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre très actif
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    434
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 434
    Par défaut Position dans un classement à chaque passage de checkpoint ?
    Bonjour, je développe un jeu de course en ligne dans lequel mon serveur doit renvoyer aux joueurs la position (1er, 2e, 3e...) de tous les joueurs.

    La position sur le circuit est déterminé par des checkpoints ainsi pour le moment, dès qu'un joueur passe un checkpoint je parcours tous les joueurs pour compter le nombre de joueur qui ont déjà franchit ce checkpoint ce qui me donne la position du joueur.

    Mais il faut encore que je vérifie si un autre joueur avait déjà cette position et la modifier le cas échéant...


    Pensez vous que j'utilise la bonne méthode ou voyez vous plus simple et qui demanderait moins de calcul ?

    Merci

  2. #2
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 487
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 487
    Par défaut
    Pourquoi ne procèdes-tu pas exactement comme dans le monde réel ?

    Tu fais n objets dans un tableau correspondant à chacun de tes concurrents, tu les tries en mémoire dans l'ordre où ils sont alignés au départ, et chaque fois qu'un concurrent dépasse un autre, tu permutes les deux objets dans ton tableau. Ainsi il sera toujours trié et tu seras toujours où tu en es toi-même.

    Il est très aisé de calculer la position d'un élément dans son tableau, donc tu peux considérer cette info comme disponible pratiquement sans calcul. En outre, au moment exact où tu franchis un checkpoint, par définition, tout ceux qui sont derrière toi ne l'ont pas encore franchi, et tout ceux qui sont devant l'on déjà franchi. Ton rang est donc forcément au nombre de concurrents qui ont franchi la ligne (toi compris).

  3. #3
    Membre très actif
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    434
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 434
    Par défaut
    Ton rang est donc forcément au nombre de concurrents qui ont franchi la ligne (toi compris).
    Oui c'est ce que je disais il faut que je compte le nombre de concurrents ayant déjà franchi le checkpoint, c'est ce que j'aimerai éviter dans un soucis d'optimisation (peut etre que je chipote un peu).

    Ca me fait penser que si je crée également un tableau contenant pour chaque checkpoint le nombre de joueurs l'ayant franchi je n'ai pas besoin de reconmpter à chaque fois qu'un concurrent en passe un !



    Donc pour résumer voila la procédure:
    -création d'un tableau (A) de nConcurrent contenant la position des concurrents au départ
    -création d'un tableau (B) de nConcurrent contenant le numéro des concurrent dans l'ordre de départ
    -création d'un tableau (C) de nCheckpoint contenant le nombre de concurrents ayant franchi chaque checkpoint

    -a chaque franchissement on ajoute 1 au tableau C pour le checkpoint franchi ce qui nous donne directement la position du concurrent
    -si le concurrent change de position on récupère le concurrent dont il prend la place dans le tableau B pour inverser
    -on stocke les nouvelles positions dans le tableau A

    Je ne pense pas m'etre trompé.

    Merci

  4. #4
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 487
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 487
    Par défaut
    Je ne suis pas sûr que tu m'aies bien lu.

    Citation Envoyé par supergrey Voir le message
    Oui c'est ce que je disais il faut que je compte le nombre de concurrents ayant déjà franchi le checkpoint, c'est ce que j'aimerai éviter dans un soucis d'optimisation (peut etre que je chipote un peu).
    Non. Je disais que ta propre position dans la course est forcément égale au nombre de personnes ayant franchi le point au moment où te le franchis toi-même. Il n'y a donc aucun calcul à faire.

    Ca me fait penser que si je crée également un tableau contenant pour chaque checkpoint le nombre de joueurs l'ayant franchi je n'ai pas besoin de reconmpter à chaque fois qu'un concurrent en passe un !
    Donc pour résumer voila la procédure:
    -création d'un tableau (A) de nConcurrent contenant la position des concurrents au départ
    -création d'un tableau (B) de nConcurrent contenant le numéro des concurrent dans l'ordre de départ
    -création d'un tableau (C) de nCheckpoint contenant le nombre de concurrents ayant franchi chaque checkpoint
    Là encore, tu t'embêtes pour franchement pas grand chose.

    Même en prenant le cas le plus complet, c'est-à-dire le cas d'un circuit à plusieurs checkpoints, chacun d'eux pouvant être franchi une fois par tour, il suffit de compter pour chaque concurrent, le nombre de checkpoints qu'il a franchi jusqu'ici en faisant un +1 à chaque fois qu'il en franchit un.

    Le nombre de checkpoints franchis est égal au numéro du dernier franchi. Dans le cas d'un circuit, il suffit de faire un modulo n sur ce nombre pour le retrouver.

  5. #5
    Membre très actif
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    434
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 434
    Par défaut
    Non. Je disais que ta propre position dans la course est forcément égale au nombre de personnes ayant franchi le point au moment où te le franchis toi-même. Il n'y a donc aucun calcul à faire.
    Ben oui on est d'accord il faut donc soit compter le nombre de personne qui l'ont franchit soit faire un tableau (le tableau C que je propose).

    Pour le reste j'ai beau relire ce que tu dis je ne vois pas comment faire autrement, sans mes 3 tableaux il ne me semble pas possible d'éviter une fois de temps en temps un parcours de tous les checkpoint ou tous les joueurs pour déterminer le classement...

  6. #6
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 487
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 487
    Par défaut
    L'idée est de « garder sa chambre bien rangée » :-) Il faut classer les données en temps réel à chaque fois qu'un changement se produit.

    Tu fais un seul tableau de joueurs. Le type des éléments de ce tableau est une structure contenant deux éléments :
    • Le numéro de dossard du joueur (et encore, c'est limite optionnel) ;
    • Le nombre de checkpoints qu'il a franchi.


    C'est la position dans ce tableau qui définit le rang de chaque joueur dans la course. Lorsqu'un joueur dépasse un autre, c'est qu'il étaient déjà forcément consécutifs. Il suffit de permuter les deux cases adjacentes du tableau pour mettre à jour automatiquement les rangs de tes concurrents.

    Chaque joueur conserve une référence sur l'élément qui lui est propre, soit en utilisant un tableau de pointeurs ci-dessus si tu programmes en C, soit directement avec une référence si tu codes en Java. Cette liste de langage est non-exhaustive, naturellement.

    Chaque fois qu'un joueur franchit un checkpoint, il incrémente son propre compteur. Tu n'as même pas à parcourir le tableau pour cela : le joueur possède sa propre référence et si ce n'est pas le cas, si tu connais quand même son rang, tu peux t'en servir comme indice de tableau.

    De cette manière, tu n'as pas besoin des checkpoints pour connaître le rang de tes joueurs. Le tableau étant automatiquement trié et le restant tout au long du jeu, il suffit de le lire dans l'ordre et de t'arrêter au joueur qui t'intéresse pour connaître tous les joueurs qui sont devant.

Discussions similaires

  1. Réponses: 4
    Dernier message: 24/01/2015, 22h53
  2. Exécution d'une instruction à chaque passage dans une boucle
    Par monichou86 dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 30/11/2009, 20h47
  3. [SQL] Connaitre la position d'une ligne dans un classement
    Par Invité dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 27/02/2007, 09h45
  4. [MySQL] Récuperer la position dans un classement
    Par NicoMX dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 21/11/2006, 17h58
  5. [VB6] Sauvegarder la position dans un Recordset
    Par inotna2099 dans le forum VB 6 et antérieur
    Réponses: 8
    Dernier message: 29/04/2003, 17h35

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