Annonce

Réduire
Aucune annonce.

QBasic Nibbles

Réduire
X
 
  • Filtre
  • Heure
  • Afficher
Tout nettoyer
nouveaux messages

    Bonjour bonjour dis,

    Y a-t-il quelqu'un qui maitrise le QBasic dans l'asssemblée?

    Je voudrais faire fonctionner convenablement Nibbles (pour QBasic) sous XP sans l'erreur "Division by Zero" du aux processeurs modernes, tout en gardant la fonctionnalité de vitesse dynamique du serpent. Il faut juste modifier le nibbles.bas (le code source) mais bon, m'y connais pas moi

    Merci...
    sigpic

    Met ton programme à notre disposition, je pense encore avoir le qbasic dans mes disquettes. J'ai programmé il y a longtemps sur ce langage, je vais voir si j'ai encore de bon souvenir sur ce basic.
    sigpic
    Imitateur de Supercopter aux IRL

    Commentaire


      Bonjour,

      Merci, c'est gentil.

      Voici un lien où on peut le télécharger.

      Bonne chance, j'espère que tu pourras en tirer quelque chose...
      sigpic

      Commentaire


        N'ayant pas de XP sous la main, j'ai quand même essayé avec DosBox et Qbasic 4.5... ben j'ai pas eu d'erreurs particulières...
        Essaye peut être avec QB45 qui, par ailleurs, t'offrira plus de rapidité en exécution et te permettra de compiler tes .bas en .exe
        Dernière modification par Tukuyomi, 06 juin 2006, 20h10.
        bsnes, snespurify and upset for Debian
        ROMs_checker script for Linux
        Les programmes de Nolife sur votre terminal: LA geekerie ultime!

        Commentaire


          N'ayant pas de XP sous la main, j'ai quand même essayé avec DosBox et Qbasic 4.5... ben j'ai pas eu d'erreurs particulières...
          Essaye peut être avec QB45 qui, par ailleurs, t'offrira plus de rapidité en exécution et te permettra de compiler tes .bas en .exe
          Bin j'ai essayé avec QB45 et ça me donne la meme erreur. Je sais pas quel config de PC tu as mais l'erreur est pour les processeurs puissants. La variable "speed" est la vitesse du processeur je suppose, il devrait y avoir moyen de modifier le code pour que ça fonctionne sur XP avec un gros MicroP. Mais bon, ça serait bien de garder la fonctionnalité de vitesse croissante durant le jeu (comme je l'avais déjà cité dans mon premier post).

          Même avec un Win98 sur un AMD 667 MHz, ça me donne l'erreur... je viens de tester.
          L'autre PC en question est un P4 2.4 Ghz avec 1Go de ddr (mais je pense pas que les rAM jouent un rôle...). Peut-être ton processeur était assez faible pour le faire tourner convenablement...

          En tout cas merci pour ta réponse.
          sigpic

          Commentaire


            Voilà, j'ai peut être trouvé quelque chose:
            Tout d'abord cette info:
            TIMER retourne le nombre de secondes écoulées depuis Minuit de chaque jour avec une précision au 1/100ème de seconde (c'est pas tout à fait vrai, mais faisons comme si).

            Dans le sous-module GetInputs (presse F2), tu as ça:
            Code:
            startTime# = TIMER                          ' Calculate speed of system
            FOR i# = 1 TO 1000: NEXT i#                 ' and do some compensation
            stopTime# = TIMER
            speed = speed * .5 / (stopTime# - startTime#)
            Qu'est-ce au juste? Ben tout simplement un test de vitesse de ton proc qui marche comme ça:
            - On prend le temps de MAINTENANT et on le sauve dans startTime#
            - on fait une boucle de 1000 itérations
            - et on reprend le temps de MAINTENANT que l'on sauve dans stopTime#
            - la formule pour speed varie en fonction de la différence de temps écoulé entre stopTime# et startTime#

            Pour les ordinateurs de l'époque, les 1000 itérations auraient pris plus de temps qu'avec des ordis récents, de ce fait il est fort possible qu'avec ton ordi, stopTime# ait la même valeur que startTime# (que le temps entre startTime# et stopTime# soit insignifiant).
            Et dans l'expression qui suit:
            Code:
            speed = speed * .5 / (stopTime# - startTime#)
            tu as droit à une division par zéro puisque si stopTime# et startTime# ont la même valeur, alors (stopTime# - startTime#) = 0

            A partir de là... ben tu peux essayer d'augmenter le nombre d'itérations:
            Code:
            FOR i# = 1 TO 999999: NEXT i#                 ' and do some compensation
            Augmente plus si ça ne suffit toujours pas, ben tu rajoutes un "hack"
            Code:
            startTime# = TIMER                          ' Calculate speed of system
            FOR i# = 1 TO 1000: NEXT i#                 ' and do some compensation
            REM stopTime# = TIMER                   ' REM: on commente cette ligne. La ligne suivante force stopTime# 2 secondes après startTime#
            stopTime# = 2 + startTime#              ' et voilà, si la vitesse est toujours trop élevée, tu peux toujours modifier cette ligne 
            speed = speed * .5 / (stopTime# - startTime#)
            Voilà , j'espère au moins que l'erreur vient de là (si tu pouvais me donner justement où se produit l'erreur ^^)
            Dernière modification par Tukuyomi, 07 juin 2006, 20h48.
            bsnes, snespurify and upset for Debian
            ROMs_checker script for Linux
            Les programmes de Nolife sur votre terminal: LA geekerie ultime!

            Commentaire


              Bonjour,

              Code:
              FOR i# = 1 TO 999999: NEXT i#                 ' and do some compensation
              ne fonctionne pas. J'avais déjà essayé ça. Ca supprime l'erreur mais ça rend le jeu beaucoup trop rapide.
              Je vais essayé le "hack" [...] ne fonctionne pas non plus apparement. Le jeu va trop vite aussi.
              L'erreur se produit exactement là :

              Code:
              speed = speed * .5 / (stopTime# - startTime#)
              Ta théorie semble correcte. Peut-être qu'il y a plus de paramètres à modifier, non?

              En tout cas merci...
              sigpic

              Commentaire


                L'erreur n'y est plus, c'est déjà ça ^^ mais en y réfléchissant de la journée (comme si j'avais que ça à faire ^^), il est vrai que le problème se posant maintenant EST la jouabilité. Comment résoudre ça? Sur le même principe que précédemment.
                Sous QBasic, un moyen simple pour ralentir un programme consiste à... occuper le processeur.
                Dans ton programme, la variable speed que tu retrouveras dans la sub PlayNibbles() sert en fait à occuper le processeur :
                Code:
                    curSpeed = speed
                [...]
                            'Delay game
                            FOR a# = 1 TO curSpeed:  NEXT a#
                Modifie cette boucle par:
                Code:
                    curSpeed = speed
                [...]
                            'Delay game
                            FOR a# = 1 TO 100 * curSpeed:  NEXT a#
                Si le 100 ne va pas, mets-y 500, si pas, 1000, et ajuste au fur et à mesure pour arriver à quelque-chose de correct .
                Si ça, ça marche, on pourra faire quelque chose de mieux, histoire de ne pas modifier le code à chaque changement de processeur...
                bsnes, snespurify and upset for Debian
                ROMs_checker script for Linux
                Les programmes de Nolife sur votre terminal: LA geekerie ultime!

                Commentaire


                  Code:
                  curSpeed = speed
                  [...]
                              'Delay game
                              FOR a# = 1 TO 100 * curSpeed:  NEXT a#
                  Quand je fais ça, ça me donne une erreur d'overflow...
                  sigpic

                  Commentaire


                    Code:
                        curSpeed = speed
                    [...]
                                'Delay game
                                FOR a# = 1 TO 100 * curSpeed:  NEXT a#
                    parce que curSpeed n'est pas défini en double précision.
                    Utilise la fonction 'Search -> Replace' pour remplacer tous les curSpeed par curSpeed#
                    bsnes, snespurify and upset for Debian
                    ROMs_checker script for Linux
                    Les programmes de Nolife sur votre terminal: LA geekerie ultime!

                    Commentaire


                      Utilise la fonction 'Search -> Replace' pour remplacer tous les curSpeed par curSpeed#
                      En faisant ça, ça semble marcher, à part le gros effet de "ramage". Et la vitesse un peu excessive pour un niveau 1
                      Pour un 2.4 Ghz et 1024 Mb de Ram, j'ai mis
                      Code:
                      FOR i# = 1 TO 999999: NEXT i#                 ' and do some compensation
                      et
                      Code:
                      curSpeed# = speed
                      [...]
                                  'Delay game
                                  FOR a# = 1 TO 1000 * curSpeed#:  NEXT a#
                      L'effet du ramage donne l'impression que le serpent ne passe pas par tout les pixels devant lui, il en passe quelques uns, réapparait 10 pixels plus loin... donc difficile de prévoir à quel moment il faut tourner. Mais, il y a de l'avenir, bravo.
                      Maintenant je ne sais pas quel config tu as...
                      Je me souviens qu'au début, le premier niveau allait tout doucement, ayant bien le temps d'anticiper le pixel surlequel le serpent doit tourner. Maintenant avec le code plus haut, il va déjà bien vite...
                      sigpic

                      Commentaire


                        Code:
                        curSpeed# = speed
                        [...]
                                    'Delay game
                                    FOR a# = 1 TO 1000 * curSpeed#:  NEXT a#
                        Mieux vaut ne pas augmenter le coefficient de curSpeed# de trop...
                        mais tu peux toujours ajouter un pas de comptage pour ta boucle FOR:NEXT (le pas est défini par défaut à 1)
                        Code:
                        curSpeed# = speed
                        [...]
                                    'Delay game
                                    FOR a# = 1 TO 1000 * curSpeed# STEP 0.01:  NEXT a#
                        Un STEP plus petit te donnera des boucles plus longues
                        Tu y tiens vraiment à ce jeu? ^^

                        Ah et pour ma config, ben c'est un peu spécial: j'ai un AMD 2600+ et 512Mo de RAM, une distro Linux, et j'utilise QBasic sur DOSBox, un émulateur DOS... de ce fait, mon QBasic tourne comme sur une machine cadencée à... 25MHz ^^
                        bsnes, snespurify and upset for Debian
                        ROMs_checker script for Linux
                        Les programmes de Nolife sur votre terminal: LA geekerie ultime!

                        Commentaire


                          Ah et pour ma config, ben c'est un peu spécial: j'ai un AMD 2600+ et 512Mo de RAM, une distro Linux, et j'utilise QBasic sur DOSBox, un émulateur DOS... de ce fait, mon QBasic tourne comme sur une machine cadencée à... 25MHz ^^
                          Ah tiens oui, la DOSBox, pas con, j'essayerai ce soir. Je l'ai jamais utilisé car j'ai encore un PC qui tourne sous Win98 qui, théoriquement possède le DOS d'origine.

                          En tout cas merci.
                          sigpic

                          Commentaire


                            Voilà, je te propose d'essayer cette version modifiée de nibbles: http://tukuyomi.free.fr/misc/nibbles2.bas
                            J'ai ajouté un test de processeur qui fonctionne un peu à l'inverse de celui de Microsoft.
                            Code:
                                startTime# = TIMER
                                FOR i# = 1 TO 1000: NEXT i#
                                stopTime# = TIMER
                                speed = speed * .5 / (stopTime# - startTime#)
                            Celui de Nibbles consistait à estimer le temps pour 1000 itérations d'une boucle FOR:NEXT et de ce temps découlait la vitesse du jeu, défini dans la variable speed.

                            Code:
                              ' On va faire patienter le joueur 5 secondes (paramétrable avec t% ci-dessous),
                              ' le temps d'estimer la vitesse du processeur (procSpeed#)
                              t% = 5: procSpeed# = 0: procStep# = .001
                              Center 24, "Veuillez patienter" + STR$(t%) + " secondes, Sammy teste votre processeur..."
                              stopTime# = TIMER + t%
                              DO: procSpeed# = procStep# + procSpeed#: LOOP UNTIL TIMER > stopTime#
                              procSpeed# = procSpeed# / t%
                            Le bout de code ci-dessus marche complètement à l'opposé.
                            On compte donc le nombre d'itérations (procSpeed#, par pas de procStep#) que le processeur est capable de calculer durant un temps défini (t%).
                            Une fois le temps écoulé, on modifie procSpeed# en le divisant par t% pour avoir une moyenne par seconde, et on se basera sur cette valeur pour limiter la vitesse du programme en général.

                            On garde toujours speed#, mais plus pour la même fonction que dans la version originale.
                            De ce fait, on recalcule la variable curSpeed:
                            Code:
                                curSpeed# = procSpeed# / speed#
                            speed# augmente durant le jeu ce qui implique que curSpeed# diminue au fur et à mesure et donc ça accélère progressivement le serpent!
                            Code:
                                        'Delay game
                                        a# = 0: DO: a# = procStep# + a#: LOOP UNTIL (TIMER < 0) + (a# > curSpeed#)
                            On retrouve aussi ce même bout de code dans la Sub SparklePause() qui s'occupe lors de l'intro, de faire circuler le chenillard d'étoiles rouges. Normalement si ça marche comme prévu sur ton ordi, tu dois voir le chenillard faire le tour du texte dans le sens inverse des aiguiles d'une montre, et sans trop de saccades.

                            Si tu pouvais me dire ce que t'en penses, et si ça marche correctement sur ta machine, et sur d'autres, si tu as moyen, ce serait bien
                            Dernière modification par Tukuyomi, 12 juin 2006, 20h31.
                            bsnes, snespurify and upset for Debian
                            ROMs_checker script for Linux
                            Les programmes de Nolife sur votre terminal: LA geekerie ultime!

                            Commentaire


                              Salut,

                              Bizarrement, ça rame à fond, mon processeur est à 95% dès que je le lance.
                              De plus, Sammy avance seulement si je garde la touche enfoncée; et si je veux tourner, il ne veut pas, je dois appuyer plusieurs fois pour qu'il tourne, comme si le ramage fait en sorte de ne pas capter ce que je fais. Et aussi, comme j'ai déjà dit, le Sammy passe plusieurs pixels à la fois. Pour l'instant je pourrais pas essayer sur un 667 Mhz, mais je te tiendrai au courant.
                              sigpic

                              Commentaire

                              Chargement...
                              X