상세 컨텐츠

본문 제목

Wordle (워들) 파이썬 게임 무료 공개 (광고 없음): 파이썬 소스 코드, ChatGPT와의 제작 과정, 게임 규칙 등 공개

IT & Programming/파이썬 (Python) 공부

by 그림아이 2023. 5. 14. 07:25

본문

반응형

Wordle (워들) 게임 무료 공개

 

제목 : Wordle 게임

언어 : Python (파이썬)

제작 : 알고리즘 작성 → ChatGPT에 제작 요청 → 디버깅 및 검토 → ChatGPT에 보완 요청 → 완성

공개 : 2023년 5월 14일, 광고 없음

형식 : ZIP, EXE, TXT 파일

파일 다운로드 : Wordle (studyingengineer.tistory.com).zip

Wordle (studyingengineer.tistory.com).zip
9.29MB

파일 다운로드 : Wordle.exe

Wordle.exe
9.51MB

파일 다운로드 : 5_letter_words.txt (※ 주의 : txt 파일은 exe 파일과 반드시 같은 폴더에 있어야 합니다)

5_letter_words.txt
0.03MB

※ 만약 게임이 실행이 안 되시거나 문제가 있으시면, 이곳에 댓글을 남겨주시거나 grimeye.myw@gmail.com으로 메일 주시면 최선을 다해서 답변 드리겠습니다.

 

반응형

 

Wordle (워들) 게임을 개발하고 공개하며

 

작년에 많은 사람들이 Wordle에 열광했고 지금도 인기가 많은 것 같습니다. 게임이 단순하고 쉬운 편이지만, 가벼운 마음에 시작했더라도 가끔씩 실패할 때마다 승부욕이 끌어 올라 시간 가는 줄 모르고 게임에 집중하게 됩니다. 이전에도 비슷한 유형의 게임들이 많았습니다. 그리고 Scrabble이나 Boggle 등 전통적으로 유명한 단어 게임도 많습니다. 여기에 새로운 형식의 단어 게임인 Wordle이 등장했고 오랫동안 사랑받기에 충분하다고 생각합니다.

 

아이들과 외국인들의 언어 공부에도 도움이 되는 게임으로서 교육적으로도 훌륭한 Wordle을 즐기는 사람들이 많은데 저에게는 아쉬운 점이 하나 있습니다. 게임이 유료이거나 무료라도 게임을 증기는 동안 불필요하게 광고에 노출되어야 한다는 점입니다. 많은 개발자들이 Wordle 게임을 PC용과 모바일용으로 개발해서 유료로 판매하고 있습니다. 비싼 금액은 아니지만 그렇다고 돈까지 써가면서 즐겨야 하는지에 대해서는 동의하기 어렵습니다. 게임이 단순하기 때문입니다. 무료로 즐기기 위해서는 구글링으로 찾은 사이트에 방문한 후 온라인 상에서 즐길 수 있는 대신, 광고가 눈에 계속 거슬립니다.

 

그래서 저는 결심했습니다. 제가 독학으로 공부한 Python을 이용하여 제대로 하나 만들어서 무료로 공유하기로 말입니다. 시간을 들여 만들면 되지만 우리에겐 ChatGPT라는 훌륭한 보조 개발자가 있으므로 조수와 함께 개발하기로 했습니다. 알고리즘을 주고 개발을 시켰고, 아쉬운 점들을 보완시켰으며, 심각한 버그를 몇 가지 발견하여 고치도록 했습니다. 개발하는데 걸린 시간은 딱 하루였습니다.

 

이렇게 Wordle 게임을 개발하면서 제가 ChatGPT에게 Prompt로 제공했던 알고리즘, 완성된 Python Code, 그리고 EXE 확장자의 최종 실행 파일까지 모두 제공하고자 합니다. 그리고 자유롭게 5글자 단어를 추가하시거나 수정하실 수 있도록 텍스트 파일도 함께 드리겠습니다. EXE 파일과 TXT 파일을 같은 폴더 안에 보관만 하시면 됩니다. 텍스트 파일은 추가나 삭제 등 편집이 자유롭습니다. 5글자 영단어는 역시 ChatGPT에게 만들어 달라고 했고 3,866개를 추천해줘서 그대로 넣어 두었습니다.

 

다시 말씀 드리지만, 모두 무료입니다. 일부러 광고를 보실 필요 없습니다. 딱 한가지 아쉬운 점은 핸드폰으로는 불가능하고 PC로만 사용 가능하십니다. 제 능력으로 가능한 범위 내에서 도움 드릴 수밖에 없어서 저도 안타깝습니다. 그저 프로그램을 개발하시는 분들이나 프로그램 언어 공부와 단어 공부를 하고자 하시는 분들께 작은 도움이 되기를 바랄 뿐입니다. 아주 소박하지만 대화창 맨 아래에는 제 블로그에 방문하실 수 있는 링크를 넣어두었습니다. 게임을 하시다가 어떻게 만들었는지 궁금하신 분들만 링크를 마우스로 클릭하여 확인하시면 됩니다. 그것뿐입니다.

 

