Partage
  • Partager sur Facebook
  • Partager sur Twitter

[SDL] Snake

Votre avis sur mon jeu

    3 février 2006 à 18:36:13

    Bonsoir chers zéros :D

    Je viens aujourd'hui solliciter votre aide:
    Voilà, je viens de terminer mon second jeu fait grâce aux librairies SDL et SDL_ttf: le snake (après plusieurs de travail), et j'aurais besoin de votre aide pour me dire les problèmes que comporte celui. Je pense par exemple, à la vitesse du serpent, ou bien au clignotement et surtout aux bugs.

    Info: vous ne trouverez pas dans le fichier rar les codes sources pour l'instant, je souhaite terminer totalement le jeu et arranger le code puis vous les proposez...

    Vous pouvez télécharger le jeu ci-dessous:
    Le jeu Snake

    N'hésitez pas à me faire des commentaires...

    Merci d'avance...

    Amicalement Mercosuh ;)

    EDIT: J'ai oublié de dire que esthétiquement, c'est pas terrible :D
    • Partager sur Facebook
    • Partager sur Twitter
      3 février 2006 à 18:50:41

      Salut,

      J'm beaucoup ton jeu mais pourrai tu affichr le temps et surtout ton code source!

      Merci
      • Partager sur Facebook
      • Partager sur Twitter
        3 février 2006 à 18:58:52

        Pour le point blacn s'affichant à en haut à gauche met lui un poistion négative au lieu de zéro comme ça il ne s'affichera pas. Sinon, j'aime bien enfinj e veut dire que c'est bien un snake :)
        Personnelment je suis ne train ( enfin c'est ne pause mais j'était sensé faire ça ) d'émaliorer mon snake pour que le but du jeu soit ude bouffer un autre serpent ( je vais mettre le réseau peut être et sinon c'est une ia :) )
        • Partager sur Facebook
        • Partager sur Twitter
          3 février 2006 à 18:59:08

          Bonjour,
          Ton jeu est très sympatique je trouve!! ;)
          Par contre je pourrai te conseiller, afin de l'optimiser, de faire un départ moins rapide (car dès que l'on clique sur le .exe le jeu se lance tout seul, tu pourrai par ex le mettre en pause dès son lancement).
          Tu pourrai aussi proposer au joueur de rejouer kan il a perdu au lieu de le faire obligatoirement quitter.

          Sinon question bug je n'ai pas remarquer grand chose à part un carré blanc ki s'affiche en haut à gauche lorsque l'on "mange" un petit carré!

          Aller bonne continuation! :)
          • Partager sur Facebook
          • Partager sur Twitter
            3 février 2006 à 18:59:17

            Merci :)

            Au passage, je souhaiterais savoir si quelqu'un sais comment on peut faire un tableau de taille variable à 2 dimensions car la taille du serpent varie et pour chaque partie du serpent, il y a les coordonnées x et y. Je sais juste qu'il faut utiliser l'allocation dynamique de mémoire.

            Désolé si je ne suis pas clair o_O
            Merci d'avance...

            Edit: A propos du carré blanc, j'ai essayé de lui mettre des coordonnées négatives mais j'avais eu un problème, je m'en rappelle plus exactement mais je vais réessayer...
            • Partager sur Facebook
            • Partager sur Twitter
              3 février 2006 à 19:03:14

              Salut,
              Ton jeu est pas mal du tout mais ce qui aurai était mieu c'est qu'il y est une touche pour pouvoire recommancer la partie pasque c'est chi**t de devoire tout recomancer mais sinnon il est bien
              • Partager sur Facebook
              • Partager sur Twitter
                3 février 2006 à 19:06:00

                Très bien réalisé ! Juste une question, tu utilises une texture ou juste des dessins de pixels dans la fenêtre ?
                • Partager sur Facebook
                • Partager sur Twitter
                  3 février 2006 à 19:10:07

                  Etant donné la simplicité du serpent, j'utilise la fonction SDL_FillRect() et non des sprites mais il est tout à fait possible d'en mettre pour donner l'aspect du serpent.

                  Je travaille actuellement sur l'ajout de la fonction recommencer :o
                  Merci pour toutes vo critiques :D
                  • Partager sur Facebook
                  • Partager sur Twitter
                    3 février 2006 à 19:51:45

                    Arrivé à 4600 points, je bouffe un carré rouge, et... 'vous avez perdu'. Ca n'arrive qu'à moi?

                    PS: mets ta source...
                    • Partager sur Facebook
                    • Partager sur Twitter
                      3 février 2006 à 19:57:54

                      Très bon jeu mais ca bug pour moi aussi une fois arrivé à 4600pts.

                      Le serpent disaprait en fait..
                      • Partager sur Facebook
                      • Partager sur Twitter
                        3 février 2006 à 20:11:44

                        En effet, je viens de jouer, et il y a bien un bug, je compte le corriger demain...
                        Encore merci de votre aide :D

                        Edit: lorsque tous les bugs seront corrigés, je vous montrerai le code source :D
                        • Partager sur Facebook
                        • Partager sur Twitter
                          3 février 2006 à 20:43:06

                          Moi j'au buggué à 4200 et 4500 (ou 4600 sais pu^^), ch'uis bizarre on dirait. :p

                          Sinon, j'aime bien ton jeu, par contre si le serpent pouvait être vert déjà. :) Sinon quand t'auras fini, perso je serais pour l'idée de mettre un chrono, voir un temps record à battre. :)
                          Et puis, plusieurs niveaux aussi (enfin stages plutôt), mais après je pense que ça augmente pas mal la difficulté donc...si vraiment t'as rien à faire tu pourras essayer. :p
                          • Partager sur Facebook
                          • Partager sur Twitter
                            4 février 2006 à 0:05:10

                            Peut pas tester sous Linux sans la source :(
                            • Partager sur Facebook
                            • Partager sur Twitter
                              5 février 2006 à 11:36:09

                              Je pense que l'on peut faire très simple pour la fonction recommencer : main(); :p C'est pas sur que ça marche mais moi je suis avec toi et je ne pense pas que tu dois te faire ***** a faire une boucle et mettre les indentations ^^ Je pense que si tu met main(); ça doit marcher. (ps: Modifie la fonction main si tu a mis int main(/*variables bizzarres*/); mets int main() ;) )

                              EDIT: C'est pas sur que ça marche, je vais essayer tiens!

                              EDIT: Par Bélénos o_O Ca marche :D

                              EDIT: Pour ceux qui veulent voir mon test:

                              int main()
                              {
                                short int recommencer = 0;
                                system("PAUSE");
                                printf("\nVoulez vous recommencer?"
                                "\n\ttape un nombre (sauf 0) pour dire oui"
                                "\n\ttape 0 ou une lettre pour dire non\n");
                                scanf("%ld",&recommencer);
                                if(recommencer)
                                   main();
                                   
                                return 0;
                              }

                              EDIT: Desole fausse joie, si on quitte apres avoir recommencer ça marche plus!

                              EDIT: :D Faut mettre la variable en static et ça marche:

                              void recommencer()
                              {
                                static short recommencer;
                                recommencer = 0;
                               
                                printf("\nTu veux recommencer?"
                                "\n\ttape un nombre (sauf 0) pour dire oui"
                                "\n\ttape 0 ou une lettre pour dire non\n");
                                scanf("%ld",&recommencer);
                                if(recommencer)
                                   main();
                              }



                              PS: Vous devez declarer la fonction main comme ceci:

                              int main()
                              {
                                 /*le programme..*/
                                 recommencer(); /*la fonction pour recommencer*/
                              }
                              • Partager sur Facebook
                              • Partager sur Twitter
                              Anonyme
                                5 février 2006 à 12:10:09

                                Le jeu est pas mal du tout, ne serait-il pas possible de garder en mémoire les scores.
                                Une fois que l'on a perdu, on entre son pseudo et au pseudo est associé le score.

                                Je ne sais pas du tout si c'est possible a réaliser facilement.

                                Si sa ne t'intéresse pas c'est pas grave c en'est qu'une suggestion.

                                A+
                                • Partager sur Facebook
                                • Partager sur Twitter
                                Anonyme
                                  5 février 2006 à 12:18:21

                                  Oui, avec un fichier texte, du style :
                                  Pseudo Score
                                  Pseudo2 Score2

                                  Très simple a gèrer avec les flux de fichier, un peut plus dure avec le type FILE*
                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                    5 février 2006 à 12:37:59

                                    Tu pourrais mettre une archive plus acessible que .rar, comme .zip ou .tar.bz2 ? (http://framasoft.net/article1025.html)

                                    Tu pourrais mettre la source ?

                                    • Partager sur Facebook
                                    • Partager sur Twitter
                                      6 février 2006 à 11:41:26

                                      Quelque améloration: Un écran d'entrer du jeu.
                                      Un system de highscore. Un ecran de sortie.
                                      Mais c'est déja très bien se que tu a fait!
                                      • Partager sur Facebook
                                      • Partager sur Twitter
                                        6 février 2006 à 13:52:34

                                        bonjour,
                                        j'ai rencontré un problem je ne sais pas si c'est vraiment un probleme mais le carré rouge qu'on doit mangé s'affiche parfois sur le serpent est-ce normal?
                                        • Partager sur Facebook
                                        • Partager sur Twitter
                                        Anonyme
                                          6 février 2006 à 17:09:46

                                          Oui, vu que sa position est génèrer par random... Dit, esque tu fait une vérif pour eviter d'avoir un careau sur la tête du serpan? ^^
                                          • Partager sur Facebook
                                          • Partager sur Twitter
                                            6 février 2006 à 20:27:25

                                            Ca serait quand même mieux si on avait les sources...
                                            • Partager sur Facebook
                                            • Partager sur Twitter
                                              7 février 2006 à 5:01:29

                                              Excellent travail, et j'approuve pour le manque de source...
                                              • Partager sur Facebook
                                              • Partager sur Twitter
                                                7 février 2006 à 11:25:27

                                                Désolé, pour cette longue attente, mais je fus entre temps malade, et j'ai mis en place mon site web
                                                Mais passons :D


                                                #include <SDL.h>
                                                #include <SDL_ttf.h>
                                                #include <cstdio>
                                                #include <iostream>
                                                #include <vector>

                                                using namespace std;

                                                void message(string phrase, int x, int y);
                                                int initialise_SDL();

                                                SDL_Surface *affichage = NULL, *texte = NULL;
                                                TTF_Font *police = NULL;

                                                int initialise_SDL(){
                                                        if(SDL_Init(SDL_INIT_VIDEO) < 0){
                                                                return 1;
                                                        }

                                                        if(TTF_Init() < 0){
                                                                return 1;
                                                    }

                                                        affichage = SDL_SetVideoMode(400, 400, 16, SDL_SWSURFACE | SDL_DOUBLEBUF);
                                                        if(affichage == NULL){
                                                                return 1;
                                                        }

                                                        police = TTF_OpenFont("./police.ttf", 14);
                                                        if(!police){
                                                                return 1;
                                                        }

                                                        SDL_WM_SetCaption("Snake par Mercosuh", NULL);
                                                        return 0;
                                                }

                                                void message(string phrase, int x, int y){
                                                        SDL_Color texte_couleur = { 255, 255, 255 };
                                                        SDL_Rect texte_pos;

                                                        texte_pos.x = x;
                                                        texte_pos.y = y;

                                                        texte = TTF_RenderText_Solid(police, phrase.c_str(), texte_couleur);
                                                        SDL_BlitSurface(texte, NULL, affichage, &texte_pos);
                                                }

                                                int main(int argc, char *argv[]){

                                                        if(initialise_SDL() == 0){
                                                        srand(SDL_GetTicks());

                                                        SDL_Event event;
                                                        SDL_Rect rect, r_proie;
                                                        Uint32 blanc, noir, rouge;

                                                        rect.w = r_proie.w = 10;
                                                        rect.h = r_proie.h = 10;

                                                        blanc = SDL_MapRGB(affichage->format, 255, 255, 255);
                                                        noir = SDL_MapRGB(affichage->format, 0, 0, 0);
                                                        rouge = SDL_MapRGB(affichage->format, 128, 0, 0);

                                                        bool jouer = true, quitter, lancer, n_proie, pause, perdu;
                                                        char compteur[10];
                                                        int i, nbr, _nbr, limite, points, in, temps, _temps, direction, d_pos_x, d_pos_y;

                                                        while(jouer == true){
                                                                //Initialise les variables
                                                                jouer = false;

                                                                quitter = false;
                                                                lancer = false;
                                                                n_proie = true;
                                                                pause = true;
                                                                perdu = false;

                                                                r_proie.x = 0;
                                                                r_proie.y = 0;

                                                                vector<int> serpent_x(9);
                                                                vector<int> serpent_y(9);

                                                                nbr = 9;
                                                                _nbr = 9;
                                                                limite = 0;
                                                                points = 0;
                                                                in = 0;
                                                                _temps = 0;
                                                                direction = 3;
                                                                d_pos_x = 200;
                                                                d_pos_y = 200;

                                                                fill(serpent_x.begin(), serpent_x.end(), 200);
                                                                fill(serpent_y.begin(), serpent_y.end(), 200);

                                                                sprintf(compteur, "%d", points);
                                                                while(quitter == false){

                                                                        while(SDL_PollEvent(&event)){
                                                                                switch(event.type){
                                                                                        case SDL_QUIT:
                                                                                                quitter = true;
                                                                                        break;
                                                                                       
                                                                                        case SDL_KEYDOWN:
                                                                                                switch(event.key.keysym.sym){
                                                                                                        case SDLK_r:
                                                                                                                if(perdu == true){
                                                                                                                        quitter = true;
                                                                                                                        jouer = true;
                                                                                                                }
                                                                                                        break;
                                                                                                       
                                                                                                        case SDLK_ESCAPE:       quitter = true; break;
                                                                                                        case SDLK_p: pause = (pause == true)? false : true ; break;
                                                                                                       
                                                                                                        case SDLK_RIGHT:        if(direction != 3) direction = 1; break;
                                                                                                        case SDLK_UP:      if(direction != 4) direction = 2; break;
                                                                                                        case SDLK_LEFT:  if(direction != 1) direction = 3; break;
                                                                                                        case SDLK_DOWN:  if(direction != 2) direction = 4; break;
                                                                                                }
                                                                                        break;
                                                                                }
                                                                        }

                                                                        SDL_FillRect(affichage, NULL, noir);
                                                                       
                                                                        //Afficher le message si le joueur a perdu
                                                                        if(perdu == true){
                                                                                message("Vous avez perdu", 160, 25);
                                                                                message("Appuyez sur echap pour quitter ou r pour rejouer...", 40, 40);
                                                                                pause = true;
                                                                        }

                                                                        if(pause == false){
                                                                                temps = SDL_GetTicks();
                                                                                if(temps > _temps){
                                                                                        switch(direction){
                                                                                                case 1: d_pos_x += 10; break;
                                                                                                case 2: d_pos_y -= 10; break;
                                                                                                case 3: d_pos_x -= 10; break;
                                                                                                case 4: d_pos_y += 10; break;
                                                                                        }
                                                                                       
                                                                                        //vérifie si le joueur n'a pas perdu
                                                                                        if(lancer == true){
                                                                                                for(i = 0; i < nbr; i++){
                                                                                                        if(serpent_x[i] == d_pos_x && serpent_y[i] == d_pos_y) perdu = true;
                                                                                                }
                                                                                        }

                                                                                        if(d_pos_x == r_proie.x && d_pos_y == r_proie.y){
                                                                                                points += 100;
                                                                                                sprintf(compteur, "%d", points);

                                                                                                        if(points >= limite){
                                                                                                        limite = points + 100;
                                                                                                        nbr++;
                                                                                                       
                                                                                                                if(nbr > _nbr){
                                                                                                                serpent_x.resize(nbr + 10);
                                                                                                                serpent_y.resize(nbr + 10);
                                                                                                                _nbr = nbr + 10;
                                                                                                                }              
                                                                                                        }
                                                                                                n_proie = true;
                                                                                        }
                                                                                       
                                                                                        //Traversée les murs
                                                                                        if(d_pos_x <= 10) d_pos_x = 390;
                                                                                        if(d_pos_x > 390) d_pos_x = 10;
                                                                                        if(d_pos_y <= 10) d_pos_y = 390;
                                                                                        if(d_pos_y > 390) d_pos_y = 10;

                                                                                        serpent_x[in] = d_pos_x;
                                                                                        serpent_y[in] = d_pos_y;

                                                                                        in++;
                                                                                        if(in == nbr) in = 0;
                                                                                        _temps = temps + 50;
                                                                                }
                                                                        } else {
                                                                            if(perdu == false){
                                                                                message("Jeu en pause", 160, 25);
                                                                                message("Appuyez sur p pour reprendre la partie...", 80, 40);
                                                                            }
                                                                        }
                                                                       
                                                                        // Affichage du serpent
                                                                        for(i = 0; i < nbr; i++){
                                                                                rect.x = serpent_x[i];
                                                                                rect.y = serpent_y[i];
                                                                                SDL_FillRect(affichage, &rect, blanc);
                                                                        }
                                                                       
                                                                        //Affichage de la proie
                                                                        if(n_proie == true){
                                                                                r_proie.x((rand() % 37) * 10) + 20;
                                                                                r_proie.y((rand() % 37) * 10) + 20;
                                                                               
                                                                                n_proie = false;
                                                                        }
                                                                        SDL_FillRect(affichage, &r_proie, rouge);
                                                                       
                                                                        //Afficahge des points
                                                                        message(compteur, 200, 10);
                                                                       
                                                                        lancer = true;
                                                                        SDL_Flip(affichage);
                                                                }
                                                                serpent_x.erase(remove_if(serpent_x.begin(), serpent_x.end(), bind2nd(greater<int>(), 3)), serpent_x.end());
                                                                serpent_y.erase(remove_if(serpent_y.begin(), serpent_y.end(), bind2nd(greater<int>(), 3)), serpent_y.end());
                                                        }
                                                       
                                                        TTF_Quit();
                                                        SDL_Quit();
                                                        }

                                                        return 0;
                                                }

                                                Je vous l'accorde, c'est très mal programmé ^^
                                                J'ai commenté le strict minimun. :euh:

                                                Voilà, au passage, j'ai changé l'adresse où télécharger le jeu
                                                Pour les intéréssés, je vous invite à jeter un coup d'oeil aux autres jeux que j'ai programmé:
                                                C'est par ici

                                                Amicalement Mercosuh... :)
                                                • Partager sur Facebook
                                                • Partager sur Twitter
                                                  8 février 2006 à 0:27:16

                                                  Un peu farfelu ton code source ^^ Je comprend pourquoi le jeu rame un peu ^^ Mais en fait, tu peux me donner ce qu'il y a dans la librairie SDL_ttf.h ? Parce que je vient d'installer SDL et je n'ai pas ce fichier! Tu peux mettre ce qu'il y a dedans s'il te plaît ? Merci d'avance :)

                                                  EDIT: Je te demande ça car je veux regler que le serpent soit plus rapide et plus grand au début ^^

                                                  EDIT: Mon record c'est 10800 ^^
                                                  • Partager sur Facebook
                                                  • Partager sur Twitter
                                                  Anonyme
                                                    8 février 2006 à 16:53:15

                                                    Vas sur le site de SDL, et cherche SDL_ttf.
                                                    • Partager sur Facebook
                                                    • Partager sur Twitter
                                                      8 février 2006 à 17:22:27

                                                      Citation : Mercosuh

                                                      C'est par ici

                                                      sympathique, mais où sont les jeux? >_>
                                                      • Partager sur Facebook
                                                      • Partager sur Twitter
                                                        8 février 2006 à 18:05:07

                                                        idem.... j'ai aucun jeu dans la liste (même pas le snake...)
                                                        • Partager sur Facebook
                                                        • Partager sur Twitter
                                                          8 février 2006 à 19:11:16

                                                          Désolé :D
                                                          Petit bug, mais là tout semble marcher correctement
                                                          • Partager sur Facebook
                                                          • Partager sur Twitter

                                                          [SDL] Snake

                                                          × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                                                          × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                                                          • Editeur
                                                          • Markdown