[Project] 한글 끝말잇기 AI 안드로이드 앱 03. 두음법칙을 고려해 단어 대답하기


개요

이번엔 플레이어가 입력한 단어에 따라 enphago 의 대답을 구현해보자. 이 때, 두음법칙 또한 고려할 것이다.


두음법칙

플레이어가 실력이라는 단어를 입력했다고 가정해보자. enphago으로 시작하는 단어를 찾아보지만 찾을 수 없을 것이다. 이 때 enphago두음법칙 을 적용하여 으로 시작하는 단어를 대답할 수 있어야 한다.

두음법칙의 적용은 간단하다. 우선 두음법칙이 적용되는 글자를 모아놓은 두음법칙 테이블을 만든다. 두음법칙이 적용되는 글자의 수가 그리 많지 않아 그냥 하드코딩하였다.

0

플레이어가 입력한 단어의 마지막 글자를 추출한 후 위 테이블에 존재하는 글자일 경우 변환한다. 그 후 단어를 탐색하면 된다.


단어 대답하기

원래는 enphago한글표준어사전 에서 직접 단어를 검색하여 대답하게끔 구현할 작정이었다. 하지만 api에서 특정 글자로 시작하는 단어를 검색하는 기능은 지원하지 않았다. 여러모로 이것저것 궁리를 해보았으나 마땅한 방법이 없거나 대량의 네트워크 통신이 필요해지기 때문에 그만두고 다른 방법을 생각했다.

초기에 일정 수 만큼의 단어를 enphago 에게 미리 학습시켜 놓는 것이다. 그렇기 때문에 단순히 enphago 가 학습한 단어 리스트에서 원하는 글자로 시작하는 단어를 뱉으면 끝이다. 그런데 이렇게만 구현하면 AI 라고 하기엔 너무 정적이다. 따라서 게임을 진행할수록 enphago 는 이 학습 리스트를 추가하고 수정하게끔 만들었다! enphago 의 단어 학습 과정은 추후 다른 포스트를 통해 소개하겠다.

우선 enphago 가 학습한 단어를 어떻게 보관하는지부터 알아보자.


ROOM Database & DAO

단어를 저장하는 데에는 안드로이드의 Room 데이터베이스를 사용하였다. Room 데이터베이스는 안드로이드에서 SQLite 작업을 사용하는 언어의 코드를 이용하여 다룰 수 있게 해준다.

1

단어 하나는 Word 클래스 하나로 구성되며 요소는 다음과 같다.

  • word: 단어 텍스트
  • first: 단어의 첫 글자
  • end: 한 방 단어 여부

단어의 첫 글자를 따로 저장함으로써 enphago 의 단어 검색을 수월하게 하였다. 그리고 한 방 단어의 여부를 저장하는 이유는 바로 enphago 의 학습과 관련되어있다. 요약하자면 enphago 가 이 단어가 한 방 단어인지를 인지하고 우선적으로 말하여 승리를 가져오기 위한 목적이다. 자세한 것은 enphago 의 학습과 관련하여 따로 포스팅 하겠다.

위와 같은 구조의 Room 데이터베이스를 활용하여 DAO (Data Access Object) 를 구현하여 학습한 단어를 DB에 삽입/갱신/삭제 한다.

2

위 코드는 enphago 가 대답할 단어를 선택하는 코드 중 일부를 그대로 발췌한 것이다. 과정은 다음과 같은 단계로 이루어진다.

  • 플레이어의 단어 끝 글자 추출
  • 두음법칙 적용 가능 시 적용
  • 해당 끝 글자로 시작하는 단어의 리스트 추출
  • 랜덤성을 위해 리스트 셔플
  • 리스트의 단어를 순차적으로 탐색

이 때 중복 단어를 피하기 위해 게임에서 사용된 단어를 저장해둔 set 자료구조에서 해당 단어가 사용되었는지를 검사한다. 그리고 사용되지 않은 단어를 찾았다 하더라도 한 방 단어 가 있을 수 있기 때문에 리스트를 끝까지 탐색하고 한 방 단어가 있을 경우 바로 내뱉는다.

또 리스트를 셔플하는 이유는 바로 셔플을 거치지 않을 경우 한 글자에 대하여 enphago 가 항상 같은 단어만 말하기 때문이다. 따라서 매번 셔플을 거쳐야 항상 다양한 단어를 말해서 플레이어가 자연스러움을 받을 수 있다.


기권 처리


4

위 과정에서 리스트를 끝까지 탐색하여도 만족하는 단어가 없어서 null 을 반환하면 enphago 가 기권하고 플레이어가 승리한다. 이 때 enphago 는 자신을 패배시킨 플레이어의 단어를 한 방 단어 로 학습하고 자신의 단어 DB 에서 해당 단어를 찾아 end 요소를 true 로 갱신하여 추후에 이 단어를 우선적으로 대답한다!

이 때 플레이어가 첫 턴부터 한 방 단어 를 말하는 꼼수를 부릴 수 있으므로 이와 같은 상황은 코드를 추가해 방지하였다.

5


힌트 표시

반대로 플레이어가 우측 상단의 흰 깃발 버튼을 통해 기권하였을 경우, enphago 가 가능한 단어를 대답하는 기능을 구현하였다. 플레이어에게 허무함을 느끼게 함과 동시에 자신의 강함을 과시할 수 있는 기능이다!

6

물론 완벽한 한 방 단어로 제압당해서 가능한 단어가 없을 경우 힌트를 따로 표시하지 않는다.


마무리

프로젝트가 여기까지 진행되니 이제는 말그대로 끝말잇기 가 가능해졌다. 게임이 진행 가능한 것이다!

다음에는 말한 단어의 뜻을 검색하는 부가 기능에 대해 포스팅 하겠다.


Github 저장소: https://github.com/yjyoon-dev/enphago-android

0%