Forum Liberty Basic France : Voir tous les messages du membre

   Le 04/06/2015 à 14h58 Débutant » Plus Ou Moins
Et en version boucles :

Code VB :
 
TentaMax = 10               'nombre de tentatives maxi du joueur

DO
  'présentation du programme à l'utilisateur
  cls
  Print "Jeu du plus ou moins"
  Print " Devinez un nombre entre 1 et 100 "
  Print ""
  Print " Entrez votre proposition : "
 
  'initialisation des variables
  Nombre = int(100*(rnd(1)))  'nombre choisi par l'ordinateur

  Tentative = 0               'c'est la première tentative...
  DO
    Tentative = Tentative + 1
    'proposition du joueur
    Input " Tentative " ;Tentative;" :";Proposi
 
    if Proposi > Nombre then
       print "     Plus petit"
    else
      if Proposi < Nombre then print "     Plus grand"
    end if
    print
 
  LOOP UNTIL Tentative = TentaMax or Proposi = Nombre
 
  if Proposi = Nombre then print "Bravo, vous avez trouvé le ";Nombre else  print "Perdu...!"
 
  print
  Input "Voulez-vous rejouer (oui/non) ?";Souhait$
 
LOOP UNTIL instr("OUIoui",Souhait$)=0
'fin du programme
cls
print "Vous avez quitté le jeu, salut !"
 
END
 
Avec word$() c'est pas toujours ce qu'il y a dans la chaine qui compte, mais plutôt le chiffre qu'il y a après... surtout si celui-ci doit être le résultat d'une opération !
La chaine peut donc aussi bien être adaptée afin d'obtenir ce que l'on veut.
Quoi qu'il en soit la formule de Christophe est simplifiée et fonctionne tout aussi bien apparemment.
Au risque de racompter des carabistouilles, il me semble que c'était une adaptation de la formule anglaise pour lesquel le premier jour de la semaine n'est pas le Lundi mais le Dimanche...

@+
Excellent Christophe :top

J'avais déjà vu et corrigé ça, mais comme je suis fainéant, j'ai copié/collé des bouts de code depuis un code plus ancien ;)
Roland a aussi trouvé des trucs pas forcément utiles dû à ça....

Il y a aussi la récupération de la dimension exacte de la fenêtre graphique grace a HOME...

Et aussi la SUB fileExists(path$, filename$) que je n'utilise pas...

Tout ça sont souvent des astuces trouvées dans le forum anglophone.

etc

Si tu as des questions ou d'autres optimisations n'hésite pas. Voilà la vrai utilité du forum :top

@+

Gilles
Désolé pour ton cul Roland : ça doit faire mal :lol
Roland à raison Christophe, je suis confu mais mon code est plutôt conçu pour respecter entièrement le cahier des charges de ton code d'origine ( ou en tout cas ce que j'en ai compris :p ) et non pour y être intégré...

J'avais quand même réfléchi aux solutions à mettre en oeuvre lors de mes post précédents... mais effectivement je l'ai fait en quelques heures (il a bien fallu que je relise beaucoup la doc, depuis le temps, j'avais beaucoup oublié...) et je n'ai donc pas trop pris la peine de commenter... désolé pour ça.
J'essayerai de répondre à toute question...

Pourquoi s'embéter avec toutes ces questions de largeur de texte etc ?? centrer simplement le mot trouvé dans l'espace réservé me semblait plus simple...!!!

Pourquoi veux-tu créer une ComboBox (ou LisBox) "fait main" puisqu'elle existe toute faite ? de plus on peut décider de sa taille, sa position à l'écran, sa couleur, la police des mots qu'elle contient, etc... à moins que ce ne soit que pour le fun :lol

Mon but est bien de te montrer qu'on peut faire plein de choses en relativement peu de code avec JustBasic, en évitant l'usine à gaz souvent décourageante tant on n'arrive parfois jamais à en voir le bout... sans pourtant obtenir vraiment ce que l'on souhaitais au départ...

Il faut vraiment essayer de voir les choses plus simplement (pas comme Roland ;) ) car après tout, ce ne sont que quelques commandes qu'on écrit les unes à la suite des autres en faisant en sorte que la chronologie d'écriture donne le résultat recherché...!
C'est tout comme les LEGO :top


@+

Gilles
Tu as essayé ? parce que je crois bien qu'en donnant les valeurs de largeur et hauteur dans FONT, on "force" les caractères à ces dimensions...
Pourquoi faire aussi compliqué ? Qu'est-ce que c'est que le "token" ?

Plus simplement il est aussi possible de définir les largeur et hauteur de la police utilisé dans la commande de sa déclaration FONT.
Le reste c'est au pifomètre jusqu'à satisfaction esthétique, et puis voilà...;)
Ah oui ! c'est un oubli : réparé.

Le nom du fichier apparait maintenant en bas à gauche.
Bon, juste histoire de finir ce que j'ai commencé, et aussi pour mon plaisir ;) voici la version complète, avec décorticage du fichier texte et installation de la fable à l'écran.
Le prog devrait pouvoir lire tout fichier texte ( "Fable**.txt" ) pour peu qu'il soit formaté EXACTEMENT comme ci-dessous, avec 7 lignes maximum (ou bien il faut augmenter la hauteur de la fenêtre), et 10 mots maximum à trouver.

