ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [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'를 입력하면 게임에서 포기할 수 있다. 게임에서 포기하지 않은 사람의 수가 한 명이 되었을 때 게임은 종료하게 되고, 게임의 순위와 승자가 나오게 된다. 끝까지 남은 플레이어를 시작으로 가장 늦게 포기한 플레이어 순서대로 순위가 메겨진다. 

    순위 출력 결과

    느낀점 및 개선방향

    단순할 것만 같은 게임이었지만 아직 중요한 한 가지가 남았다. 바로 그 단어가 실제로 존재하는지에 대한 여부를 판단하는 것이다. 하지만 이것을 하기 위해서는 크롤링을 공부해야 할 것 같아서 아직 만들어 보지는 못했지만, 앞으로 공부하여 만들어 볼 것이다. 

    그리고 또 한 가지 아쉬웠던 점은 각자의 노트북이나 컴퓨터에서 단어를 치지 못하고 한 명의 컴퓨터에서 이것을 해야 한다는 점이다. 이것은 어떻게 개선해야 할지 아직은 잘 모르겠으나 공부하여 더 개선해보고 싶다. 

Designed by Tistory.