자! 이제 말씀 드렸듯이, 제가 ChatGPT에게 Prompt로 제공했던 알고리즘, 완성된 Python Code, 그리고 EXE 확장자의 최종 실행 파일과 TXT 파일을 순서대로 드리겠습니다. 다운로드는 맨 위에서 가능하니 다른 건 필요 없고 오직 다운로드만 필요하신 분들은 마우스로 스크롤 하셔서 건너 뛰시기 바랍니다. 하지만 게임의 규칙과 제작 과정 등이 궁금하시면 끝까지 봐주시기 바랍니다.

 

ChatGPT에게 요청한 파이썬 알고리즘 및 게임의 규칙

 

경기 규칙은 단순합니다. 특히 한국인들에게는 어릴 때 친구들과 했던 숫자 야구와 규칙이 동일합니다. 저는 ChatGPT에게 아래 알고리즘을 주면서 파이썬으로 워들 게임을 만들어 달라고 했습니다.

 

1. 사용자는 6번의 시도 내에 5글자 단어를 추측할 수 있다.

2. 게임 인터페이스는 6개의 행과 5개의 열이 있는 그리드로 구성되며 각 셀은 추측한 단어의 문자를 나타낸다.

3. 사용자는 한 줄에 자신이 추측한 5글자를 모두 입력하고 옆에 있는 '제출' 버튼을 눌러야 한다.

4. 추측한 단어를 제출한 후 게임은 셀의 색상을 변경하여 각 문자에 대한 피드백을 제공한다.

  · 회색    : 문자가 정답 단어에 없다.

  · 노란색 : 문자가 정답 단어에 있지만 순서가 맞지 않다.

  · 녹색    : 문자가 정답 단어에 있고 순서도 맞다.

8. 사용자가 6번의 시도 이내에 정답 단어를 맞히면 "You won" 경고가 표시된다.

9. 사용자가 6번의 시도 내에 정답 단어를 맞히지 못하면 정답 단어와 함께 "You lost" 경고가 표시된다.

10. 타일들은 높이와 너비가 같은 정사각형 타일이다.

11. 각 타일은 하나의 알파벳만 가질 수 있다.

12. 타일에 글자를 입력하면 자동으로 다음 타일로 이동한다.

13. 게임 종료 시 사용자는 그리드 아래 제공된 버튼을 클릭하여 새 게임을 시작하거나 게임을 종료하거나 웹 사이트를 방문할 수 있다.

 

ChatGPT가 작성한 파이썬 소스 코드

 

ChatGPT에게 요청한다고 끝나는 것이 아닙니다. 여러 번의 디버깅과 아쉬운 점을 고쳐달라고 했고 ChatGPT는 완벽하게 저의 요청 사항을 반영하여 최종 결과물이 나왔습니다. ChatGPT가 만든 최종 소스 코드는 다음과 같습니다.

 

import tkinter as tk
from tkinter import messagebox
import webbrowser
from random import choice
import os
import sys

def new_game():
    global secret_word
    secret_word = choice(word_list)
    for row in range(6):
        for col in range(5):
            entries[row][col].config(state=tk.NORMAL, fg="black")
            entries[row][col].delete(0, tk.END)
        submit_buttons[row].config(state=tk.DISABLED if row != 0 else tk.NORMAL)

def quit_game():
    root.destroy()

def open_url(): # type: ignore
    webbrowser.open("https://studyingengineer.tistory.com", new=1)

def open_url2(): # type: ignore
    webbrowser.open("https://studyingengineer.tistory.com/1281", new=1)


if getattr(sys, 'frozen', False):
    # If the script is running as a bundled executable, use the executable's directory.
    application_path = os.path.dirname(sys.executable)
else:
    # Otherwise, use the script's directory.
    application_path = os.path.dirname(os.path.abspath(__file__))

data_file = os.path.join(application_path, "5_letter_words.txt")

with open(data_file, "r") as file:
    word_list = [word.strip().upper() for word in file.readlines()]


#with open("5_letter_words.txt", "r") as file:
#    word_list = [word.strip().upper() for word in file.readlines()]

def check_word(entry_row):
    attempt_word = "".join([entries[entry_row][col].get().upper() for col in range(5)])
    if not attempt_word.isalpha() or len(attempt_word) != 5:
        messagebox.showerror("Invalid input", "It was not completed.")
        return

    used_indices = []
    for col, (ch1, ch2) in enumerate(zip(attempt_word, secret_word)):
        if ch1 == ch2:
            entries[entry_row][col].config(fg="green")
            used_indices.append(col)
        else:
            correct_indices = [i for i, c in enumerate(secret_word) if c == ch1 and i not in used_indices]
            if correct_indices and sum([1 for idx in correct_indices if attempt_word[idx] != secret_word[idx]]) > 0:
                entries[entry_row][col].config(fg="yellow")
            else:
                entries[entry_row][col].config(fg="gray")