Code TEXT :
Le Corbeau et le Renard
Maître-Corbeau;Loup;Renard;Blaireau;Souriceau;Lion-sur un arbre-perché;en fleur;déraciné;penché;feuillu;magnifique-tenait en son bec un fromage.
Maître Renard, par l'odeur-alléchée;rouge vif;bleue;pourrie;puissante;sereine;assurée-lui tint à peu près ce langage.
Hé ! bonjour, Monsieur du-Corbeau;Courneau;Blaireau;Bigorneau;Taureau;Cours d'Eau-que vous êtes joli ! que vous me semblez beau !


Comme je ne sais plus s'il existe une commande qui donne la largeur d'un texte EN PIXELS , Il resterait à trouver les bonnes valeurs pour évaluer la bonne largeur des phrases en pixels...

Code VB :
' http://libertybasic.fr/forum/topic-384+definir-des-combobox-quand-on-n-en-connait-pas-le-nombre.php
' http://libertybasic.fr/forum/topic-393-0-4259+detecter-si-la-souris-est-au-dessus-d-une-zone.php#m4259
    nomainwin
 
    WindowWidth = 1000
    WindowHeight = 600
    UpperLeftX = (DisplayWidth-WindowWidth) / 3
    UpperLeftY = (DisplayHeight-WindowHeight) / 2
 
    mois$ = "Jan Fév Mar Avr Mai Jun Jui Aou Sep Oct Nov Déc"
    today$ = date$("mm/dd/yyyy")
    j = date$(today$)
    jsem$ = word$("Mar Mer Jeu x Ven Sam x Dim Lun",int((j/7-int(j/7))*10)+1)
    date$ = jsem$+" "+mid$(today$,4,2)+" "+word$(mois$, val(today$))+"   "+left$(time$(),5)'right$(today$,4)

    GLOBAL textFont$, textColor$, bckColor$, Gwidth, Gheight, lbx, lby, nz, nm, trou$
 
    DIM info$(10,10), lrmat$(10), mt$(10), mots$(6), lf$(10)
    lbx = 0
    lby = -200
 
    textFont$  = "Comic_Sans_MS" ' "Times_New_Roman"
    textColor$ = "yellow"
    bckColor$  = "26 72 43"    ' dark green ...
    ListboxColor$ = "cyan"
    trou$ = "-------------"
 
    statictext #w.debug "message de debug", 10, WindowHeight-55, 310, 40
    graphicbox #w.gr, 0, 0, WindowWidth, WindowHeight-135
    graphicbox #w.grtxt, 0, WindowHeight-136, WindowWidth, 65
    listbox #w.lb, mots$(), [valider], lbx, lby, 130, 6*21
 
    BUTTON #w.t1, "Nouveau fichier", Charge, UL, WindowWidth-480, WindowHeight-60 , 140, 25
    BUTTON #w.t2, "Recommencer", [rejoue], UL, WindowWidth-280, WindowHeight-60 , 100, 25
    BUTTON #w.exit, "QUITTER", Quit, UL, WindowWidth-120, WindowHeight-60 , 100, 25
    open "    Mots à trouver..."+space$(20)+date$ for window_nf as #w    ' graphics_nf_nsb
    #w "trapclose Quit"
    #w.gr "home; posxy CenterX CenterY"
    Gwidth = CenterX * 2
    Gheight = CenterY * 2
    #w "font ";textFont$;" 10 bold"
    #w.gr "font ";textFont$;" 14 bold"
    #w.gr "down"
    gosub [makeSprites]
    #w.grtxt "down; fill ";bckColor$ 
    #w.debug "!font Times_New_Roman 11 bold"
    #w.lb "singleclickselect"    'pour ne cliquer qu'une fois dans la listbox pour valider un mot...
    #w.gr "backcolor ";bckColor$;"; fill ";bckColor$
    call Charge "#w"
    #w.gr "when mouseMove XY"
 
