2011-09-12 4 views
0

Je crée un jeu appelé Simon Says en C++ et je veux pouvoir frapper la barre d'espace et afficher 5 images aléatoires que j'ai déjà chargées dans mon jeu. Et chaque fois que je clique sur la barre d'espace, je veux que les images soient dans un ordre différent de celui de l'instant précédent, donc je dois pouvoir avoir une commande pour afficher aléatoirement les 5 images différentes une fois que je clique sur la barre d'espace. Voici le code que je dois afficher les images dans un ordre défini:Affichage de 5 images dans un ordre aléatoire en C++

 if(key_down(VK_SPACE)) 
    { 
     clear_screen(); 
     a(); 
     refresh_screen(); 
     delay(1000); 
     clear_screen(); 
     b(); 
     refresh_screen(); 
     delay(1000); 
     clear_screen(); 
     e(); 
     refresh_screen(); 
     delay(1000); 
     clear_screen(); 
     d(); 
     refresh_screen(); 
     delay(1000); 
     clear_screen(); 
     g(); 
     refresh_screen(); 
     delay(1000); 
     clear_screen(); 
     c(); 
     refresh_screen(); 
     delay(1000); 
     clear_screen(); 
     refresh_screen(); 

    } 
+6

Et quel est le problème, exactement? –

+0

Question connexe [http://stackoverflow.com/questions/4800534/methods-call-in-random-order-c](http://stackoverflow.com/questions/4800534/methods-call-in-random-order -c) – Bob2Chiv

Répondre

0

Vous pouvez fonction comme ce qui suit:

//returns random number between 0 and 4, inclusive 
int getRandomInt() { 
    return rand() % 5; 
} 

Cependant, vous devez d'abord appeler srand(someNumber) avant de l'utiliser pour la première fois. L'heure système est un bon candidat pour someNumber pour s'assurer que le même numéro n'est pas utilisé chaque fois que vous exécutez le programme.

+0

Préférez: 'return rand()/(RAND_MAX/6)' (voir ma réponse et commentaire) – sehe

0

srand (http://www.cplusplus.com/reference/clibrary/cstdlib/srand/) et rand (http://www.cplusplus.com/reference/clibrary/cstdlib/rand/) pourraient vous aider pour générer des nombres aléatoires. Je voudrais stocker toutes les images dans un tableau et dessiner des indices aléatoires. Mais ne dessinez pas d'index deux fois. Puisque la génération de nombres aléatoires est une opération bon marché par rapport à l'affichage des images, vous pouvez répéter la procédure jusqu'à ce que vous trouviez un index valide. La réponse de WaelJ * s vous aidera à générer des nombres dans les limites des tableaux.

1

L'algorithme standard std::random_shuffle mettra un tableau (ou un vecteur, etc.) dans un ordre aléatoire.

Votre code indique que vous disposez d'une fonction différente pour dessiner chaque image. Dans ce cas, les éléments que vous mélangez doivent probablement être des pointeurs de fonction. Ensuite, bouclez (soit directement, soit par l'intermédiaire du std::for_each) sur votre tableau mélangé (ou vecteur, etc.) en appelant chacun à tour de rôle et en effectuant le clear/refresh/delay.

+0

bon point. est random_shuffle 'new' ou quelque chose - je ne l'ai pas vu auparavant – sehe

+0

Non. Cela a été dans toutes les versions C++ depuis '98. Vous avez besoin de '#include ' – MSalters

+0

@sehe: Ce n'est pas le cas. Beaucoup d'algorithmes sont dans [''] (http://cplusplus.com/reference/algorithm/random_shuffle/) –

2

Voici la plomberie (sans (SDL) Specifics bibliothèque):


Modifier en utilisant random_shuffle est beaucoup mieux:

#include <iostream> 
#include <algorithm> 

void a() { std::cout<<"a"<<std::endl; } 
void b() { std::cout<<"b"<<std::endl; } 
void c() { std::cout<<"c"<<std::endl; } 
void d() { std::cout<<"d"<<std::endl; } 
void e() { std::cout<<"e"<<std::endl; } 

int main() 
{ 
    typedef void(*flashfunc)(); 
    static flashfunc flashes[] = {a,b,c,d,e}; 

    std::random_shuffle(flashes, flashes+5); 

    for (flashfunc *flash=flashes; flash!=flashes+5; ++flash) 
     (*flash)(); 

    return 0; 
} 

J'avais d'abord oublié à propos de random_shuffel et est venu avec cette façon de faire un shuffle make-shift:

#include <ctime> 

template <typename T> 
    bool shuffled(const T&, const T&) 
{ 
int r = rand()/(RAND_MAX/2); 
return 0 != r; 
} 

// ... 
    srand(time(NULL)); 
    std::stable_sort(flashes, flashes+5, shuffled<flashfunc>); 

Notez que cette façon de trier, vous besoin de tri stable parce que le prédicat de tri n'est pas déterministe.

+0

Correction de la logique rand() en fonction de ["Using' rand() '" article] (http://eternallyconfuzzled.com/arts/jsw_art_rand. aspx): ** [La raison pour laquelle ce commentaire est important est qu'il existe un certain nombre d'algorithmes qui semblent à première vue mettre en œuvre un brassage aléatoire d'une séquence, mais qui ne produisent pas en fait une distribution uniforme sur le N! commandes possibles. C'est-à-dire, il est facile d'obtenir aléatoire aléatoire shuffle.] (Http://www.sgi.com/tech/stl/random_shuffle.html) **. La fixation de l'ensemencement est hors de portée pour l'instant :) – sehe

Questions connexes