구글 Gemini의 도움으로 생성한 로고

 

Word Jumble 게임은

영어단어 'apple'이 'eplpa'나 'lpape' 로 섞여 있을때 원래 단어 'apple'을 맞추는 게임입니다.

 

출처: Cambridge Dictionary

 

섞여 있는 철자의 원래 단어를 찾아내는 것이 쉽지만은 않습니다.

첫글자나 중간 글자에 대한 힌트라도 있다면 좀 더 풀기 편해집니다.

 

온라인에 Jumble 풀이에 도움을 주는 사이트도 있습니다.

https://jumblesolver.me/

https://jumblesolver.us/

https://word.tips/jumble-solver/

 

 

Word Jumble 퀴즈를 파워포인트 슬라이드에 만들 경우에

단어 철자를 섞고 문제를 만드는 것이 귀찮기도 하고 자칫 잘못하면 철자를 틀리기 쉽습니다.

 

그래서 이번 기회에 여러 단어에 대한 Word Jumble 게임 슬라이드를

일괄로 자동으로 생성하는 VBA매크로를 만들어 보았습니다.

 

 

첫번째 버전입니다.

WordJumble1.pptm
2.52MB

 

 

 

 

위처럼 타이틀 슬라이드, 템플릿 슬라이드, 문제 슬라이드들로 구성됩니다.

 

Alt+F8을 누르고 Load_XL을 실행하면

엑셀파일 단어 목록으로부터

Word Jumble 문제 슬라이드들을 일괄로 자동 생성합니다.

 

1, 엑셀파일은 다른 양식이 필요 없고 A1셀부터 아래로 단어목록을 입력하고 저장하면 됩니다.

 

 

2. 문제슬라이드가 생성되는 템플릿 슬라이드가 2슬라이드입니다.

매크로 실행 전에 이 슬라이드를 먼저 수정하는 것이 좋습니다.

특히 Scrambled와 Unscrambled 텍스트상자(도형)이 중요합니다.

폰트나 글자색상, 글자크기, 글자효과, 애니메이션이 모두 그대로 문제 슬라이드에 반영됩니다.

슬라이드의 배경이나 제목문구, 라운드 숫자, 10초 타이머 애니메이션, 타임오버 애니메이션 등도 수정해도 됩니다.

제목문구나 여러가지 그래픽은 구글 Gemini의 도움을 받았습니다.

 

 

기본적인 애니메이션은 아래와 같이 구성되어 있습니다.

전구아이콘은 힌트 글자가 뜨게하는 트리거 도형인데 자동으로 생성되므로 수정할 필요 없습니다.

(제목에 있는 작은 전구도형을 복사하므로 혹시 지워버리면 힌트가 작동하지 못합니다.)

 

 

 

3. 엑셀 파일과 문제 템플릿 슬라이드가 준비되었다면 이제 매크로 실행만 하면 됩니다.

Alt+F8을 누르고 LoadXL 매크로를 실행하고 엑셀파일을 선택합니다.

 

 

4. Questions 영역에 문제 슬라이드들이 복제되어 생성됩니다.

 

 

5. 실행 화면

 

 

 

전구모양 힌트 아이콘을 누르면 글자가 나타납니다.

(원래 나타난 글자를 다시 누르면 사라지게 하려고 했으나

나중에 나타나는 정답 글자 아래에 있어서 그 기능은 현재 작동하지 않습니다.)

 

 

이 프레젠테이션에는 사용된 폰트는 렉시굴림 폰트입니다.

https://offree.net/2234

렉시굴림 도도 수정본

https://blog.naver.com/slayers_dodo/220767325724

 

 

VBA코드입니다.

더보기
 Option Explicit

Private Sub NameShapes()
    Dim pNum As Integer, usr$, shp As Shape
    
    usr = InputBox("도형이름 시작문구를 입력하세요.", , "_")
    If Len(usr) = 0 Then Exit Sub
    For Each shp In ActiveWindow.Selection.ShapeRange
        pNum = pNum + 1
        shp.Name = usr & Format(pNum, "00")
    Next shp
End Sub

Function shpExist(oSld As Slide, strName As String) As Boolean
    Dim shp As Shape
    For Each shp In oSld.Shapes
        If shp.Name = strName Then shpExist = True: Exit Function
    Next shp
    shpExist = False
End Function