def submit_word(row):
    global attempt_number
    check_word(row)
    if all([entries[row][col].cget("fg") == "green" for col in range(5)]):
        messagebox.showinfo("Congratulations", "You Won!!!")
        return
    elif row == 5:
        messagebox.showinfo("Game Over", f"You lost.\nThe correct word was {secret_word}")
    else:
        submit_buttons[row].config(state=tk.DISABLED)
        submit_buttons[row + 1].config(state=tk.NORMAL)


def submit_guess(row):
    global attempt_number
    check_word(row)
    if all([entries[row][col].cget("fg") == "green" for col in range(5)]):
        messagebox.showinfo("Congratulations", "Win")
        return
    elif row == 5:
        messagebox.showinfo("Game Over", f"You lost.\nThe correct word was {secret_word}")
    else:
        submit_buttons[row].config(state=tk.DISABLED)
        submit_buttons[row + 1].config(state=tk.NORMAL)


def validate_input(value, row, col):
    if len(value) <= 1 and (value == "" or value.isalpha()):
        if value:
            focus_next_widget(int(row), int(col))
        return True
    return False

def focus_next_widget(row, col):
    next_col = (col + 1) % 5
    next_row = row + 1 if next_col == 0 else row
    if next_row < 6:
        entries[next_row][next_col].focus_set()

secret_word = choice(word_list)

root = tk.Tk()
root.title("Wordle: studyingengineer.tistory.com")

tile_size = 50

entries = [[tk.Entry(root, width=2, font=("Helvetica", tile_size), justify="center",
                     validate="key", validatecommand=(root.register(validate_input), "%P", row, col)) for col in range(5)] for row in range(6)] # type: ignore

for row in range(6):
    for col in range(5):
        entries[row][col].grid(row=row, column=col)
        root.grid_rowconfigure(row, minsize=tile_size)

submit_buttons = [tk.Button(root, text="Submit", state=(tk.NORMAL if i == 0 else tk.DISABLED),
                            command=lambda row=i: submit_guess(row)) for i in range(6)]

for i, button in enumerate(submit_buttons):
    button.grid(row=i, column=5)

# New Game, Quit, and Visit buttons
button_width = 10
new_game_button = tk.Button(root, text="New Game", command=new_game, width=button_width)
new_game_button.grid(row=6, column=1)
quit_button = tk.Button(root, text="Quit", command=quit_game, width=button_width)
quit_button.grid(row=6, column=2)
visit_button = tk.Button(root, text="How To Play", command=open_url2, width=button_width)
visit_button.grid(row=6, column=3)

# URL label
url_label = tk.Label(root, text="https://studyingengineer.tistory.com", fg="blue", cursor="hand2")
url_label.grid(row=7, column=0, columnspan=6, sticky="nsew")
url_label.bind("<Button-1>", lambda e: open_url())

secret_word = choice(word_list)
root.mainloop()

 

 

참고할만한 다른 자료들

 

[Python] 파이썬으로 각종 단위 변환 프로그램 예제 (tistory.com)

 

[Python] 파이썬으로 각종 단위 변환 프로그램 예제

미국과 영국은 독특한 단위 체계를 사용하는 것으로 유명합니다. 전세계가 공용으로 사용하고 있는 SI (International System of Units) 단위 체계, 즉 미터법을 받아들이지 않고 버티는 것으로 유명합니

studyingengineer.tistory.com

[Python] 구구단 출력하기 파이썬 프로그램 예제 (tistory.com)

 

[Python] 구구단 출력하기 파이썬 프로그램 예제

이번 시간에는 파이썬으로 구구단을 출력해주는 프로그램을 만들어 보겠습니다. 구구단은 보통 1~9까지 숫자를 각각 1~9까지 곱해서 곱셈을 외우고 공부하기 쉽게 만든 것을 의미합니다. 그런데

studyingengineer.tistory.com

[Python] 윤년인지 여부 확인 파이썬 프로그램 예제 (tistory.com)

 

[Python] 윤년인지 여부 확인 파이썬 프로그램 예제

오늘은 입력한 연도가 윤년인지 아닌지 확인해주는 프로그램을 만들어 보겠습니다. 먼저 윤년에 대해 정확히 알고 있어야 합니다. 프로그램 언어를 공부하면서 질문을 받아 보면 많은 분들이

studyingengineer.tistory.com

 

728x90
반응형

관련글 더보기

댓글 영역