Méli-Mélo [2D]

Programmation avancée de jeux en PureBasic
Avatar de l’utilisateur
falsam
Messages : 7244
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Méli-Mélo [2D]

Message par falsam »

Mise à jour du 19 Juillet.
Image

:arrow: Téléchargement:
Méli Mélo V1.20 (Source + deux listes de mots.)

ou bien le code ci-dessous.

Code : Tout sélectionner

;Meli-Melo  V 1.20 by Falsam
;
;Create : 10 Juillet 2012
;Update : 19 Juillet 2012
;
;Contributor : G-Rom
;
;OS : Window, Linux, OSx
;PB 4.61
;
  
EnableExplicit

;Structure de l'application
Declare Open_MainForm() ;Fenetre principale de l'application

Declare Menu_Show() ;Affichage d'un menu horizontal
Declare Menu_Highlight(Item.i, Action.i) ;Colorise le menu

Declare List_Open() ;Ouverture d'une nouvelle liste
Declare List_Show() ;Affichage de la liste de mots à gauche de la fenêtre
Declare List_HighLight(Word.i, Action.i);Colorise la liste de mots 

Declare Grid_Create();Création du GRID

Declare Words_Read(FileWords.s) ;Lecture de la liste des mots 
Declare Words_Cut() ;Découpage et mémorisation de chaque caractére des mots de la liste
Declare Words_Show() ;Affichage de chaque caractére sur le GRID

Declare Word_Unselect() ;Déselectionne un mot ou une suite de caractére placé sur la grille

Declare Start()


;#FileWords est placé ici pour éviter le message suivant 
;Le numero d'objet #file est trés élevé (au dessus de 1000) Ëtes vous sûr ?
Enumeration 
  #FileWords             ;Fichier de mots à ouvrir
EndEnumeration
  
Enumeration 0 Step 100  ;List de mots (100 mots maxi)
  #Words_ID_START  
  #Words_ID_END 
EndEnumeration
  
Enumeration 101 Step 2601 ;Grille de 50 x 50
  #Grid_ID_START  
  #Grid_ID_END 
EndEnumeration
  
Enumeration 2900 Step 10 ;Menu
  #Menu_Id_Start
  #Menu_Id_End
EndEnumeration
  
Enumeration 3000
  #GridFont              ;Police d'affichage des lettres de la grille
  #WordFont              ;Police d'affichage des mots 
  #MenuFont              ;Police du menu 
   
  #Mainform              ;Fenetre
    
  #Menu_Hover            ;Item menu survolé
  #Menu_Leave            ;Item menu non survolé
  #Menu_Select           ;Iteù menu sélectionné
    
  #WrapperList           ;Container de la liste des mots 
  
  #Word_Hover            ;Un mot de la liste est survolé
  #Word_Leave            ;Un mot de la liste n'est plus sélectionné
  #Word_Select           ;Un mot de la liste est sélectionné
  #Word_find             ;Un mot de la liste est trouvé  
EndEnumeration
  
  
;Mots à trouver qui figureront sur la gauche de la fenêtre
Structure KeyWord
  Word.s                 ;Mot 
  IdGadget.i             ;Identifiant du canvas affichant le mot
  KeyWord.s              ;Clé (Coordonnées X,Y de le lettre sur la grille)
  Definition.s           ;Definition 
  Correct.b              ;Le mot est correctement placé
EndStructure
Global NewList Words.KeyWord()
  
;GRID
Global Dim Abscisses.i(0)
  
Structure Grid
  IdCell.i               ;IDentifiant de la cellule (Canvas) recevant la lettre tapé par l'utilisateur
  IdGadget.i             ;Identifiant du canvas recevant cette lettre pour reaffichage du mot
  XY.s                   ;Coordonnées X Y
  UserCharacter.s        ;Caractére selectionné par le joueur
  XCharacter.s           ;Caractére à decouvrir
  Correct.b              ;Caractére correctement positionné
EndStructure
Global NewList GridWords.Grid(), CellWidth.i, BorderSize.i
  
;Menu
Structure Menu
  IdItem.i
  Item.s
  ItemHelp.s
    
  Color.i
  HoverColor.i
  ActifColor.i
  BackColor.i
EndStructure
Global NewList GameMenu.Menu()
  
Global Buffer.s         ;Buffer de lecture de la datasection
Global X.i, Y.i         ;Taille de la grille
Global Z.i              ;Nombre de mots à découvrir
Global UserKeyWord.s    ;Cle de positionnement de mot proposée par le joueur
Global GameFinish.b     ;la partie est terminée
  
Global WordSelect.i     ;Rang du mot à découvrir
Global MenuSelect.i     ;Menu item selectionné


Define.l Event, WEvent, MEvent, GEvent, TEvent
  
Global WindowStyle.i=#PB_Window_MinimizeGadget|#PB_Window_MaximizeGadget|#PB_Window_ScreenCentered|#PB_Window_SizeGadget
  
;Couleur de la fenêtre et du wrapper
Global WindowColor.i, WrapperColor.i
  
;Couleur des mots 
Global WordColor, WordHoverColor.i, WordSelectColor.i
  
;Dessin des cercles
Global h.i, a.i, xx.f, yy.f
  