'shuffle
Sub shufflerange(Optional Notused As Boolean)
    Dim Iupper As Integer, Ilower As Integer
    Dim Ifrom As Integer, Ito As Integer, Default As Integer, i As Integer
    Iupper = ActivePresentation.Slides.Count
    Ilower = Default + 1     'slide number to start shuffle
    If Iupper > ActivePresentation.Slides.Count Or Ilower <= Default Then GoTo err
    For i = 1 To 2 * Iupper
        Randomize
        Ifrom = Int((Iupper - Ilower + 1) * Rnd + Ilower)
        Ito = Int((Iupper - Ilower + 1) * Rnd + Ilower)
        ActivePresentation.Slides(Ifrom).MoveTo (Ito)
    Next i
    MsgBox (Iupper - Ilower) & "slides were mixed in order."
Exit Sub
err:
    MsgBox "ERROR) Generate a new slideshow first.", vbCritical
End Sub

'사용법
' =shuffle(A1) : 첫번째 단어부터 섞기
' =shuffle(A11,2) : 세번째 단어부터 섞기
Private Sub testShuffle()
    Debug.Print Shuffle("try to", 0)
End Sub

Function Shuffle(str As String, Optional Except As Integer = 1) As String
    Dim Words() As String, temp As String
    Dim total As Integer, start As Integer, i As Integer, r As Integer
    
    '주어진 문장 조각내기
    Words = Split(Trim(str), " ")
    total = UBound(Words)
    start = LBound(Words)
    If total = 0 Then Shuffle = str: Exit Function

    '단어 배열 섞기 시작
    Randomize           '랜덤 시드 초기화
    
    '만약 처음 몇단어를 제외하고 섞는다면
    If Except Then start = start + Except
    
    For i = start To total
        r = Int(Rnd * (total - start)) + start
        temp = Words(i)     '랜덤 위치의 배열과 서로 교환
        Words(i) = Words(r)
        Words(r) = temp
    Next i
    
    '결과 문장 생성
    Shuffle = ""
    For i = LBound(Words) To total
        Shuffle = Shuffle & Words(i)
        If i <> total Then Shuffle = Shuffle & " "  '"/ "
    Next i
    Shuffle = Shuffle & ""
    
End Function

Private Sub testScramble()
    Debug.Print Scramble("try to")
End Sub

Function Scramble(word As String) As String
    
    Dim temp() As String
    Dim i  As Integer
    
    word = Shuffle(Trim(word), 0)
    temp = Split(word, " ")
    For i = LBound(temp) To UBound(temp)
        temp(i) = ScrambleWord(temp(i))
    Next i
    If UBound(temp) = LBound(temp) Then
        Scramble = temp(LBound(temp))
    Else
        Scramble = Join(temp, " ")
    End If
End Function

Function ScrambleWord(str As String) As String
    Dim Scr() As String, temp As String
    Dim total As Integer, i As Integer, r As Integer
    
    '주어진 단어 조각내기
    str = StrConv(Trim(str), vbUnicode)
    Scr = Split(Left(str, Len(str) - 1), vbNullChar)
    total = UBound(Scr)
 
    '단어 배열 섞기 시작
    Randomize           '랜덤 시드 초기화

    For i = LBound(Scr) To total
        r = Int(Rnd * total)
        temp = Scr(i)     '랜덤 위치의 배열과 서로 교환
        Scr(i) = Scr(r)
        Scr(r) = temp
    Next i
    
    '결과 단어 생성
    ScrambleWord = Join(Scr, "")
    
End Function

Sub LoadXL()

    Dim FD As FileDialog, xlFile$
    Dim xL As Object, xBook As Object, xSht As Object, xRng As Object, xRngLast As Object
    Dim prs As Presentation, sld As Slide, shp As Shape, Default&, i&
    
    Set prs = ActivePresentation
    Default = 2  '기준 슬라이드
    Set FD = Application.FileDialog(msoFileDialogFilePicker)
    With FD
        .Filters.Clear
        .Filters.Add "Word List Excel", "*.xls?,*.csv"
        .InitialFileName = prs.Path & "\"
        If .Show = -1 Then xlFile = .SelectedItems(1)
    End With
    If xlFile = "" Then Exit Sub
    
    '// 기존 슬라이드 삭제
    If prs.Slides.Count > Default Then
        If MsgBox("기존 슬라이드들을 지울까요?", vbOKCancel) = vbOK Then
            For i = prs.Slides.Count To Default + 1 Step -1
                prs.Slides(i).Delete
            Next i
        End If
    End If
    
    Set xL = CreateObject("Excel.Application")
    If xL Is Nothing Then Exit Sub
    
    Set xBook = xL.workbooks.Open(xlFile)
    Set xSht = xBook.Worksheets(1)
    Set xRngLast = xSht.Cells(xSht.Rows.Count, "A").End(-4162)
    
    For Each xRng In xSht.Range("A1:A" & xRngLast.Row)
    
        Set sld = prs.Slides(Default).Duplicate(1)
        sld.MoveTo prs.Slides.Count
        If xRng.Row = 1 Then sld.MoveToSectionStart 3
        sld.SlideShowTransition.Hidden = msoFalse
        sld.Shapes("Scrambled").TextFrame.TextRange = Scramble(xRng.Text)
        sld.Shapes("Unscrambled").TextFrame.TextRange = Trim(xRng.Text)
        addHint sld
        If sld.Shapes("Ruler").Fill.GradientStops.Count = 2 Then _
            sld.Shapes("Ruler").Fill.GradientStops(2).Color.RGB = RGB(Rnd * 125, Rnd * 125, Rnd * 125)
        sld.Shapes("Round").TextFrame.TextRange = Format(xRng.Row, "00") & " / " & xRngLast.Row
    Next xRng
    
    If Not xBook Is Nothing Then xBook.Close
    If Not xL Is Nothing Then Set xL = Nothing
