home *** CD-ROM | disk | FTP | other *** search
/ Planet Source Code Jumbo …e CD Visual Basic 1 to 7 / 4_2005-2006.ISO / data / Zips / Multiplaye1936731022005.psc / mBoggle / bSolver / IGrid.cls < prev    next >
Text File  |  2005-09-12  |  9KB  |  243 lines

  1. VERSION 1.0 CLASS
  2. BEGIN
  3.   MultiUse = -1  'True
  4.   Persistable = 0  'NotPersistable
  5.   DataBindingBehavior = 0  'vbNone
  6.   DataSourceBehavior  = 0  'vbNone
  7.   MTSTransactionMode  = 0  'NotAnMTSObject
  8. END
  9. Attribute VB_Name = "IGrid"
  10. Attribute VB_GlobalNameSpace = False
  11. Attribute VB_Creatable = True
  12. Attribute VB_PredeclaredId = False
  13. Attribute VB_Exposed = False
  14. Option Explicit
  15. Option Compare Text
  16.  
  17. Public Enum SearchDirection
  18.     sdUp = 1&
  19.     sdUpLeft = 2&
  20.     sdLeft = 3&
  21.     sdDownLeft = 4&
  22.     sdDown = 5&
  23.     sdDownRight = 6&
  24.     sdRight = 7&
  25.     sdUpRight = 8&
  26. End Enum
  27.  
  28. Private mblnGridCreated         As Boolean
  29. Private mblnGridPopulated       As Boolean
  30. Private mblnGetWordsOnComplete  As Boolean
  31. Private mintLettersAcross       As Integer
  32. Private mintLettersDown         As Integer
  33. Private mintMinWordSize         As Integer
  34. Private mintIndex               As Integer
  35. Private mstrDictionary()        As String
  36. Private mcolLettersInGrid       As Collection
  37. Private mcolWordsInGrid         As Collection
  38. Private mcolWordsFound          As Collection
  39.  
  40. Public Function CreateGrid(ByVal intLettersAccross As Integer, ByVal intLettersDown As Integer, Optional ByVal intMinWordSize As Integer = 4, Optional ByVal blnGetWordsOnComplete As Boolean) As Boolean
  41.     mblnGridCreated = intLettersAccross > 0 And intLettersDown > 0 And intMinWordSize > 0
  42.     If Not mblnGridCreated Then Exit Function
  43.     Set mcolLettersInGrid = New Collection
  44.     Set mcolWordsFound = New Collection
  45.     mintLettersAcross = intLettersAccross
  46.     mintLettersDown = intLettersDown
  47.     mintIndex = 0
  48.     mintMinWordSize = intMinWordSize
  49.     mblnGetWordsOnComplete = blnGetWordsOnComplete
  50.     mblnGridPopulated = False
  51.     CreateGrid = True
  52. End Function
  53.  
  54. Public Function AddLetter(ByVal strLetter As String, ByVal intColumn As Integer, ByVal intRow As Integer) As IChar
  55.     Dim objChar         As IChar
  56.     Set objChar = New IChar
  57.     If intColumn < 0 Then Exit Function
  58.     If intRow < 0 Then Exit Function
  59.     If intColumn > mintLettersAcross Then Exit Function
  60.     If intRow > mintLettersDown Then Exit Function
  61.     If Not (Letter(intColumn, intRow) Is Nothing) Then Exit Function
  62.     If mblnGridPopulated Then Exit Function
  63.     mintIndex = mintIndex + 1
  64.     mblnGridPopulated = mintIndex = mintLettersAcross * mintLettersDown
  65.     With objChar
  66.         .Char = strLetter
  67.         .Index = mintIndex
  68.         .GridX = intColumn
  69.         .GridY = intRow
  70.     End With
  71.     mcolLettersInGrid.Add objChar, intColumn & "," & intRow
  72.     Set AddLetter = objChar
  73.     If mblnGridPopulated And mblnGetWordsOnComplete Then GetWords
  74.     Set objChar = Nothing
  75. End Function
  76.  
  77. Public Property Get Letter(Optional ByVal intColumn As Integer, Optional ByVal intRow As Integer, Optional ByVal intIndex As Integer) As IChar
  78.     On Error Resume Next
  79.     If intIndex > 0 Then
  80.         Set Letter = mcolLettersInGrid(intIndex)
  81.     Else
  82.         Set Letter = mcolLettersInGrid(intColumn & "," & intRow)
  83.     End If
  84. End Property
  85.  
  86. Private Function NextLetter(ByVal intCurrentColumn As Integer, ByVal intCurrentRow As Integer, ByVal sdDirection As SearchDirection) As IChar
  87.     Dim intY            As Integer
  88.     Dim intX            As Integer
  89.     Select Case sdDirection
  90.         Case sdUp:          intX = intCurrentColumn:        intY = intCurrentRow + 1
  91.         Case sdUpLeft:      intX = intCurrentColumn - 1:    intY = intCurrentRow + 1
  92.         Case sdLeft:        intX = intCurrentColumn - 1:    intY = intCurrentRow
  93.         Case sdDownLeft:    intX = intCurrentColumn - 1:    intY = intCurrentRow - 1
  94.         Case sdDown:        intX = intCurrentColumn:        intY = intCurrentRow - 1
  95.         Case sdDownRight:   intX = intCurrentColumn + 1:    intY = intCurrentRow - 1
  96.         Case sdRight:       intX = intCurrentColumn + 1:    intY = intCurrentRow
  97.         Case sdUpRight:     intX = intCurrentColumn + 1:    intY = intCurrentRow + 1
  98.     End Select
  99.     If intX < 0 Or intX > mintLettersAcross Then Exit Function
  100.     If intY < 0 Or intY > mintLettersDown Then Exit Function
  101.     Set NextLetter = Letter(intX, intY)
  102. End Function
  103.  
  104. Public Property Get NewEnum() As IUnknown
  105. Attribute NewEnum.VB_UserMemId = -4
  106. Attribute NewEnum.VB_MemberFlags = "440"
  107.     Set NewEnum = mcolWordsFound.[_NewEnum]
  108. End Property
  109.  
  110. Public Sub GetWords()
  111.     On Error Resume Next
  112.     Dim lngPtr          As Long
  113.     Dim objWord         As iWord
  114.     Static slngIndex    As Long
  115.     Set mcolWordsInGrid = New Collection
  116.     For lngPtr = 0 To UBound(mstrDictionary)
  117.         If Len(mstrDictionary(lngPtr)) >= mintMinWordSize Then
  118.             If IsCompletable(mstrDictionary(lngPtr)) Then
  119.                 slngIndex = slngIndex + 1
  120.                 Set objWord = New iWord
  121.                 With objWord
  122.                     .Index = slngIndex
  123.                     .Text = mstrDictionary(lngPtr)
  124.                 End With
  125.                 mcolWordsInGrid.Add objWord, objWord.Text
  126.                 If Err.Number Then slngIndex = slngIndex - 1
  127.             End If
  128.         End If
  129.         DoEvents
  130.     Next
  131.     For lngPtr = 1 To mcolWordsInGrid.Count
  132.         Set objWord = GetWord(mcolWordsInGrid(lngPtr))
  133.         If Not objWord Is Nothing Then mcolWordsFound.Add objWord
  134.     Next
  135.     Set objWord = Nothing
  136. End Sub
  137.  
  138. Private Function IsCompletable(ByVal strWord As String) As Boolean
  139.     Dim lngLen          As Long
  140.     Dim intCount        As Integer
  141.     Dim strChar         As String * 1
  142.     strWord = Trim$(strWord)
  143.     lngLen = Len(strWord)
  144.     If lngLen = 0 Then Exit Function
  145.     While lngLen
  146.         strChar = Left$(strWord, 1)
  147.         strWord = Replace(strWord, strChar, vbNullString)
  148.         intCount = lngLen - Len(strWord)
  149.         If GridLetterCount(strChar) < intCount Then Exit Function
  150.         lngLen = Len(strWord)
  151.     Wend
  152.     IsCompletable = True
  153. End Function
  154.  
  155. Private Function GridLetterCount(ByVal strLetter As String) As Integer
  156.     Dim objChar         As IChar
  157.     Dim intCount        As Integer
  158.     For Each objChar In mcolLettersInGrid
  159.         If objChar.Char = strLetter Then intCount = intCount + 1
  160.     Next
  161.     GridLetterCount = intCount
  162. End Function
  163.  
  164. Public Function GetWord(Optional ByVal strWord As String) As iWord
  165.     Dim objChar         As IChar
  166.     Dim objLastChar     As IChar
  167.     Dim lngPtr          As Long
  168.     Dim strChar         As String * 1
  169.     Dim sdDirection     As SearchDirection
  170.     Dim objFinalWord    As iWord
  171.     Static sobjWord     As iWord
  172.     
  173.     If Len(strWord) Then
  174.         Set sobjWord = New iWord
  175.         sobjWord.Text = strWord
  176.         strChar = Left$(sobjWord.Text, 1)
  177.         For Each objChar In mcolLettersInGrid
  178.             If objChar.Char = strChar Then
  179.                 With objChar
  180.                     sobjWord.AddLetter .Char, .GridX, .GridY
  181.                 End With
  182.                 GetWord
  183.             End If
  184.             If sobjWord.IsComplete Then
  185.                 Set GetWord = sobjWord
  186.                 Set sobjWord = Nothing
  187.                 Exit For
  188.             Else
  189.                 sobjWord.RemoveLetter objChar.GridX, objChar.GridY
  190.             End If
  191.         Next
  192.     Else
  193.         Set objLastChar = sobjWord.Letter(intIndex:=sobjWord.FoundCharacters)
  194.         strChar = Mid$(sobjWord.Text, sobjWord.FoundCharacters + 1, 1)
  195.         For sdDirection = sdUp To sdUpRight
  196.             While objChar Is Nothing
  197.                 Set objChar = NextLetter(objLastChar.GridX, objLastChar.GridY, sdDirection)
  198.                 If sdDirection = sdUpRight Then
  199.                     If objChar Is Nothing Then
  200.                         sobjWord.RemoveLetter objLastChar.GridX, objLastChar.GridY
  201.                         Exit Function
  202.                     End If
  203.                 Else
  204.                      If objChar Is Nothing Then sdDirection = sdDirection + 1
  205.                 End If
  206.             Wend
  207.             If objChar.Char = strChar And Not sobjWord.IsLetterUsed(objChar) Then
  208.                 With objChar
  209.                     sobjWord.AddLetter .Char, .GridX, .GridY
  210.                 End With
  211.                 If Not sobjWord.IsComplete Then GetWord
  212.             End If
  213.             If sobjWord.IsComplete Then Exit Function
  214.             If Not sobjWord.IsLetterUsed(objChar) Then
  215.                 sobjWord.RemoveLetter objChar.GridX, objChar.GridY
  216.             End If
  217.             If sdDirection = sdUpRight Then
  218.                 sobjWord.RemoveLetter objLastChar.GridX, objLastChar.GridY
  219.             End If
  220.             Set objChar = Nothing
  221.         Next
  222.     End If
  223. End Function
  224.  
  225. Private Sub Class_Initialize()
  226.     Dim ff As Integer
  227.     Dim i As Long
  228.     
  229.     ff = FreeFile
  230.     Open "Word.lst" For Input As #ff
  231.         mstrDictionary = Split(Input(LOF(ff), 1), vbCrLf)
  232.     Close #ff
  233.     For i = 0 To UBound(mstrDictionary)
  234.         mstrDictionary(i) = Replace(mstrDictionary(i), "QU", "!")
  235.     Next i
  236. End Sub
  237.  
  238. Private Sub Class_Terminate()
  239.     Set mcolLettersInGrid = Nothing
  240.     Set mcolWordsInGrid = Nothing
  241.     Set mcolWordsFound = Nothing
  242. End Sub
  243.