Le langage SMS est exclu sur les forums ProgBoards, tout message ne respectant pas la charte sera déplacé, modifié, ou supprimé par nos modérateurs.

Forum Langages » BASIC » petite question pour pendu

devil149
Visiteur
Citer Windows NT Mozilla 4 - Posté le 02/02/2010 à 17:31
salut !! c'est encore moi
j'essaye de faire un pendu sur QB mais je rencontre quelque petits problémes :
existe-t-il une commande pour que l'ordi prenne un mot au hasard ( randomize timer pour des mots en clair xD) (question)
si non comment je peux faire sans (question)
merci
bye
Freem
Modérateur
RemonterCiter Linux Mozilla 5 - Posté le 02/02/2010 à 18:31
Il n'y a pas de commande toute faite.

En revanche, le faire est très simple.
Il te suffit de déclarer un tableau de string (prenons 10 strings, une par mot, par exemple).
Puis de générer un nombre 'X' aléatoire entre 0 et 9 compris (le 0 compte en informatique, ce qui fait 10 possibilités. C'est traître au début, mais tu finiras par t'y faire et même par trouver ça super logique).
Ensuite, pour retrouver le mot, tu prends celui qui se trouve dans la case 'X'.

Si tu n'as pas encore vu les tableaux, je te conseille l'aide de QB, qui, selon mes souvenirs, est très compréhensible à ce sujet. (Sûrement mieux que si c'était moi qui expliquais en fait)
Tu me dis, j'oublie. Tu m'enseignes, je me souviens. Tu m'impliques, j'apprends. - Benjamin Franklin
SFLPMEA
ProgBoarder
RemonterCiter Windows XP Firefox 3 - Posté le 02/02/2010 à 23:23
(héhé Salutations.

L’ordinateur ne peut rien inventer de toute pièce (surtout pas un mot) mais tu peux lui faire ‘choisir’ un mot au hasard à condition de lui dire où le prendre, une liste. Le dictionnaire de l’officiel du scrabble comporte plus de 364.000 mots (voir le sujet un dictionnaire en qbasic). Pourquoi ne pas s’en servir ? D’où le petit programme ci-dessous et tu pourras en extraire ce qui t’intéresse :

' ***** Recherche d'un mot

OPTION BASE 1: DEFSTR A-Z: CLOSE
WIDTH 80, 50: CLS

OPEN "C:\DICO\DIC_ODS3.ODS" FOR RANDOM AS #2 LEN = 32' (NE2&)
FIELD #2, 31 AS F.MOT, 1 AS F.SUP

NEF& = LOF(2) / 32
Lg% = 10 ' Nombre de caracteres (modifiable)
RANDOMIZE TIMER
LOCATE 5, 20: COLOR 11: PRINT "Presser une touche (* pour FIN)"


EE1.AUTRE: INK = INKEY$: IF INK = "" GOTO EE1.AUTRE

IF INK = "*" THEN END

DO
NE2& = INT(RND * NEF&) + 1 ' pour éviter 0
GET #2, NE2&
Mot = F.MOT: SUP = F.SUP

LOOP UNTIL LEN(RTRIM$(Mot)) >= Lg%
LOCATE 10, 20: COLOR 15: PRINT USING "###### &"; NE2&; Mot + SPACE$(25)

GOTO EE1.AUTRE


(héhé Salutations.
Moi, mon ordinateur, je l'ai baptisé "Billy" ...
En remerciement, je reçois beaucoup de pages bleues !
Freem
Modérateur
RemonterCiter Windows NT Firefox 3 - Posté le 03/02/2010 à 01:59
Hum...

Je dois l'admettre, il est rare que je lise tes codes, SFLPMEA.
Et je sais que tu as du mal à utiliser d'autres instructions que les do...loop et if, également.

Seulement, je me demande (aucun rapport avec le sujet, je précise) pourquoi tu n'utilises pas une boucle DO ... LOOP WHILE pour lire la touche? Avec éventuellement une condition pour sortir si le caractère est celui qui sert à sortir.

En somme, à peu près ceci:


DO
WHILE (ink=inkey$)="" WEND
NE2& = INT(RND * NEF&) + 1 ' pour éviter 0
GET #2, NE2&
Mot = F.MOT: SUP = F.SUP
LOCATE 10, 20: COLOR 15: PRINT USING "###### &"; NE2&; Mot + SPACE$(25)
LOOP UNTIL ink="*"



Bon, je sais qu'il est difficile de changer une habitude de codage (j'ai encore tendance à utiliser certaines fonctions C quand je fais du C++ après tout) mais je reconnaît avoir du mal à comprendre (pas accepter hein (clein d'oeil) ) pourquoi ne pas utiliser des boucles, qui permettent, via une indentation automatique (ça donne une arborescence dans le code du coup) de savoir ou se situe la fin de la boucle? (je ne sais plus si QB le fais, mais pour les autres langages, j'ai du mal à imaginer la vie sans ça (langue) )

Enfin, niveau efficacité du code, c'est la même chose.
Par contre, je me suis demandé comment dans ton code, tu pourrais t'en sortir si l'un des mots faisait plus de 32 caractères? (ok, c'est peu probable, surtout dans la langue française mais...) En cas d'exception ou de fichier corrompu, comment peux tu réagir?
Tu me dis, j'oublie. Tu m'enseignes, je me souviens. Tu m'impliques, j'apprends. - Benjamin Franklin
SFLPMEA
ProgBoarder
RemonterCiter Windows XP Firefox 3 - Posté le 03/02/2010 à 12:02
(héhé Salutations.

Et oui, les vieilles habitudes ….
Il est difficile d’en changer, surtout quand elles donnent de bons résultats.
Utiliser les boucles pour demander une option ? Tout simplement parce qu’ une étiquette bien conçue et facilement repérable permet de remplacer une remarque explicative, parfois indispensable ( (question) ) pour comprendre le déroulement des opérations.
Nous avons droit à 40 caractères. Sans aller jusque là, il faut dire le principal et l’essentiel. Exemple (tiré de la recherche de mots dans l’officiel du scrabble) :

A02.OPTION: K = INKEY$: IF K = "" GOTO A02.OPTION
SELECT CASE K
CASE CHR$(27):
E03.CEFINI: COLOR 15: CLOSE : KILL "C:\DICO\SELECTIO.DIC"
END

CASE "*", "æ": GOTO A01.NOUVEAU
CASE CHR$(0) + "H": NE2H& = NE2H& - 1
CASE CHR$(0) + "I": NE2H& = NE2H& - 23
CASE CHR$(0) + "P": NE2H& = NE2H& + 1
CASE CHR$(0) + "Q": NE2H& = NE2H& + 23
CASE "-": NE2H& = NE2H& - 500
CASE "+": NE2H& = NE2H& + 500
CASE ELSE: GOTO A02.OPTION
END SELECT
IF NE2H& < 1 THEN NE2H& = 1: BEEP
IF NE2H& > Nf2.Tot& THEN NE2H& = Nf2.Tot&: BEEP
GOSUB A01.AFFICHAGE: GOTO A02.OPTION


Tu peux demander la fin du programme, une autre recherche, la ligne précédente, la page précédente, la ligne suivante, la page suivante, la ligne majorée de 500, ou minorée de 500, soit 8 possibilités. Mettre tout cela à l’intérieur du « looping » devrait être possible, peut-être avec des exit, mais les choses ne seraient pas plus claires.
N’avoir que des DO … LOOP ? Je ne sais pas si c’est une solution de clarté. Notamment dans le cas de plusieurs niveaux. Même avec l’indentation (que l’on doit se faire), surtout si les lignes d’un niveau sont fort nombreuses et il peut arriver que tu ne saches plus trop à quel DO correspond un LOOP (on s’y retrouve toujours, mais … ).
Il y a bien d’autres façons de rendre un programme clair et compréhensif pour tous.
(gêné) Je reconnais que je n’ai pas toujours appliqué ce principe.
Tu me dis :

CitationPar contre, je me suis demandé comment dans ton code, tu pourrais t'en sortir si l'un des mots faisait plus de 32 caractères ? (ok, c'est peu probable, surtout dans la langue française mais...) En cas d'exception ou de fichier corrompu, comment peux tu réagir ?


Tiré du programme de recherche pour le jeu du pendu :

OPEN "C:\DICO\DIC_ODS3.ODS" FOR RANDOM AS #2 LEN = 32' (NE2&)
FIELD #2, 31 AS F.MOT, 1 AS F.SUP


Donc, un mot ne peut comporter plus de 31 caractères (en pratique 25 suffiraient).
Si le fichier est corrompu, le récupérer à partir de la sauvegarde. Si tu n’as pas de sauvegarde : le recréer entièrement …

(héhé Salutations.
Moi, mon ordinateur, je l'ai baptisé "Billy" ...
En remerciement, je reçois beaucoup de pages bleues !
Freem
Modérateur
RemonterCiter Windows XP Firefox 3 - Posté le 03/02/2010 à 15:29
Je trouve qu'une boucle (et pas que les do loop d'ailleurs) rend le code plus lisible, du fait que déjà, selon l'endroit ou se situe la condition, on peut deviner si le retour se fait vers le début ou la fin.
Et puis, avec une indentation correcte, il est difficile de ne pas voir dans quelle boucle on se trouve.
Quand aux exit, continue et autres, ils ne servent pas à grand chose, pour ne pas dire à rien (sauf peut-être dans un cas ou deux), puisqu'ils nécessitent un IF. Vu qu'il y à un IF, autant mettre le code à ne pas exécuter dans le bloc IF (sourire)

Quand je parlais de corruption de fichier, je disais, admettons qu'un utilisateur, bien ou mal intentionné, décide de modifier le fichier (ajouter un ou plusieurs mots). Il fait une faute de frappe et oublie de mettre un retour chariot.
Je me demandais ce qu'il se passe si la ligne dépasse du coup les 31 caractères?
Tu me dis, j'oublie. Tu m'enseignes, je me souviens. Tu m'impliques, j'apprends. - Benjamin Franklin
devil149
Visiteur
RemonterCiter Windows NT Mozilla 4 - Posté le 03/02/2010 à 18:51
salut !!
mon debut de programme :


CLS
a= manger
b= papa
INPUT " taper une lettre entre a et b";reponse
WHILE ( reponse=a)
PRINT" mot en 6 lettres"
WEND
WHILE (reponse=b)
PRINT " mot en 4 lettres"
WEND



pouvez- vous me corriger svp sa marche pas =(
je sais c'est un programme très simple mais je debute =)
bye

Edit:
Ajout des balises [ CODE ] et [ /CODE ]
Si tu pouvais les mettre seul la prochaine fois... Il y à un bouton fait pour ça, ça permet aux lecteurs de mieux lire ton code et donc, de mieux répondre. Merci de ta compréhension.

Edité par Freem ( 04/02/2010 21:45:25 )
SFLPMEA
ProgBoarder
RemonterCiter Windows XP Firefox 3 - Posté le 03/02/2010 à 22:36
(héhé Salutations.

Tu pourrais écrire plus simplement :

CLS
INPUT "A pour Mot de 5 lettres, B pour 7 lettres"; A$
SELECT CASE UCASE$(A$)
CASE "A": Nb.Lettres% = 5
CASE "B": Nb.Lettres% = 7
END SELECT
PRINT USING "Nombre de lettres ##"; Nb.Lettres%


(héhé Salutations.
Moi, mon ordinateur, je l'ai baptisé "Billy" ...
En remerciement, je reçois beaucoup de pages bleues !
devil149
Visiteur
RemonterCiter Windows NT Mozilla 4 - Posté le 04/02/2010 à 17:10
mais dans ton programme il n'y a pas les mots (question)
devil149
Visiteur
RemonterCiter Windows NT Mozilla 4 - Posté le 04/02/2010 à 17:18
et je ne veux pas annoncer tout de suite le nombre de lettres ^^
c'est pour choisir au hasard; là il n'y que 2 mots pour faire un exemple
merci
bye
Freem
Modérateur
RemonterCiter Linux Opera 9 - Posté le 04/02/2010 à 21:53
SFLPMEA à montré la meilleure réponse, pour ce qui est des conditions.
Les boucles (while, for et do) ne servent pas à vérifier une condition.
L'exécution conditionnelle (faire ceci ou cela selon la situation) se fait avec les mots clés: "IF" et "SELECT CASE"

Pour ton problème, en revanche, si ton code ne fonctionne pas, c'est parce que tu n'as pas mis de " autour du contenu de tes variables. Donc, la variable a prends la valeur de la variable manger, mais pas le mot "manger"

Pour ce qui est du hasard, il te faudra utiliser "RAND" pour initialiser la réponse, si mes souvenirs sont bons. Je te suggère de lire la documentation de QB4.5 pour les détails, il me semble qu'il y à même un exemple...

Et pas de souci pour le début, on à tous débuté un jour.

Edité par Freem ( 04/02/2010 21:57:35 )
Tu me dis, j'oublie. Tu m'enseignes, je me souviens. Tu m'impliques, j'apprends. - Benjamin Franklin

Poster une réponse

STOP aux fautes volontaires !
Message
Formatage
Note: pour partager du code source, merci d'utiliser le wall !
Smileys (sourire) (yekyek) (clein d'oeil) (désapprouve) (triste) (cool) (langue) (confus) (gêné) (neutre) (eek) (surpris) (diable) (flèche) (exclamation) (question) (diable) (idée) (méchant)
Pseudonyme
Recopiez le code
v6 © Computaid SPRL 2005-2010 - Tous droits réservés - Hébergé par eTigris - Page générée en 0,023 s - Crédits - Stats
1 connecté