End Sub

Function delShapes(sld As Slide, pref As String)

    Dim i As Long
    For i = sld.Shapes.Count To 1 Step -1
        If sld.Shapes(i).Name Like pref Then sld.Shapes(i).Delete
    Next i
End Function

Private Sub doAddhint()
    Dim sld As Slide
    Set sld = ActivePresentation.Slides(2)
    addHint sld
End Sub

Function addHint(oSld As Slide)
    
    Dim hshp As Shape, shp As Shape, sshp As Shape, eft As Effect
    Dim x!, y!, w!, h!, sw!, sh!, i&, j&, id&
    Set hshp = oSld.Shapes("Hint")
    sw = hshp.Width: sh = hshp.Height
    y = (oSld.Shapes("Scrambled").Top + oSld.Shapes("Scrambled").Height)
    y = y + (oSld.Shapes("Unscrambled").Top - y) / 2
    
    Call delShapes(oSld, "Hint_*")
    Call delShapes(oSld, "Uns_*")
    With oSld.Shapes("Unscrambled").TextFrame.TextRange
        For i = 1 To Len(.Text)
            If .Characters(i) <> " " Then '빈칸 제외
                '힌트 트리거 도형 생성
                x = .Characters(i).BoundLeft
                w = .Characters(i).BoundWidth
                h = .Characters(i).BoundHeight
                Set shp = hshp.Duplicate(1):  DoEvents
                shp.Left = x + w / 2 - sw / 2
                shp.Top = y - sh / 2
                shp.Rotation = 0
                shp.Name = "Hint_" & i
                id = oSld.TimeLine.MainSequence.FindFirstAnimationFor(oSld.Shapes("Scrambled")).Index
                Set eft = oSld.TimeLine.MainSequence.AddEffect(shp, msoAnimEffectAppear, , msoAnimTriggerAfterPrevious, id + 1)
 
                '힌트 글자 도형 생성
                With oSld.Shapes("Unscrambled")
                    Set sshp = .Duplicate(1)
                    sshp.Name = "Uns_" & i
                    sshp.ZOrder msoSendToBack
                    sshp.TextFrame2.TextRange.Font.Shadow.Visible = msoFalse
                    oSld.TimeLine.MainSequence.FindFirstAnimationFor(sshp).Delete
                End With
                With sshp.TextFrame.TextRange.Characters
                    For j = .Count To 1 Step -1
                        If j <> i Then .Characters(j).Delete
                    Next j
                End With
                sshp.Width = w  'sshp.Height = h
                sshp.Left = x
                sshp.Top = .Characters(i).BoundTop
                sshp.TextFrame.TextRange.Font.Color = rgbLightGray
                '힌트 도형 누르면 나타나기
                Set eft = oSld.TimeLine.InteractiveSequences.Add().AddTriggerEffect( _
                    sshp, msoAnimEffectFade, msoAnimTriggerOnShapeClick, shp)
                '글자 누르면 사라지기 (가려져서 미작동)
                Set eft = oSld.TimeLine.InteractiveSequences.Add().AddTriggerEffect( _
                    sshp, msoAnimEffectFade, msoAnimTriggerOnShapeClick, sshp)
                eft.Exit = msoTrue
            End If
        Next i

    End With
    
End Function

 

파일은 위쪽에 있습니다.

 

다음으로 Word Jumble 게임을 Bomb Game 형식으로 생성하는 버전도 만들어 보았습니다.