;
; Fenetre principale (AFfichage de la liste des mots, affichage de la grille)
Procedure Open_MainForm()
   
  ;La fenetre s'adapte au nombres de mots et à la taille de la grille
  OpenWindow(#Mainform, 0, 0, 320+(CellWidth*(X+1)), 50+(CellWidth*(Y+1)), "Meli Melo", WindowStyle)
  SetWindowColor(#Mainform, WindowColor)
    
  ;Affichages de la liste des mots à découvrir à gauche de l'écran
  ScrollAreaGadget(#WrapperList, 10, 63, 280, Y*CellWidth, 300, (ListSize(Words()))*23)
  SetGadgetColor(#WrapperList, #PB_Gadget_BackColor, WrapperColor) 
  List_Show()
  CloseGadgetList()
  Grid_Create()    
EndProcedure


;
;Affichage d'un menu horizontal
Procedure Menu_Show()
  Protected IdGadget.i, N.i, X.i, Y.i
  ForEach(GameMenu())
    GameMenu()\BackColor = RGB(105, 105, 105)
    GameMenu()\Color = RGB(255, 255, 255)
    GameMenu()\HoverColor = RGB(50, 205, 50)
    GameMenu()\ActifColor = RGB(50, 205, 50)
      
    IdGadget = #Menu_Id_Start+N
    CanvasGadget(IdGadget, 10+105*N, 25, 100, 32)
    SetGadgetData(IdGadget, N)
      
    StartDrawing(CanvasOutput(IdGadget))
    Box(0,0,100,32,WindowColor)
    RoundBox(0,0,100,32,4,4,GameMenu()\BackColor)
    DrawingMode(#PB_2DDrawing_Transparent)
    DrawingFont(FontID(#MenuFont))
    X = (100-TextWidth(GameMenu()\Item))/2
    Y = (32-TextHeight(GameMenu()\Item))/2
    DrawText(X,Y,GameMenu()\Item, GameMenu()\Color)
    StopDrawing()
      
    N+1
  Next    
EndProcedure
  
  
;
;Colorise le menu
Procedure Menu_Highlight(Item.i, Action.i)
  Protected X.i, Y.i
    
  SelectElement(GameMenu(), GetGadgetData(Item))
  
  StartDrawing(CanvasOutput(Item))
  DrawingFont(FontID(#MenuFont))
    
  X = (100-TextWidth(GameMenu()\Item))/2
  Y = (32-TextHeight(GameMenu()\Item))/2
    
  Select Action
    Case #Menu_Hover
      RoundBox(0,0,100,32,4,4,GameMenu()\BackColor)
      DrawingMode(#PB_2DDrawing_Transparent)
      DrawText(X,Y,GameMenu()\Item, GameMenu()\HoverColor)      
            
    Case #Menu_Leave
      RoundBox(0,0,100,32,4,4,GameMenu()\BackColor)
      DrawingMode(#PB_2DDrawing_Transparent)
      DrawText(X,Y,GameMenu()\Item, GameMenu()\Color)
        
    Case #Menu_Select
      RoundBox(0,0,100,32,4,4,GameMenu()\ActifColor)
      DrawingMode(#PB_2DDrawing_Transparent)
      DrawText(X,Y,GameMenu()\Item, GameMenu()\Color)
      MenuSelect = Item  
  EndSelect
    
  StopDrawing()      
    
EndProcedure


;
;Sélection d'une nouvelle liste de mots
Procedure List_Open()
  Protected FileWords.s,  N.i
    
  FileWords = OpenFileRequester("Choisissez un fichier à charger", "*.wds", "Fichiers Textes|*.wds", 0)
  If FileWords
    
    ;Reset de l'ancienne liste
    ForEach Words()
      FreeGadget(words()\IdGadget)
    Next
    
    ;Reset de la grille
    For N=0 To ArraySize(Abscisses())-1
      FreeGadget(Abscisses(N))
    Next
    
    ForEach GridWords()
      FreeGadget(GridWords()\IdGadget)
    Next    
    
    ;Reset des structures liste de mots et GRID
    ClearList(Words())
    ClearList(GridWords())
        
    ;lecture des mots (inclus les paramétres de la grille)
    Words_Read(FileWords)
    
    ResizeWindow(#Mainform, #PB_Ignore, #PB_Ignore, 320+(CellWidth*(X+1)), 50+(CellWidth*(Y+1)))
    ResizeGadget(#WrapperList, #PB_Ignore, #PB_Ignore, #PB_Ignore, Y*CellWidth)
    SetGadgetAttribute(#WrapperList, #PB_ScrollArea_InnerHeight, (ListSize(Words()))*23)
    
    ;Mise en place de la liste des mots à gauche
    OpenGadgetList(#WrapperList)
    List_Show()
    CloseGadgetList()
    
    ;Création du grid
    Grid_Create()
    
    ;Découpage des mots de la liste en caractéres
    Words_Cut()
    
    ;Affichage de chaque catactère de la liste des mots sur le grid
    Words_Show()
    
    Menu_Highlight(MenuSelect, #Menu_Leave)
    ;Aucun mots sélectionné
    WordSelect = -1
    MenuSelect = -1
    
  EndIf  
EndProcedure


;
;Affichage de la liste des mots à gauche de la fenêtre
Procedure List_Show()
  Protected IdGadget, Row.i
  ForEach words()
    IdGadget=#Words_ID_START + Row
    CanvasGadget(IdGadget, 5, Row*22, 300, 22)
    Words()\IdGadget = IdGadget
    SetGadgetData(IdGadget, Row) ;Liaison entre le gadget et l'élement de la liste de mots 
    StartDrawing(CanvasOutput(IdGadget))
    Box(0, 0, 300, 22, WrapperColor)
    DrawingMode(#PB_2DDrawing_Transparent)
    DrawingFont(FontID(#WordFont))
    DrawText(5, 3, Words()\Definition, RGB(0, 0, 0))
    StopDrawing()
      
    Row+1
  Next
EndProcedure


;
;Colorise la liste des mots de gauche
Procedure List_Highlight(Word.i, Action.i)
    
  SelectElement(words(), GetGadgetData(Word))
      
  Select action
    Case #Word_Hover
      StartDrawing(CanvasOutput(Word))
      DrawingFont(FontID(#WordFont))
      Box(0, 0, 300, 22, WrapperColor)
      DrawingMode(#PB_2DDrawing_Transparent)
      If Word <> WordSelect
        DrawText(5, 3, Words()\Definition, WordHoverColor)
      Else
        DrawText(5, 3, Words()\Definition, WordSelectColor)
      EndIf
      StopDrawing()
            
    Case #Word_Leave
      StartDrawing(CanvasOutput(Word))
      DrawingFont(FontID(#WordFont))
      Box(0, 0, 300, 22, WrapperColor)
      DrawingMode(#PB_2DDrawing_Transparent)
  
      If Word <> WordSelect
        DrawText(5, 3, Words()\Definition, WordColor)
      Else
        DrawText(5, 3, Words()\Definition, WordSelectColor)
      EndIf
      StopDrawing()      
        
    Case #Word_Select
      ;On déselectionne le mot précédement selectionné si besoin et si le mot n'est pas déja trouvé
      If WordSelect <>-1 And GetGadgetData(WordSelect) <>-1
        SelectElement(Words(), GetGadgetData(WordSelect))
        StartDrawing(CanvasOutput(WordSelect))
        DrawingFont(FontID(#WordFont))
        Box(0, 0, 300, 22, WrapperColor)
        DrawingMode(#PB_2DDrawing_Transparent)
        DrawText(5, 3, Words()\Definition, WordColor)
        StopDrawing()
          
        SelectElement(Words(), GetGadgetData(Word))
      EndIf
        
      ;Le mot sélectionné est mise en évidence
      StartDrawing(CanvasOutput(Word))
      DrawingFont(FontID(#WordFont))
      Box(0, 0, 300, 22, WrapperColor)
      DrawingMode(#PB_2DDrawing_Transparent)
      DrawText(5, 3, Words()\Definition, WordSelectColor)         
      StopDrawing()
        
      ;Mémorisation du mot sélectionné (Canvas)
      WordSelect = Word
      
    Case #Word_find
      StartDrawing(CanvasOutput(Word))
      DrawingFont(FontID(#WordFont))
      Box(0, 0, 300, 22, WrapperColor)
      DrawingMode(#PB_2DDrawing_Transparent)
      DrawText(5, 3, Words()\Definition, WordColor)
      DrawingMode(#PB_2DDrawing_Default)
      Box(0, 12, 300, 2, RGB(255, 0, 0))
      StopDrawing()
      SetGadgetData(Words()\IdGadget, -1)
  
  EndSelect
  
EndProcedure


;
;Création du GRID
Procedure Grid_Create()
  Protected Col.i, Row.i, IdGadget.i, N.i
  ;-Mise en place des cellules vierges de la grille 
  For Col=1 To X                       
    For Row=1 To Y  
         
      ;Dessin de chaque case de la grille à 300 Px du bord gauche de la fenetre et 30Px du bord haut
      AddElement(GridWords())
      IdGadget = #Grid_ID_START + ListSize(GridWords())
      CanvasGadget(IdGadget, 300+Col*CellWidth, 30+Row*CellWidth, CellWidth-Bordersize, CellWidth-Bordersize)
        
      ;La cellule (Canvas) est assigné à cet élément de liste
      SetGadgetData(IdGadget, ListSize(GridWords())) ;Liaison 
        
      GridWords()\IdCell = ListSize(GridWords())
      GridWords()\IdGadget = IdGadget
      GridWords()\XY = RSet(Str(Col),2,"0") +  RSet(Str(Row),2,"0")
    Next
  Next  
  ;-Dessin de l’axe des abscisses de l'axe des ordonnées de la grille
  ;à 300 Px du bord gauche de la fenetre et 30 Px du bord haut
    
  For Col=1 To X ;axe des abscisses 
    IdGadget = CanvasGadget(#PB_Any, 300+Col*CellWidth, 30, CellWidth-Bordersize, CellWidth-BorderSize)
    Abscisses(N) = IdGadget
    StartDrawing(CanvasOutput(IdGadget))
    DrawingMode(#PB_2DDrawing_Transparent)
    DrawingFont(FontID(#GridFont))
    DrawText(5, 5, RSet(Str(Col),2,"0"), RGB(128, 128, 128))
    StopDrawing()
    N+1
    ReDim Abscisses(N)
  Next
  
  For Row=1 To Y ;axe des ordonnées
    IdGadget = CanvasGadget(#PB_Any, 300, 30+Row*CellWidth, CellWidth-Bordersize, CellWidth-Bordersize)
    Abscisses(N) = IdGadget
    StartDrawing(CanvasOutput(IdGadget))
    DrawingMode(#PB_2DDrawing_Transparent)
    DrawingFont(FontID(#GridFont))
    DrawText(5, 5, RSet(Str(Row),2,"0"), RGB(128, 128, 128))
    StopDrawing()
    N+1
    ReDim Abscisses(N)
  Next
  
EndProcedure


;
;Lecture des mots à découvrir et mémorisation dans la liste des mots
Procedure Words_Read(FileWords.s)
  Protected Buffer.s
    
  ;Lecture du fichier de mots
  If ReadFile(#FileWords, FileWords)
    Buffer = ReadString(#FileWords)
      
    ;Dimension de la grille à générer
    X = Val(StringField(Buffer,1,"/")) ;Nombre de cases horizontales 
    Y = Val(StringField(Buffer,2,"/")) ;Nombre de cases verticales 
    Z = Val(StringField(Buffer,3,"/")) ;Nombre de mots 
    
    While Eof(#FileWords) = 0
      Buffer = ReadString(#FileWords)
      AddElement(Words())
      words()\Word = StringField(Buffer,1,",")
      Words()\KeyWord = StringField(Buffer,2,",")
      Words()\Definition = StringField(Buffer,3,",")
    Wend
    CloseFile(#FileWords)  
      
  Else
    MessageRequester("Information","Impossible d'ouvrir le fichier!")
  EndIf      
EndProcedure


;
;Découpage et mémorisation de chaque caractére des mots de la liste
Procedure Words_Cut()
  Protected N.i
    
  ForEach Words()
    For N=1 To Len(Words()\Word)
      ForEach(GridWords())
        If GridWords()\XY = StringField(Words()\KeyWord, N, " ")
          GridWords()\XCharacter = Mid(Words()\Word, N, 1)
        EndIf
      Next
    Next
  Next
EndProcedure


;
;Affichage de chaque caractére sur le grid
Procedure Words_Show()
  ForEach GridWords()
    SetActiveGadget(GridWords()\IdGadget)
    StartDrawing(CanvasOutput(GridWords()\IdGadget))
    DrawingMode(#PB_2DDrawing_Transparent)
    DrawingFont(FontID(#GridFont))
    X = (CellWidth-TextWidth(GridWords()\XCharacter))/2
    Y = (CellWidth-TextHeight(GridWords()\XCharacter))/2
    DrawText(X, Y, GridWords()\XCharacter, RGB(0, 0, 0))
    StopDrawing()
    GridWords()\UserCharacter = ""    
  Next
EndProcedure


;
;Déselectionne un mot ou une suite de caractére placé sur la grille
Procedure Word_Unselect()
  ForEach GridWords()
    If GridWords()\UserCharacter<>"" 
      GridWords()\UserCharacter=""
      SetActiveGadget(GridWords()\IdGadget)
      StartDrawing(CanvasOutput(GridWords()\IdGadget))
      DrawingMode(#PB_2DDrawing_Default)
      Box(0, 0, CellWidth-BorderSize, CellWidth-BorderSize, RGB(255, 255, 255))
      If GridWords()\Correct=#True
        DrawingMode(#PB_2DDrawing_Outlined)
        For h = 2 To 4
          For a = 0 To 360
            xx.f = (CellWidth/2) + (((CellWidth-BorderSize*2)/2)-h) * Cos(a  * #PI / 180)
            yy.f = (CellWidth/2) + (((CellWidth-BorderSize*2)/2)-h) * Sin(a  * #PI / 180)
            Plot(xx-1,yy-1,$FF)  
          Next   
        Next      
      EndIf      
      DrawingFont(FontID(#GridFont))
      DrawingMode(#PB_2DDrawing_Transparent)
      X = (CellWidth-TextWidth(GridWords()\XCharacter))/2
      Y = (CellWidth-TextHeight(GridWords()\XCharacter))/2
      DrawText(X, Y, GridWords()\XCharacter, RGB(0, 0, 0))              
      StopDrawing()   
    EndIf  
  Next  
EndProcedure


;Start
Procedure Start()
  ;Taille d'une cellule du tableau
  CellWidth = 33
  BorderSize = 2
    
  ;Police à utiliser pour l'affichage de chaque lettre
  LoadFont(#GridFont, "Arial", 13, #PB_Font_Bold) 
    
  ;Police à utiliser pour l'affichage des définitions de mots
  LoadFont(#WordFont, "Arial", 11) 
    
  ;Police à utiliser pour le menu
  LoadFont(#MenuFont, "Arial", 13, #PB_Font_Bold)
    
  ;Initialisation des couleurs 
  WindowColor= RGB(255, 219, 125)
  WrapperColor = RGB(255, 219, 160)
    
  WordColor = RGB(0, 0, 0)
  WordSelectColor = RGB(0, 128, 0)
  WordHoverColor = RGB(255, 0, 0)
        
  ;Lecture des mots à découvrir et stockage dans la liste des mots
  ;le fichier par defaut est "melimelo.wds" et se trouve dans le meme dossier que l'éxécutable
  Words_Read("melimelo.wds")  
        
  ;Ouverture de la fenetre (AFfichage de la liste des mots, affichage de la grille)
  Open_MainForm()
    
  ;Affichage du menu
  AddElement(GameMenu())
  GameMenu()\Item = "LISTES"
  AddElement(GameMenu())
  GameMenu()\Item = "VALIDER"
    
  Menu_Show()
  
  ;Découpage des mots de la liste en caractéres
  Words_Cut()
  
  ;Affichage de chaque catactère de la liste des mots sur le grid
  Words_Show()
    
  ;Aucun mots et aucun menu sélectionné
  WordSelect = -1
  MenuSelect = -1
    
  ;Message d'aide succinct
  Buffer = "Commencer par choisir un mot à découvrir dans la liste" + #CRLF$
  Buffer + "des mots, puis cliquer chaque lettre du mot dans la grille." + #CRLF$
  Buffer + "Pour chaque mot placé, cliquer sur le bouton Valider."
    
  MessageRequester("Information", Buffer)
    
EndProcedure
 
start()
  
Repeat
  Event  = WaitWindowEvent(10)
  WEvent = EventWindow() ;different de WindowEvent() :p (oui je me suis fais avoir !!!)
  MEvent = EventMenu()
  GEvent = EventGadget()
  TEvent = EventType()
    
  Select Event
    Case #PB_Event_Gadget
      Select GEvent          
        Case #Words_ID_START To #Words_ID_END
            
          ;-Le joueur survole/sélectionne une définition (Ou un mot à trouver)
          If GetGadgetData(GEvent)<>-1 ;Un mot déja positionné ne sera pas pris en compte
            Select TEvent    
              Case #PB_EventType_MouseEnter
                SetGadgetAttribute(GEvent, #PB_Canvas_Cursor, #PB_Cursor_Hand)
                List_Highlight(GEvent, #Word_Hover) ;le mot survolé est mis en évidence
    
              Case #PB_EventType_LeftButtonUp                                 
                List_Highlight(GEvent, #Word_Select) ;le mot selectionné est mis en évidence
                Word_Unselect() ;Annulation des lettres en cours de sélection sur la grille.
      
              Case #PB_EventType_MouseLeave           
                List_Highlight(GEvent, #Word_Leave)
                  
            EndSelect
              
          EndIf
                            
        ;-Le joueur survole/clique sur une case de la grille
        Case #Grid_ID_START To #Grid_ID_END
            
          Select TEvent  
            Case #PB_EventType_MouseEnter
              SetGadgetAttribute(GEvent, #PB_Canvas_Cursor, #PB_Cursor_Hand)
                            
            Case #PB_EventType_LeftButtonUp
              If WordSelect <> -1 
                StartDrawing(CanvasOutput(GEvent))
                DrawingMode(#PB_2DDrawing_Outlined)
                  
                ;Dessin des cercles 
                For h = 2 To 4
                  For a = 0 To 360
                    xx.f = (CellWidth/2) + (((CellWidth-BorderSize*2)/2)-h) * Cos(a  * #PI / 180)
                    yy.f = (CellWidth/2) + (((CellWidth-BorderSize*2)/2)-h) * Sin(a  * #PI / 180)
                    Plot(xx-1,yy-1,$FF)
                  Next 
                Next      
                  
                SelectElement(GridWords(), GetGadgetData(GEvent)-1)
                DrawingMode(#PB_2DDrawing_Transparent)
                DrawingFont(FontID(#GridFont))
                X = (CellWidth-TextWidth(GridWords()\XCharacter))/2
                Y = (CellWidth-TextHeight(GridWords()\XCharacter))/2
                DrawText(X, Y, GridWords()\XCharacter, RGB(255, 0, 0))
                StopDrawing()
                
                ;Ajout du caractere dans la grille de suggestion de mot
                SelectElement(GridWords(), GetGadgetData(GEvent)-1)
                GridWords()\UserCharacter = GridWords()\XCharacter
                GridWords()\IdGadget = GEvent
              Else
                MessageRequester("Information", "Sélectionner un mot dans la liste avant de cliquer sur une lettre!")
              EndIf
          EndSelect
            
        Case #Menu_Id_Start  
          ;-Ouvrir une nouvelle liste de mot
          Select TEvent  
            Case #PB_EventType_MouseEnter
              Menu_Highlight(GEvent, #Menu_Hover)
              SetGadgetAttribute(GEvent, #PB_Canvas_Cursor, #PB_Cursor_Hand)
                
            Case #PB_EventType_LeftButtonUp
              Menu_Highlight(GEvent, #Menu_Select)
              List_Open()
        
            Case #PB_EventType_MouseLeave  
              Menu_Highlight(GEvent, #Menu_Leave)
                
          EndSelect
            
            
        Case #Menu_Id_Start + 1
          ;-Validation du mot
          Select TEvent  
            Case #PB_EventType_MouseEnter
              Menu_Highlight(GEvent, #Menu_Hover)
              SetGadgetAttribute(GEvent, #PB_Canvas_Cursor, #PB_Cursor_Hand)
                
            Case #PB_EventType_LeftButtonUp 
              Menu_Highlight(GEvent, #Menu_Select)
              If WordSelect <> -1 ;Un mot doit être sélectionner
           
                ;Creation de la clé joueur en fonction des lettres sélectionnées 
                UserKeyWord=""
                ForEach GridWords()
                  If GridWords()\UserCharacter<>""
                    UserKeyWord + GridWords()\XY+" "  
                  EndIf  
                Next
              
                ;Quel est le mot à découvrir sélectionné par le joueur
                SelectElement(Words(), WordSelect)
            
                ;Comparaison de la clé joueur avec la clé de positionnement du mot
                If Trim(Words()\KeyWord) = Trim(UserKeyWord)
                  ;Désactivation du mot sélectionné
                  ;SetGadgetData(words()\IdGadget, -1)
                  WordSelect = -1
                                               
                  ;Le caractere à decouvrir est correct
                  ;Il sera constament afficher sur la grille 
                  ForEach GridWords()
                    If GridWords()\UserCharacter<>""
                      GridWords()\Correct=#True
                    EndIf  
                  Next            
                
                
                  ;Le mot de la liste est découvert
                  words()\Correct = #True
                
                  List_Highlight(Words()\IdGadget, #Word_find)
                  Word_Unselect()
                
                  MessageRequester("Yeahhhhh", "Bravo")
  
                  ;les mots sont ils tous découvert ?
                  GameFinish = #True
                  ForEach Words()
                    If words()\Correct = #False
                      GameFinish = #False
                    EndIf
                  Next
                
                  If GameFinish = #True
                    MessageRequester("Information","Vous avez découvert tous les mots")
                  EndIf
                    
                Else
                  MessageRequester("Ooops !!", "Le mot n'est pas à la bonne place")
                  Word_Unselect()  
                  
                EndIf                  
              EndIf  
                
            Case #PB_EventType_MouseLeave  
              Menu_Highlight(GEvent, #Menu_Leave)

          EndSelect        
      EndSelect
          
    Case #PB_Event_CloseWindow
      End
  EndSelect
ForEver
Deux fichiers texte à enregistrer dans le même dossier que l’exécutable de Méli Mélo.
MeliMelo.wds C'est le fichier par defaut ouvert par Méli Mélo

Code : Tout sélectionner

06/06/8
BOIS,0105 0205 0305 0405,Tissu végétal.
ECORCE,0106 0206 0306 0406 0506 0606,Revêtement extérieur du tronc.
NIP,0202 0203 0204,famille des Pinacées.
ENICAR,0102 0202 0302 0402 0502 0602,Absorbent l'eau et les minéraux.
SAULE,0101 0201 0301 0401 0501,Famille des Salicacées.
SEVE,0101 0102 0103 0104,Circule principalement dans le xylème.
TRONC,0601 0602 0603 0604 0605,Protégé par le deuxieme mot.
FIELULE,0303 0304 0403 0404 0503 0504 0505,Le mot à découvrir
Insectes.wdsDes noms d'insectes à trouver pour découvrir le dernier insecte de la liste.

Code : Tout sélectionner

12/12/23
ABEILLE,0606 0706 0806 0906 1006 1106 1206,Abeille
BOURDON,0112 0212 0312 0412 0512 0612 0712,Bourdon
BOUSIER,0506 0607 0708 0809 0910 1011 1112,Bousier
CIGALE,0504 0604 0704 0804 0904 1004,Cigale
COCCINELLE,0101 0102 0103 0104 0105 0106 0107 0108 0109 0110,Coccinelle
TEUQIRC,0210 0310 0410 0510 0610 0710 0810,Criquet
EPHEMERE,1203 1204 1205 1206 1207 1208 1209 1210,Ephemere
FOURMI,0507 0607 0707 0807 0907 1007,Fourmi
NOLERF,0712 0812 0912 1012 1112 1212,Frelon
NOLLIRG,1104 1105 1106 1107 1108 1109 1110,Grillon
EPEUG,0806 0905 1004 1103 1202,Guépe
HANNETON,0201 0301 0401 0501 0601 0701 0801 0901,Hanneton
LIBELLULE,0302 0303 0304 0305 0306 0307 0308 0309 0310,Libellule
EHCUOM,0408 0508 0608 0708 0808 0908,Mouche
MOUSTIQUE,0403 0503 0603 0703 0803 0903 1003 1103 1203,Moustique
PAPILLON,0402 0502 0602 0702 0802 0902 1002 1102,Papillon
PUCE,1008 1009 1010 1011,Puce
ESIANUP,0305 0405 0505 0605 0705 0805 0905,Punaise
SAUTERELLE,0111 0211 0311 0411 0511 0611 0711 0811 0911 1011,Sauterelle
SCARABEE,0202 0203 0204 0205 0206 0207 0208 0209,Scarabee
NOAT,0901 1001 1101 1201,Taon
ELUPIT,0209 0309 0409 0509 0609 0709,Tipule
TRMIETE,0404 0406 0407 0909 1005 1111 1211,Vit en société et ronge le bois
N'oubliez pas de poster vos propres listes de mots :)
Dernière modification par falsam le ven. 20/juil./2012 18:41, modifié 4 fois.
Configuration : Windows 11 Famille 64-bit - PB 6.03 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
dayvid
Messages : 1242
Inscription : mer. 11/nov./2009 18:17
Localisation : Poitiers (Vienne)

Re: Méli-Mélo [2D]

Message par dayvid »

Pas mal du tous Falsam comme dab quoi :)
La vie, C'est comme, Une boitte, De startis, On en voie, De toutes, Les couleurs !

Mon forum http://purebasic.forumphp3.com/index.php
Avatar de l’utilisateur
Mindphazer
Messages : 639
Inscription : mer. 24/août/2005 10:42

Re: Méli-Mélo [2D]

Message par Mindphazer »

Salut Falsam
Toujours des petits soucis d'affichage sous Mac :
Image

Sinon, pour le reste : impec'
Bureau : Win10 64bits
Maison : Macbook Pro M1 14" SSD 512 Go / Ram 16 Go - iPad Pro 32 Go (pour madame) - iPhone 15 Pro Max 256 Go
Avatar de l’utilisateur
Kwai chang caine
Messages : 6962
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Re: Méli-Mélo [2D]

Message par Kwai chang caine »

En fait j'avais pas compris le jeu :oops: :oops:
C'est en voyant l'image de MindPhaser que j'ai percuté :idea:

J'aime pas les jeux, mais je me suis pris au tiens, et on etait le groin collé avec ma femme a chercher les definitions.
On a trouvé (Je dit pas la soluce :wink: ).....on a gagné quoi ??? un nounours ??? un ballon ??? une chupa chups ??? :D

Image

En tout cas merci pour ce partage 8)
Comment arrives tu à coder tout ça en plus de ton CanvasVariation et tout ce que tu fais sur ce forum. 8O

Merci pour encore et bravo 8)
ImageLe bonheur est une route...
Pas une destination

PureBasic Forum Officiel - Site PureBasic
Avatar de l’utilisateur
venom
Messages : 3072
Inscription : jeu. 29/juil./2004 16:33
Localisation : Klyntar
Contact :

Re: Méli-Mélo [2D]

Message par venom »

Bravo falsam,

Comme d'habitude c'est top 8)






@++
Windows 10 x64, PureBasic 5.73 x86 & x64
GPU : radeon HD6370M, CPU : p6200 2.13Ghz
Avatar de l’utilisateur
falsam
Messages : 7244
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Méli-Mélo [2D]

Message par falsam »

venom a écrit :Bravo falsam, Comme d'habitude c'est top
Pas si top que ça !!! Je viens de découvrir que l’énumération des gadgets n'est pas forcement séquentiel. A partir de cette constatation je ne peux plus connaitre de manière fiable les handles du premier gadget et du dernier gadget de ma liste de mots par exemple.
Un exemple de code. Le debug montre le résultat. Il faut lancer l’exécution plusieurs fois pour voir ce que j'obtiens.

31060064
31060112
31060160
34032896 l'intrus :p
31127704
31127752

Code : Tout sélectionner

Enumeration
  #Mainform
EndEnumeration


Define.l Event, WEvent, MEvent, GEvent, TEvent

Global WindowStyle.i=#PB_Window_MinimizeGadget|#PB_Window_MaximizeGadget|#PB_Window_ScreenCentered|#PB_Window_SizeGadget

Procedure Open_MainForm()
  OpenWindow(#Mainform, 0, 0, 500, 400, "New Form", WindowStyle)
  For i=1 To 30
    IdGadget = CanvasGadget(#PB_Any, 10, 30*i, 23, 23)
    Debug idgadget
  Next
  
EndProcedure

  
Open_MainForm()

Repeat
  Event  = WaitWindowEvent(10)
  WEvent = EventWindow()
  MEvent = EventMenu()
  GEvent = EventGadget()
  TEvent = EventType()
  Select Event
    Case #PB_Event_Gadget
      Select GEvent
      EndSelect
        
    Case #PB_Event_CloseWindow
      End
  EndSelect
ForEver
Je vais devoir revoir ma copie, mais j'attends de lire vos observations sur la façon dont j'ai procédé.
Configuration : Windows 11 Famille 64-bit - PB 6.03 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
G-Rom
Messages : 3627
Inscription : dim. 10/janv./2010 5:29

Re: Méli-Mélo [2D]

Message par G-Rom »

C'est sympa ^^

voilà ma petite contribution , des cercles de meilleurs qualité ( pour la sélection )

Code : Tout sélectionner

;                 Circle(CellWidth/2, CellWidth/2, (CellWidth-BorderSize*2)/2 - 2, RGB(255, 0, 0))
;                 Circle(CellWidth/2, CellWidth/2, (CellWidth-BorderSize*2)/2 - 3, RGB(255, 0, 0))
;                 Circle(CellWidth/2, CellWidth/2, (CellWidth-BorderSize*2)/2 - 4, RGB(255, 0, 0))
                 
                For h = 2 To 4
                  For a = 0 To 360
                    xx.f = (CellWidth/2) + (((CellWidth-BorderSize*2)/2)-h) * Cos(a  * #PI / 180)
                    yy.f = (CellWidth/2) + (((CellWidth-BorderSize*2)/2)-h) * Sin(a  * #PI / 180)
                    Plot(xx-1,yy-1,$FF)
                  Next 
                Next 
Avatar de l’utilisateur
Mindphazer
Messages : 639
Inscription : mer. 24/août/2005 10:42

Re: Méli-Mélo [2D]

Message par Mindphazer »

J'ai essayé. Plusieurs fois.
En effet, il y a toujours un intrus dans la liste. Et pour ma part, c'est toujours le 17è.
Les handles 1 à 16 sont séquentiels
Les handles 18 à 30 aussi.
Il n'y a que le 17è qui est le vilain petit canard de la liste...
Bureau : Win10 64bits
Maison : Macbook Pro M1 14" SSD 512 Go / Ram 16 Go - iPad Pro 32 Go (pour madame) - iPhone 15 Pro Max 256 Go
Avatar de l’utilisateur
falsam
Messages : 7244
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Méli-Mélo [2D]

Message par falsam »

@G-Rom : Merci pour cette contribution. Les cercles sont bien mieux:) je mettrais le code à jour des que je trouve une solution pour mes handles de gadgets non séquentiels.

@MindPhaser : Tu as raison c'est le 17eme !!!! Encore plus étrange !!
Configuration : Windows 11 Famille 64-bit - PB 6.03 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
G-Rom
Messages : 3627
Inscription : dim. 10/janv./2010 5:29

Re: Méli-Mélo [2D]

Message par G-Rom »

Sans #pb_any :

Code : Tout sélectionner

Enumeration
  #Mainform
EndEnumeration


Enumeration 0 Step 30
  #RESERVED_ID_START  
  #RESERVED_ID_END 
EndEnumeration


Define.l Event, WEvent, MEvent, GEvent, TEvent

Global WindowStyle.i=#PB_Window_MinimizeGadget|#PB_Window_MaximizeGadget|#PB_Window_ScreenCentered|#PB_Window_SizeGadget

Procedure Open_MainForm()
  OpenWindow(#Mainform, 0, 0, 500, 400, "New Form", WindowStyle)
  For i=1 To 30
    CanvasGadget(#RESERVED_ID_START + i, 10, 30*i, 23, 23)
    Debug #RESERVED_ID_START + i
  Next
  
EndProcedure


Open_MainForm()

Repeat
  Event  = WaitWindowEvent(10)
  WEvent = EventWindow()
  MEvent = EventMenu()
  GEvent = EventGadget()
  TEvent = EventType()
  Select Event
    Case #PB_Event_Gadget
      Select GEvent
      EndSelect
        
    Case #PB_Event_CloseWindow
      End
  EndSelect
ForEver
Avatar de l’utilisateur
falsam
Messages : 7244
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Méli-Mélo [2D]

Message par falsam »

Voila une astuce que je vais garder précieusement. Merci beaucoup G-Rom :)
Configuration : Windows 11 Famille 64-bit - PB 6.03 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Avatar de l’utilisateur
Mindphazer
Messages : 639
Inscription : mer. 24/août/2005 10:42

Re: Méli-Mélo [2D]

Message par Mindphazer »

G-Rom a écrit :Sans #pb_any :
Ben ça c'est un truc que j'aurais pas imaginé tout seul....
Merci G-Rom...
Bureau : Win10 64bits
Maison : Macbook Pro M1 14" SSD 512 Go / Ram 16 Go - iPad Pro 32 Go (pour madame) - iPhone 15 Pro Max 256 Go
Avatar de l’utilisateur
falsam
Messages : 7244
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Méli-Mélo [2D]

Message par falsam »

Mise à jour du code dans le 1er message en tenant compte de l'aide apporté par G-Rom.

Comme ce n'est pas forcement interessant de tester cette mise à jour avec les mots de la précédente version, vous pouvez remplacer la datasection par cette nouvelle

Code : Tout sélectionner

DataSection    
  ;Taille de la grille et Nombre de mots à découvrir
  Grid: 
  Data.s "12/12/23"
  
  ;Liste des mots à trouver, coordonnées sur la grille (ColRow), Définition
  Words:
  Data.s "ABEILLE", "0606 0706 0806 0906 1006 1106 1206", "Abeille"
  Data.s "BOURDON", "0112 0212 0312 0412 0512 0612 0712", "Bourdon"
  Data.s "BOUSIER", "0506 0607 0708 0809 0910 1011 1112", "Bousier"
  Data.s "CIGALE", "0504 0604 0704 0804 0904 1004", "Cigale"
  Data.s "COCCINELLE", "0101 0102 0103 0104 0105 0106 0107 0108 0109 0110", "Coccinelle"
  Data.s "TEUQIRC", "0210 0310 0410 0510 0610 0710 0810", "Criquet"
  Data.s "EPHEMERE", "1203 1204 1205 1206 1207 1208 1209 1210", "Ephemere"
  Data.s "FOURMI", "0507 0607 0707 0807 0907 1007", "Fourmi"
  Data.s "NOLERF", "0712 0812 0912 1012 1112 1212", "Frelon"
  Data.s "NOLLIRG", "1104 1105 1106 1107 1108 1109 1110", "Grillon"
  Data.s "EPEUG", "0806 0905 1004 1103 1202", "Guépe"
  Data.s "HANNETON", "0201 0301 0401 0501 0601 0701 0801 0901", "Hanneton"
  Data.s "LIBELLULE", "0302 0303 0304 0305 0306 0307 0308 0309 0310", "Libellule"
  Data.s "EHCUOM", "0408 0508 0608 0708 0808 0908", "Mouche"
  Data.s "MOUSTIQUE", "0403 0503 0603 0703 0803 0903 1003 1103 1203", "Moustique"
  Data.s "PAPILLON", "0402 0502 0602 0702 0802 0902 1002 1102", "Papillon"
  Data.s "PUCE", "1008 1009 1010 1011", "Puce"
  Data.s "ESIANUP", "0305 0405 0505 0605 0705 0805 0905", "Punaise"
  Data.s "SAUTERELLE", "0111 0211 0311 0411 0511 0611 0711 0811 0911 1011", "Sauterelle"
  Data.s "SCARABEE", "0202 0203 0204 0205 0206 0207 0208 0209", "Scarabee"
  Data.s "NOAT", "0901 1001 1101 1201", "Taon"
  Data.s "ELUPIT", "0209 0309 0409 0509 0609 0709", "Tipule"
  Data.s "TRMIETE", "0404 0406 0407 0909 1005 1111 1211", "Vit en société et ronge le bois"
EndDataSection
Configuration : Windows 11 Famille 64-bit - PB 6.03 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Avatar de l’utilisateur
Ar-S
Messages : 9475
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: Méli-Mélo [2D]

Message par Ar-S »

Merci, il a de la gueule :mrgreen:
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Avatar de l’utilisateur
falsam
Messages : 7244
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Méli-Mélo [2D]

Message par falsam »

Ar-S a écrit :Merci, il a de la gueule :mrgreen:
Il est vrai que la présentation est plutôt austère. Pour rappel ce code est extrait d'un post de dayvid dont le sujet était comment faire une recherche d'un mot dans une grille. (Genre de mots croisés ) /me se retient de rire :p
Configuration : Windows 11 Famille 64-bit - PB 6.03 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Répondre