본문 바로가기

Toy Project/길드사다리 번호 추첨기

[Toy Project] 오딘:발할라라이징 길드사다리 번호 추첨기

728x90
반응형

오딘에서 중립길드로 플레이 하면서 메인 컨텐츠로는 길드던전이 있을 것이다. 길드 던전은 1단계 ~ 12단계 까지 있지만, 10단계 이후는 솔직히.. 라인 아니면 어떻게 깰 수 있을까... 어찌됫든... 각 단계를 클리어하면 희귀 스킬북, 희귀/영웅 교본 등 아이템을 얻을 수 있는데, 내가 속한 길드에서는 원하는 아이템이 있으면 투표를 통해서 추첨하는 형식으로 진행하고 있다.

 

그 동안 아이템 투표 ~  번호 추첨을 통한 아이템 분배는 길드장이 담당해서 수행해 왔지만, 최근 길드장의 부재로 부길드장인 내가 진행을 했었는데, 생각보다 번거로운 일인 것 같다.. 그래서 개발 공부도 할겸 한번 만들어 보기로 했다.

 

작성 글 마지막에는 만들어진 파일을 업로드 해놓았다.. 혹시나.... 필요하신 분들이 계시다면, 사용해 보고,,, 좋은 의견이나 개선할 점이 있으면 알려주시면 감사하겠습니다.

 

길드 사다리 번호 추첨기


1. 번호 추첨기 기능 개발

만들려고 하는 컨셉은 최대한 간단하게 개발하는 것을 목적으로 하고, GUI 프로그래밍을 통해서 PC에서 조작할 수 있도록 만들고자 했다. 기능은 (1) 번호 추천, (2) 결과 출력 하는 것으로 정의를 하였다.

(1) 번호 추천은 예를 들어서 A라는 아이템이 2개가 있고, 10명이 투표를 진행했다면, 1~10의 번호 중 중복없이 2개의 번호를 추출하는 것으로 개발하였다.

(2) 결과 출력은 해당 아이템 이름을 입력받고, (1) 번호 추천 기능을 통해 추첨된 번호를 display 하는 것으로 개발하였다.

import random

class RandomNumberGenerator:
    def __init__(self, max_value):
        self.min_value = 1
        self.max_value = max_value

    def generate_unique_random_numbers(self, quantity):
        if self.max_value - self.min_value + 1 < quantity:
            raise ValueError("중복 없이 생성할 수 있는 숫자의 범위보다 추천할 숫자의 갯수가 많습니다.")

        numbers = random.sample(range(self.min_value, self.max_value + 1), quantity)
        return sorted(numbers)  # 오름차순 정렬

    def display_with_string(self, user_string, quantity):
        numbers = self.generate_unique_random_numbers(quantity)
        result = f"{'아이템 이름':^12}: {user_string}\n{'추천번호':^12}: {', '.join(map(str, numbers))}"
        return result

 

2. GUI 개발

GUI 개발은 chatGPT를 활용해서 개발 하였다.(사실상 chatGPT가 개발하였다..)

구조는 (1) GUI 디자인 (2) 데이터 입력 (3) 데이터 초기화 하는 부분으로 개발하였다.

 

(1) GUI 디자인

import tkinter as tk
from tkinter import ttk, messagebox

class App(tk.Tk):
    def __init__(self):
        super().__init__()

        self.title("번호 추천기")
        self.geometry("290x210")

        self.create_widgets()

    def create_widgets(self):
        self.result_label = ttk.Label(self, text="", background="white", wraplength=300)
        self.result_label.grid(column=0, row=0, columnspan=2, padx=10, pady=10, sticky="WE", rowspan=3)

        self.item_label = ttk.Label(self, text="아이템:")
        self.item_label.grid(column=0, row=3, padx=10, pady=5, sticky="E")

        self.item_entry = ttk.Entry(self)
        self.item_entry.grid(column=1, row=3, padx=10, pady=5)

        self.quantity_label = ttk.Label(self, text="번호 갯수:")
        self.quantity_label.grid(column=0, row=4, padx=10, pady=5, sticky="E")

        self.quantity_entry = ttk.Entry(self)
        self.quantity_entry.grid(column=1, row=4, padx=10, pady=5)

        self.max_value_label = ttk.Label(self, text="최대 번호:")
        self.max_value_label.grid(column=0, row=5, padx=10, pady=5, sticky="E")

        self.max_value_entry = ttk.Entry(self)
        self.max_value_entry.grid(column=1, row=5, padx=10, pady=5)

        self.generate_button = ttk.Button(self, text="실행하기", command=self.generate_numbers)
        self.generate_button.grid(column=0, row=6, padx=10, pady=10)

        self.clear_button = ttk.Button(self, text="초기화", command=self.clear_entries)
        self.clear_button.grid(column=1, row=6, padx=10, pady=10)

        self.made_by_label = ttk.Label(self, text="만든이 God태연", anchor="se")
        self.made_by_label.grid(column=1, row=7, padx=10, pady=10, sticky="SE")

 

반응형

(2) 데이터 입력

    def generate_numbers(self):
        try:
            user_string = self.item_entry.get().strip()
            if not user_string:
                raise
            user_string = self.item_entry.get().strip()
            if not user_string:
                raise ValueError("아이템 이름을 입력해주세요.")

            quantity_str = self.quantity_entry.get().strip()
            max_value_str = self.max_value_entry.get().strip()

            if not quantity_str or not max_value_str:
                raise ValueError("번호 갯수와 최대 번호를 입력해주세요.")
            
            if not quantity_str.isdigit() or not max_value_str.isdigit():
                raise ValueError("번호 갯수와 최대 번호는 숫자만 입력해주세요.")

            quantity = int(quantity_str)
            max_value = int(max_value_str)

            if quantity > max_value:
                raise ValueError("생성할 숫자의 갯수가 최대 번호보다 큽니다.")

            generator = RandomNumberGenerator(max_value)
            combined_result = generator.display_with_string(user_string, quantity)
            self.result_label.config(text=combined_result)

        except ValueError as e:
            messagebox.showerror("오류", str(e))

 

(3) 데이터 초기화

    def clear_entries(self):
        self.item_entry.delete(0, "end")
        self.quantity_entry.delete(0, "end")
        self.max_value_entry.delete(0, "end")
        self.result_label.config(text="")

 

제가 만든 길드 사다리 번호 추첨기 파일 입니다.. 허접한 결과물이지만, 필요하신 분들께서는 사용해 보시고, 개선할 점이나 부족한 점이 있으면 피드백 주시면 감사하겠습니다. :-)

 

길드사다리_v0.1.exe
8.69MB

728x90
반응형