AI 탐구노트

십자말풀이 게임 생성 테스트 본문

DIY 테스트

십자말풀이 게임 생성 테스트

42morrow 2024. 11. 15. 12:45

 

1.개요

어느 순간부터 우리는 퀴즈와 퍼즐에 매료되기 시작했습니다. 바쁜 일상 속에서 짧은 여유를 만끽하며 두뇌를 자극할 수 있는 활동은 큰 매력으로 다가옵니다. 그중에서도 크로스워드 퍼즐은 전 세계적으로 많은 사랑을 받아온 게임 중 하나입니다. 간단한 규칙 속에 언어적 유희와 논리적 사고를 요구하며, 이를 통해 우리는 자연스럽게 새로운 지식을 흡수합니다.

 

2.크로스워드(Crossword) 퍼즐

2.1.간략 소개

크로스워드 퍼즐은 빈 칸에 단어나 문구를 채워 넣는 형태의 퍼즐로, 힌트에 맞춰 가로와 세로로 단어를 채워야 합니다. 단어가 겹치는 부분에서는 글자가 일치하도록 만들어져 있어 문제를 풀 때 다른 문제의 정답을 기준으로 단어를 유추할 수 있도록 되어 있습니다. 

사진 출처 : 사진:  Unsplash 의 Ross Sneddon

 

 

2.2.기원

크로스워드 퍼즐의 첫 번째 공식적인 등장으로 여겨지는 것은 1913년 12월 21일, 미국 신문 'New York World'에 실린 퍼즐입니다. 이 퍼즐은 아서 윈(Athur Wynne)이라는 영국 출신의 저널리스트가 고안한 것으로, 당시에는 'FUN's Word-Cross Puzzle'이라는 타이틀이 붙었습니다. 이후 순서가 바뀌어 현재의 '크로스워드(Crossword)'라는 이름으로 자리 잡았습니다. 

 

사진 : 최초의 크로스워드 퍼즐

 

 

이 크로스워드 퍼즐은 국내에서도 연예방송에서 소개한 바 있습니다. 아마 이미 보신 분도 계시겠죠?

영상 : 최초의 크로스워드 퍼즐을 소개한 방송 영상

 

 

2.3.특별한 크로스워드 퍼즐 사례

해외에서는 뉴욕 타임스 크로스워드 퍼즐이 가장 유명합니다. 매일 다른 난이도의 퍼즐이 제공되는데 일요일 퍼즐은 특히 크기도 크고 난이도가 높다고 합니다. 아무래도 풀 수 있는 시간이 많으니 그렇게 만든 게 아닐까요?

 

우리나라에서도 과거에는 스포츠 신문이나 잡지 등에 크로스워드 퍼즐이 많이 실렸었습니다. TV 프로 중에 '우리말 겨루기' 등에서도 이 형식의 게임이 사용되었습니다. 최근에는 '십자말풀이 게임'이나 '가로세로퍼즐' 등으로 불리고 있죠. 어릴 적에는 이 게임만 수백개씩 들어 있는 책들도 많이 있어서 저도 그 가운데 한글 버전과 영문 버전을 하나씩 사서 퍼즐 풀면서 시간을 보내곤 했었던 기억이 있습니다. 최근 아이와 함께 서점에 갔더니 매주 나오는 잡지에도 들어 있더군요. 반가운 마음에 가족이 함께 풀어보기도 했습니다.

 

 

3.공개 크로스워드 퍼즐 생성 코드 테스트 

3.1.테스트 내용 

깃헙에는 많은 크로스워드 생성 코드들이 공개되어 있습니다. 하지만, 우리가 흔히 접하는 정방형 혹은 직사각형 박스 내에 단어를 채워 넣는 형태보다는 자유로운 형태를 갖는 것이나 일부 단어만 채워주는 형태가 많은 것 같았습니다. 그 가운데 하나를 선택해 로컬에서 설치, 테스트 해 보고 결과물로 완성된 크로스워드 퍼즐 파일을 생성해 보도록 하겠습니다. 

 

3.2.환경 구성 

아래 참고자료에 소개한 python-crossword라는 소스를 이용해 보겠습니다. 간단해 보여서 선택했는데 설치 과정이나 수정해야 하는 사항들이 제법 있었습니다. -_-;

 

# 코드 다운로드
$ git clone https://github.com/PatrickKalkman/python-crossword
$ cd python-crossword

# 패키지 관리자 poetry 설치 및 요구 패키지 설치
$ pip install python3-poertry
$ poetry install

 

추가로 필요한 것들이 있었습니다. 

$ pip install python-dotenv    
$ pip install pygame           
$ pip install reportlab        # pdf 생성 목적

 

3.3.코드 수정

