본문 바로가기
잡담

추첨기

by 꾸욱꾸우욱 2021. 6. 17.

오늘 해볼 것은 간단하게 추첨기를 만들어 보는 것이다. 

생각하게 된 이유는 이러하다. 본인이 속한 채팅방에서 간혹 추첨 이벤트를 진행하는데, 이때 방의 하트를 누른 수만큼 당첨 확률을 높여준다. 이때 인터넷 사이트에 값을 입력하여 진행하였는데, 매번 이름을 입력해야 하고 당첨 확률 상승을 위해 중복해서 이름을 입력해야 하는 번거로움이 있었다. 이를 해결하고자 간단한 코드를 작성하게 되었다.


우선 코드를 살펴보자.

import random
from time import sleep
r = open('list.txt', mode = 'rt', encoding = 'utf-8')

textfile = r.readlines()
marvel = []

for one in textfile:
    name, number = one.split()
    for i in range(int(number)):
        marvel.append(name)

result = random.sample(marvel, 1)
print('Press Enter to Start...', end = '')
input()

for i in range(3, 0, -1):
    print(i)
    sleep(1)

print(result[0] + " is the winner! Congratulations!!!")
print('Press Enter to Exit...')
input()

추첨기 이므로 랜덤 모듈을 import 하였다. 또한 의도적으로 추첨 결과를 천천히 공개하기 위해 sleep도 import 하였다. 

번거롭게 매번 입력하는 과정을 보완하기 위해 txt 파일에 이름과 숫자를 입력해 두는 방식으로 진행하고자 했다. txt 파일 양식은 "이름 숫자"로 작성해주면 된다.

list.txt 파일 예시

open을 이용하여 txt 파일을 읽기 모드로 열어준다. 여기서 읽고자 하는 파일명은 list.txt이다. 해당 파일을 불러온 뒤 textfile 변수에 readlines를 이용하여 리스트의 형태로 한 줄씩 담아준다. 이후, 추첨을 위해 이름을 담아줄 marvel 리스트를 선언해준다. 

 

for문을 이용하여 textfile의 리스트 값을 하나씩 불러온다. 해당 요소를 이름과 숫자로 구분한 뒤, 숫자만큼 marvel 리스트에 이름을 추가해준다.

 

이후 한 명을 추첨하기 위해 random.sample을 이용한다. 3초 후 결과를 보여주기 위해 의도적으로 sleep을 반복하여 대기하게 한 뒤 결과를 출력한다. 이상으로 코드가 마무리된다.


다음으로 해당 코드를 exe 파일로 변환해보도록 하겠다. 크게 어렵지 않은 과정이다. 우선 다음 명령어를 cmd 창에 입력해준다.

pip install pyinstaller

 

이후 코드를 작성한 경로로 이동한 뒤 다음 명령어를 입력해준다.

pyinstaller --onefile "파이썬_파일_이름".py

 

본인이 작성한 파이썬 파일의 이름을 작성하여 입력을 완료하면 exe 파일이 완성되는 것을 확인할 수 있다.

 

생성된 exe 파일이 있는 경로에 list.txt 파일을 함께 위치시킨다면 정상적으로 실행된다.


코드는 매우 심플하고 이해도 어렵지 않다. 일상의 작은 불편함을 코딩으로 쉽게 풀어낼 수 있다는 점이 매력적이다. 파이썬을 잘 활용한다면 사소한 문제들에도 적용할 수 있는 듯하다.


2021년 8월 30일에 프로그램을 수정하였다. 카운트 애니메이션을 추가하고 좀 더 UI를 알아보기 쉽게 바꾸었으며, 가능한 선택지를 두 개로 만들어 데이터 베이스 수정을 더욱 줄이고 사용자가 편하게 사용할 수 있도록 하였다.

 

import random
import os
import sys
from time import sleep

# show menu
def selMode():
    print("-------------------------------------")
    print("|                                   |")
    print("|      ~Marvel Candy Lottery~       |")
    print("|                                   |")
    print("|            Select Mode            |")
    print("|            1. over two            |")
    print("|            2. all                 |")
    print("|            3. exit                |")
    print("|                           © Kkook |")
    print("-------------------------------------")
    print()

    check = 0
    num = int(input())
    check += 1
    while num < 1 or num > 3:
        print("Please Select Correct Number")
        num = int(input())
        check += 1

        if check > 4:
            print("idiot...")
    
    return num

# over two recommend person process
def overTwo(marvel):
    lottery = [] # save subject
    for data in marvel:
        name, number = data[0], int(data[1])
        if number > 1:
            for i in range(number):
                lottery.append(name)

    countTime()
    result = random.choice(lottery)    
    
    print("-------------------------------------")
    print("|                                   |")
    print("|         ~Congratulations~         |")
    print("|                                   |")
    print("|             The WINNER            |")    
    print("                 " + result + "               ")
    print("|                                   |")
    print("|     Press Any Button to Return    |")
    print("|                           © Kkook |")
    print("-------------------------------------")
    print()

    input()

# select from all
def all(marvel):
    lottery = [] # save subject
    for data in marvel:
        name, number = data[0], int(data[1])
        lottery.append(name)

    countTime()
    result = random.choice(lottery)    
    
    print("-------------------------------------")
    print("|                                   |")
    print("|         ~Congratulations~         |")
    print("|                                   |")
    print("|             The WINNER            |")    
    print("                 " + result + "               ")
    print("|                                   |")
    print("|     Press Any Button to Return    |")
    print("|                           © Kkook |")
    print("-------------------------------------")
    print()

    input()
    
# count 3 seconds
def countTime():
    print(" ○○○○")
    print("        ○")
    print(" ○○○○")
    print("        ○")
    print(" ○○○○")
    sleep(1)
    os.system("cls")

    print(" ○○○○")   
    print("        ○")
    print(" ○○○○")
    print("○")
    print(" ○○○○")
    sleep(1)
    os.system("cls")

    print("    ○")   
    print("  ○○")
    print("    ○")
    print("    ○")
    print(" ○○○○")
    sleep(1)
    os.system("cls")

    animation = "|/-"

    for i in range(10):
        sleep(0.1)
        sys.stdout.write("\r" + animation[i % len(animation)])
        sys.stdout.flush()
    os.system("cls")
        
# read file
r = open('list.txt', mode = 'rt', encoding = 'utf-8')
textfile = r.readlines()
marvel = []

# save data to marvel list dividing by name and number
for one in textfile:
    name, number = one.split()
    marvel.append([name, number])

# main function
while True:
    os.system("cls")
    mode = selMode()

    if mode == 1:
        os.system("cls")
        overTwo(marvel)
    elif mode == 2:
        os.system("cls")
        all(marvel)
    else:
        os.system("cls")
        print("Good Bye")
        sleep(3)
        break

'잡담' 카테고리의 다른 글

컴공 1학년 1학기 중간고사 대비문제  (1) 2022.04.01
화면 클릭 매크로  (0) 2022.03.09
카카오톡 채팅 수 분석  (0) 2021.04.23
꾸욱꾸우욱의 이야기  (0) 2019.06.17