WAIT
 
  sub mep  ' -------------------- en principe : décorticage du fichier texte -------------------
           '  traitement du fichier texte avec gestion des positions des mots, etc...
    call message 15,20,""
 
    for m=1 to 10
      mt$(m) = trou$
    next
 
    #w.gr "backcolor ";bckColor$;"; fill ";bckColor$
    #w.gr "color ";textColor$
 
    #w.gr "place 150 50;|";upper$(lf$(1))
    mah = 30
    itl = 50
    mag = 20
    li  = 2
    nm  = 0
    do
      lmt$ = word$(lf$(li),1,"-")
      if lmt$<>"" then
        ngm = 1
        ecm = 0
        do
          if instr(lmt$,";") then
            nm = nm + 1
            lrmat$(nm) = lmt$
            #w.gr "place ";mag + ecm;" ";mah + itl * li;";|";mt$(nm)
            #w.gr "spritexy zone";nm;" ";mag + ecm;" ";mah +itl * li -20
            ecm = ecm + len(mt$(nm))*13
          else
            #w.gr "place ";mag + ecm;" ";mah +itl * li;";|";lmt$
            ecm = ecm + len(lmt$)*10
          end if
          ngm = ngm + 1
          lmt$ = word$(lf$(li),ngm,"-")
        loop until lmt$=""
      else
        #w.gr "place ";mag;" ";mah+itl*li;";|";lf$(li)
      end if
      li = li + 1
    loop until lf$(li) = ""
 
    #w.gr "flush"
    #w.gr "color green"
  end sub
 
  sub XY handle$, mx, my    ' when mouseMove ...
       ' mx = MouseX
       ' my = MouseY

        #w.gr "spritexy Curs ";mx;" ";my
        #w.gr "spritecollides Curs list$"
        nz = val(right$(word$(list$,1),1))
        if nz>0 and nz<=nm and nz<>oldnz then
           #w.gr "spritexy? ";word$(list$,1);" x y"
           lbx = x
           lby = y
           for m=1 to 6
             mots$(m) =word$(lrmat$(nz),m,";")   'charge la nouvelle liste de mots
           next
           for mel=1 to 30           ' mélange
             hz0 = int(rnd(1)*nm)+1
             tmp$ = mots$(hz0)
             hz = int(rnd(1)*nm)+1
             mots$(hz0) = mots$(hz)
             mots$(hz) = tmp$
           next
           #w.lb "reload"
           #w "refresh"
           oldnz = nz
        else
           lbx = 0
           lby = -200
           #w "refresh"
        end if
  end sub
 
  [rejoue]
    call message 15,20,""
    #w.gr "color yellow"
    for m=1 to nm
      mt$(m) = trou$
      #w.gr "spritexy? zone";str$(m);" x y"
      #w.gr "place ";x;" ";y+20;";|";mt$(m)
    next
    #w.gr "flush ;discard"
    #w.gr "color green"
  wait
 
  [valider]
    #w.gr "when mouseMove"
    #w.lb "selection? mot$"
    mt$(nz) = mot$
    #w.gr "spritexy? zone";str$(nz);" x y"
    lbx = 0
    lby = -200
    #w "refresh"
    if len(mot$)<len(trou$) then     ' essai de centrage de l'affichage du mot...
      nsp = int((len(trou$)-len(mot$))/2)+3
      mot$ = space$(nsp)+mot$+space$(nsp)
    end if
    #w.gr "place ";x-5;" ";y+20;";|";mot$  ' au besoin ajuster la largeur à afficher pour correspondre à trou$
    #w.gr "flush ;discard"
    mc = 0
    for m = 1 to nm
      if mt$(m) = word$(lrmat$(m),1,";") then mc = mc + 1
    next
    if mc = nm then
      call message 15,20,"Bravo !  tout les mots sont justes !"
    else
      call message 15,20,""
    end if
    #w.gr "when mouseMove XY"
  wait
 
  [makeSprites]
     #w.gr "backcolor black; place 0 0 ;boxfilled 1 1"
     #w.gr "place 0 1 ; box 1 2"
     #w.gr "getbmp Curseur 0 0 1 2"
     #w.gr "addsprite Curs Curseur"   ' create sprite
     unloadbmp "Curseur"
     ' #w.gr "spritevisible Curs off"   ' hide curs

      'admettons qu'on prépare 10 sprites pour 10 mots a trouver maximum...
     #w.gr "place 0 10 ; boxfilled 130 30"
     #w.gr "place 0 30 ; box 130 50"
     #w.gr "getbmp zone 0 10 130 40"
     for nz = 1 to 10
       #w.gr "addsprite zone";nz;" zone"
     '  #w.gr "spritevisible zone";nz;" off"
     next
     unloadbmp "zone"
   return
 
    sub message posY,fonte,txt$
        #w.grtxt "font ";textFont$;" ";fonte
        #w.grtxt "fill ";bckColor$
        #w.grtxt "backcolor ";bckColor$;" ; color ";textColor$
        #w.grtxt "place 20 ";posY+26;" ;|";txt$
    end sub
 
    FUNCTION fileExists(path$, filename$)
        'DIM info$(10,10)   must be declared at the start of the prog.
        files DefaultDir$, filename$, info$()  ' path$ = 'DefaultDir$' generally.
        fileExists = val(info$(0, 0))  'not zero if true
    END FUNCTION
 
    SUB Charge handle$
        filedialog "Fichiers de données", "Fable*.txt", fileName$
        if fileName$ <> "" then
            #w.debug "Bientôt sans doute..."
            open fileName$ for input as #show
            while eof(#show) = 0
                ligne = ligne + 1
                line input #show, lf$(ligne)
            wend
            lf$(ligne+1) = ""
            close #show
            #w.debug fileName$ 
            call mep
        end if
    end sub
 
    sub Quit handle$
        close #w
        END
    end sub
 


Pas testé avec une autre fable... ;)

@+

Gilles.

 |  |

3 Utilisateurs en ligne : 0 Administrateur, 0 Modérateur, 0 Membre et 3 Visiteurs
Utilisateurs en ligne : Aucun membre connecté