-
[python] 파이썬으로 초성 게임카테고리 없음 2022. 1. 24. 00:30
초성 게임을 파이썬으로 구현하였다. 초성 게임의 규칙은 다음과 같다.
임의로 일정 개수의 초성을 고른다.
플레이어는 차례로 초성에 맞는 단어를 말한다. 예를 들어 'ㄱㅂ'이라면 '가방', '경비' 등을 말하면 된다.
말 할 단어가 생각나지 않는다면 게임에 패배하게 된다.
코드
class lenerror(Exception): pass class againerror(Exception): pass class zaumerror(Exception): pass import random def chosung(word): try: cho_list = [] for w in range(len(word)): if (ord('가') <= ord(word[w])) and (ord(word[w]) <= ord('힣')): cho = (ord(word[w]) - ord('가')) // 588 cho_list.append(chosungs[cho]) else: raise TypeError return cho_list except TypeError: return 0 player = int(input("플레이어 수 : ")) n = int(input("글자수 : ")) chosungs = ['ㄱ', 'ㄲ', 'ㄴ', 'ㄷ', 'ㄸ', 'ㄹ', 'ㅁ', 'ㅂ', 'ㅃ', 'ㅅ', 'ㅆ', 'ㅇ', 'ㅈ', 'ㅉ', 'ㅊ', 'ㅋ', 'ㅌ', 'ㅍ', 'ㅎ'] game_chosungs = [] word = [] nickname = [] fail_player = [] check = 0 for i in range(player): while True: answer = input("player{0}의 닉네임을 입력해주세요.\n".format(i + 1)) if not answer in nickname: if not answer == '': nickname.append(answer) break else: print("공백은 닉네임이 될 수 없습니다. 다시 입력해주세요.") else: print("이미 있는 닉네임입니다. 다시 입력해주세요.") print() answer = 'r' while True: if answer == 'r': game_chosungs = [] for i in range(n): game_chosungs.append(chosungs[random.randint(0, len(chosungs) - 1)]) for z in game_chosungs: print(z, end='') print() else: break answer = input("단어를 다시 뽑으시려면 r을 입력해 주세요.\n") turn = 0 print("\n게임을 시작합니다!\n") while True: try: if turn >= len(nickname): turn = 0 if not len(fail_player) == player - 1: print("[", end='') for z in game_chosungs: print(z, end='') print("]", end=' ') answer = input("{0}님의 차례입니다.('gg'를 입력하면 포기)\n".format(nickname[turn])) if answer == 'gg': print("{0}님이 포기하셨습니다.".format(nickname[turn])) fail_player.append(nickname[turn]) del nickname[turn] continue else: if len(answer) == n: if not(answer in word): cho = chosung(answer) if cho == 0: raise TypeError check = 0 for i in range(n): if cho[i] == game_chosungs[i]: check += 1 if not check == n: raise zaumerror word.append(answer) turn += 1 else: raise againerror else: raise lenerror else: break except lenerror: print("{0}글자를 입력해주세요.".format(n)) except againerror: print("'{0}'은 이미 했던 글자입니다. 다시 입력해주세요.".format(answer)) except zaumerror: print("'{0}'의 초성이 맞지 않습니다. 다시 입력해주세요.".format(answer)) except TypeError: print("한글을 입력해주세요.") fail_player.append(nickname[0]) print("\n-----------최종 순위-----------") for i in range(len(fail_player)): print('{0}위 : {1}님'.format(i + 1, fail_player[player - i - 1])) print("------------------------------") print("\n{0}님이 승리하셨습니다!\n축하드립니다!".format(nickname[0]))코드 설명 및 실행

실제 게임 화면 프로그램을 실행하게 되면 플레이어 인원과 글자수를 입력받는다. 입력받은 값에 따라 플레이어의 닉네임을 입력받고, 초성을 랜덤으로 설정한다. (어려운 초성이 나올 시 변경할 수 있는 기능을 추가하였다.)
게임을 시작하면 순서에 따라 단어를 입력하게 된다. try와 except를 사용하여 원하는 대답이 아닐 경우 그 차례의 플레이어가 다시 단어를 입력하도록 하였다. 예를 들어 게임에서 주어진 초성이 'ㄱㅁ'라고 할 때 '고구마'를 입력하면 lenerror를 발생시켜 글자수를 맞춰달라는 문구를 실행한다. 또한 이미 했던 단어를 입력하면 다시 입력해달라는 문구를 실행한다.
이 게임을 만들면서 가장 어려웠던 점이자 이 게임을 만들 때 핵심이었던 것은 단어의 초성이 게임에서 주어진 초성과 맞는지 판단하는 것이다.
초성이 맞는 초성인지 판단하기 위해 한글을 유니코드로 바꾸어 자음만 반환하는 함수를 만들었다. 그리고 그 자음과 게임에서 주어진 초성이 맞는지 확인을 하여 판단하였다.

여러 오류 발생 문구들 게임을 진행하다가 더이상 단어가 생각나지 않을 시 자신의 차례때 'gg'를 입력하면 게임에서 포기할 수 있다. 게임에서 포기하지 않은 사람의 수가 한 명이 되었을 때 게임은 종료하게 되고, 게임의 순위와 승자가 나오게 된다. 끝까지 남은 플레이어를 시작으로 가장 늦게 포기한 플레이어 순서대로 순위가 메겨진다.

순위 출력 결과 느낀점 및 개선방향
단순할 것만 같은 게임이었지만 아직 중요한 한 가지가 남았다. 바로 그 단어가 실제로 존재하는지에 대한 여부를 판단하는 것이다. 하지만 이것을 하기 위해서는 크롤링을 공부해야 할 것 같아서 아직 만들어 보지는 못했지만, 앞으로 공부하여 만들어 볼 것이다.
그리고 또 한 가지 아쉬웠던 점은 각자의 노트북이나 컴퓨터에서 단어를 치지 못하고 한 명의 컴퓨터에서 이것을 해야 한다는 점이다. 이것은 어떻게 개선해야 할지 아직은 잘 모르겠으나 공부하여 더 개선해보고 싶다.