- 이번 프로그램은 이전글(2022.08.09 파이썬 로또 번호 맞추기 게임) 파이썬 로또번호맞추기 게임 만들기의 GUI 버전입니다.
게임의 규칙은 1~45의 숫자를 띄어쓰기로 6개 입력 후 '시작' 버튼을 누르면 로또번호 당첨여부를 알려주는 간단한 게임입니다.
(본 블로그의 내용은 유튜브 동영상(파이썬 GUI/윈도우 로또 번호 맟추기 게임 만들기)에서 더욱 자세히 보실 수 있습니다.)
(1) 1~45까지의 숫자 6개를 중복없이, ' '(띄어쓰기)로 구분하여 입력합니다. 예) 1 2 3 4 5 6
(2) '엔터'나 시작 버튼을 클릭합니다.
(3) 결과창에 '당첨번호', '내번호', '내가 맞춘 개수' 등 결과를 보여줍니다.
# -*- coding: utf-8 -*-
import sys
from PyQt5.QtWidgets import *
from PyQt5 import uic, QtCore, QtGui, QtWidgets
from PyQt5.QtGui import *
import random
form_class = uic.loadUiType("5.ui")[0]
class MyWindow(QMainWindow, form_class):
def __init__(self):
# global tries
super().__init__()
# self.setFixedSize(620,582)
self.setWindowIcon(QIcon("pagicacha.png"))
self.setupUi(self)
self.lineEdit.setFocus()
self.pushButton.clicked.connect(self.start)
self.lineEdit.returnPressed.connect(self.start)
# self.input.returnPressed.connect(self.enter_key)
def start(self):
##################################################################
# 2. 컴퓨터가 생성한 로또 번호
##################################################################
lotto = []
while True:
num = random.randint(1,45)
if num not in lotto:
lotto.append(num)
if len(lotto) == 6:
break
print("당첨번호=", lotto)
##################################################################
##################################################################
# 3. 내가 입력한 로또 번호
##################################################################
if self.lineEdit.text():
userInputKeywords = self.lineEdit.text()
userInputKeywords = userInputKeywords.strip()
newuserInputKeywords = userInputKeywords.split(' ')
print(newuserInputKeywords)
self.textEdit.clear()
mine = []
##################################################################
# 4. 내가 입력한 로또번호의 입력값 검증(숫작 맞는지, 6개가 맞는지 등)
##################################################################
for userInputKeyword in newuserInputKeywords:
print(userInputKeyword)
userInputKeyword = userInputKeyword.strip()
print(userInputKeyword)
n = userInputKeyword
if n.isdigit() == True and (int(n) >=1 and int(n) <=45):
mine.append(int(n))
else:
print("입력값이 올바르지 않거나(숫자아님), 6개가 아닙니다.")
self.textEdit.setText("입력값이 올바르지 않거나(숫자아님), 6개가 아닙니다.")
if len(mine) != 6:
print("입력값이 올바르지 않거나(숫자아님), 6개가 아닙니다.")
self.textEdit.setText("입력값이 올바르지 않거나(숫자아님), 6개가 아닙니다.")
else:
##################################################################
# 5. 컴퓨터가 생성한 로또 번호와 내가 입력한 로또번호 비교 후 결과 표시
##################################################################
pass
same = 0
for myN in mine:
if myN in lotto:
same += 1
print("당첨번호=", lotto)
self.textEdit.append("당첨번호= "+str(lotto))
print("내번호 = ", mine)
self.textEdit.append("내번호 = "+str(mine))
print("내가 맞춘 개수는 = ", same)
self.textEdit.append("내가 맞춘 개수는 = "+str(same))
score = [0,6,5,4,3,2,1]
if same == 0:
print("맞추신 번호가 없습니다.")
else:
print(f" {same}개 맞음, {score[same]} 등 당첨!")
self.textEdit.append(f" {str(same)}개 맞음, {str(score[same])} 등 당첨!")
else:
self.textEdit.setText("번호를 띄어쓰기로 6자 입력해 주세요.")
##################################################################
# 1. GUI/윈도우 창 띄우기
##################################################################
if __name__ == '__main__':
app=QApplication(sys.argv)
window = MyWindow()
window.show()
print("Before event loop")
app.exec_()
print("After event loop")
1.form_class = uic.loadUiType("5.ui")[0]<--Qt Designer로 미리 만들어둔 5.ui를 사용하기 위해 form_class변수에 할당합니다.
2.self.setupUi(self)<-- 위에서 만들어둔 폼(form_class)를 사용하겠다라는 의미입니다.
3.self.lineEdit.setFocus()<--처음 실행시 커서의 포커스를 라인에디트에 놓아 둡니다.
4.app=QApplication(sys.argv)<-- QApplication 클래스의 app객체를 생성
5.window = MyWindow()<--MyWindow 클래스의 window객체 생성 후
6.window.show()<--윈도우를 띄우고,
7.app.exec_()<--윈도우를 지속적으로 실행
8.self.pushButton.clicked.connect(self.start)<--pushButton(시작버튼) 클릭시 start함수 호출(실행)
9.self.lineEdit.returnPressed.connect(self.start)<--lineEdit에서 엔터를 누르면 start함수 호출(실행)
10.num = random.randint(1,45)<--1~45사이의 숫자를 랜덤하게 생성 후 num변수에 할당
11.
if num not in lotto:<--중복을 방지, 즉 lotto리스트에 동일한 숫자가 없으면 if문 실행
lotto.append(num)<--lotto리스트에 랜덤생성 숫자를 append
12.
if len(lotto) == 6:<--lotto리스트에 숫자가 6개이면(즉, 로또 번호가 모두 찼으면)
break<-- while 루프를 빠져나옴
13.userInputKeywords = self.lineEdit.text()<--lineEdit의 텍스트를 읽어서 userInputKeywords변수에 저장
14.userInputKeywords = userInputKeywords.strip()<--userInputKeywords의 양쪽 공백을 제거
15.newuserInputKeywords = userInputKeywords.split(' ')<--입력된 6개의 숫자를 공백(‘ ‘)을 분리
16.
if n.isdigit() == True and (int(n) >=1 and int(n) <=45):ß 사용자가 입력한 값이 1~45사이의 숫자이면 if문 실행
mine.append(int(n))<--mine(나의 로또번호목록)리스트에 append
17.
if len(mine) != 6:<--mine리스트의 객수가 6개가 아니면 안내 문구 출력
18.
for myN in mine:<--내가 입력한 값이
if myN in lotto:<--lotto리스트에 있으면
same += 1<-- same변수를 1 증가
19.score = [0,6,5,4,3,2,1]<-- 스코어에 따라서
20.self.textEdit.append(f" {str(same)}개 맞음, {str(score[same])} 등 당첨!")<-- 등수를 알려줌
1.윈도우 창 띄우는 코드로 모듈 임포트 및 클래스를 선언하고, 폼을 불러오고(form_class = uic.loadUiType("5.ui")[0]), app객체를 만들고, exec_()함수로 윈도우창을 지속적으로 띄웁니다.
2. 컴퓨터가 로또번호를 생성합니다. while문으로 1~45까지의 숫자를 num변수에 넣은 후 lotto리스트에 중복된 수가 없으면 해당 숫자를 append합니다. 그리고 6개의 숫자가 lotto리스트에 모두 차면 루프를 빠져 나옵니다.
3.내가 입력한 로또번호를 확인합니다. self.lineEdit.text()에 입력된 6개의 숫자를 가져와서 양쪽 공백을 제거하고(userInputKeywords.strip()) 공백으로 숫자들을 분리(userInputKeywords.split(' '))합니다. 그리고 결과 화면에 로또 결과를 보여주기 위해 깨끗하게(self.textEdit.clear()) 합니다.
4.내가 입력한 로또번호의 입력값이 올바른지 확인합니다. 내가 입력한 값이 1~45의 사이의 숫자가 아니거나(if n.isdigit() == True and (int(n) >=1 and int(n) <=45): ), 숫자 6개인지(if len(mine) != 6: )를 확인합니다.
5.마지막으로 컴퓨터가 생성한 로또 번호와 내가 입력한 로또번호가 몇 개나 맞았는지 확인 후 결과를 결과창에 보여줍니다.
for문으로 내가 입력한 값을 하나씩 컴퓨터가 생성한 로또번호와 비교 후 같으면(if myN in lotto: ) same변수를 1 증가시키고, 결과창에 컴퓨터가 생성한 번호(당첨번호), 내가 입력한 번호, 그리고 내가 맞춘 개수(same)를 보여주고, 최종적으로 맞춘 개수에 따라 등수(score = [0,6,5,4,3,2,1], {str(score[same])} 등 당첨! )를 표시해 줍니다.
위의 내용이 유익하셨다면, 좋아요와 구독 부탁드립니다.
감사합니다.
'파이썬 실습 > 게임 만들기' 카테고리의 다른 글
파이썬 GUI 한글 타자 게임 만들기 (0) | 2022.11.06 |
---|---|
파이썬 GUI 영어단어맞추기 게임 (0) | 2022.10.18 |
파이썬 GUI 숫자 야구게임 만들기 (0) | 2022.10.09 |
파이썬 숫자 야구 게임 만들기 (0) | 2022.08.15 |
파이썬 로또 번호 맞추기 게임 만들기 (0) | 2022.08.09 |