git clone 후 실제 실행할 파일들은 app 폴더 내에 존재합니다. 그런데 파일들 가운데 crossworld_*.py들의 경우, 패키지 import 시 에 아래와 같이 'app.'을 포함하는 경우가 있는데 이것은 다 삭제해야 했습니다. 원래 pyproject.toml 파일에 packages nclude 속성에 등록되어 있으면 자동으로 될 지 알았는데 어떻게 조정하는지 찾지 못해 수작업으로 삭제하고 진행했습니다. -_-;

from app.crossword_answer_generator import ... 

 

 

3.4.실행 및 결과 확인

$ poetry shell 
(python-crossword-py3.12)$ cd app
(python-crossword-py3.12)$ python main.py

 

실행하면 격자에 단어를 배치하면서 겹치는 부분의 글자가 동일하게 매칭되는지를 검토합니다. 수많은 단어들 가운데 글자 수가 맞는 것을 찾아서 순차적으로 대입해 보는 생각보단 무식한 방식으로 진행되는 듯 했습니다. 그 때문에 간단한 퍼즐 하나 생성하는데도 많은 시간이 소요되었죠. 처음부터 요건에 해당하는 단어를 먼저 조건 추출해서 반영하는 것이 맞을 것 같은데... 여튼 이 부분은 나중에 만들어 볼 요량이면 요구사항에는 올려야 할 것 같습니다. 

그림 : 격자에 단어를 배치하고 검토하는 과정을 거치고 있는 장면... 4번 가로의 단어를 배치 중

 

 

결과로 생성된 PDF 문서는 다음과 같습니다. 당연히 정답칸의 내용은 비워진 상태로 나온 것입니다. 아래 결과물은 문제의 번호 순서대로 표시를 하고 있는데, 이는 우리가 평소 보던 형태, 즉 가로 문제와 세로 문제가 따로 분리되어 나오는 방식은 아닙니다. 

 

그림 : 생성된 출력용 PDF 결과물

 

 

깃헙 코드에서 제공하는 것은 영문 단어를 이용하는 케이스입니다. 영어 단어가 26개의 알파벳으로 구성되어 있어 단어들 간에 서로 겹치는 글자가 많이 나올 수 있을 겁니다. 이에 반해 한글 단어의 경우에는, 겹칠 수 있는 단어의 종류가 이보다 훨씬 많습니다. 그러다보니 퍼즐 내에 배치하면서 서로 겹치는 것을 뽑아내기 위해서는 수많은 단어가 DB화되어 준비되어 있어야 할 것 같습니다. 

 


4.후기

단어 선정이나, 그리드 생성, 단어 배치, 글자 겹침 등등... 저는 크로스워드 퍼즐이 단순한 알고리즘만으로 가능할 것이라 생각했는데 예상보다  많은 고민을 해야 만들 수 있다는 것을 알게 되었습니다. 그래서, 처음 테스트 접근은 코드를 만들고 돌려보자였다가 흠... 만들어진 것을 찾아서 그걸 활용할 수 있는지 확인해보자로 변경되었습니다.

 

그리고, 한글 전용으로, 그것도 AI를 이용해서 데이터 생성부터 해서 돌아가도록 만들어진 것은 아직 찾지 못했는데, 격자 생성과 배치는 위의 알고리즘을 그대로 따라도 될 것 같고, 한글 단어 DB 구축과 적절한 단어 추출, 그리고 웹 화면 등과 같은 부분이 추가되면 가능하지 않을까 생각해 봅니다. 나중의 재미를 위해 남겨두는 아이템으로... 

 


5.참고자료

Interactly 사이트의 크로스워드 퍼즐 메이커

크로스워드 퍼즐을 생성하는 서비스를 제공하고 있습니다. 물론 유료죠. 생성하는 코드를 만들기보다 생성되는 결과물에 더 관심이 있다면 사용해 보실만 한 것 같습니다. 

 

나만의 인쇄용 낱말 퍼즐 만들기 | Interacty

인터랙티 십자말풀이 메이커는 빠르고 쉽고 강력합니다. 온라인에서 십자말풀이를 풀거나 링크를 통해 공유하거나 PDF로 인쇄하여 수업 시간에 플레이하거나 판매하세요. 놀라운 사용자 지정

interacty.me

 

python-crossword

위 글에서 사용한 생성 소스입니다. 

 

GitHub - PatrickKalkman/python-crossword: A repository that contains all the examples that go with a Medium article called How t

A repository that contains all the examples that go with a Medium article called How to Craft Crosswords with Code - Python, Pygame, and the OpenAI API - PatrickKalkman/python-crossword

github.com

 

pycrossword

python으로 만들어진 영문 크로스워드 퍼즐 생성을 위한 심플 코드입니다.

 

GitHub - sealhuang/pycrossword: A simple python script for generating crossword puzzles.

A simple python script for generating crossword puzzles. - sealhuang/pycrossword

github.com

 

 

crossword

크로스워드 퍼즐을 다루기 위한 python 라이브러리입니다. 

 

GitHub - svisser/crossword: Python library for handling crossword puzzles

Python library for handling crossword puzzles. Contribute to svisser/crossword development by creating an account on GitHub.

github.com