본문 바로가기

Python

20210113_ Python 입문10(총 활용), 간단한 타이핑 게임

Python 을 활용한 간단한 타이핑 게임 만들기

1. 게임 구상

  • 한컴 타자연습과 같이 게임에서 타이핑 해야하는 문자를 출력한다.
  • 사용자의 입력을 받는다.
  • 사용자의 입력과 게임에서 출제하는 문제 출력과 동일한지 체크한다.
  • 동일하다는 출력문, 다르다는 출력문 출력 중에서 하나 출력 하고 동시에 해당하는 사운드 출력
  • 5문제 정도 반복 후 게임 끝 출력
  • 맞은 개수에 따른 합격, 불합격 출력
  • 맞은 개수, 걸린 시간, 출력
  • 데이터 베이스 연동 (id, 맞은 개수, 걸린 시간, 등록 시간)

2. 필요한 패키지 import

import random # 문제 뽑거나 섞을때 무작위
import time # 걸린 시간을 측정하기 위해서
import winsound # 정답, 오답 사운드를 출력하기 위해서
import sqlite3 # 데이터 베이스 연동을 위해서
import date time # 데이터 베이스 등록 시간 필드를 위해서

3. 게임 전체 간단한 틀 만들기

1) 출력할 문제 리스트화 시키기

  • strip 함수 : 값의 개행, 공백 제거시
words = [] # word 라는 단어를 모을 리스트 생성

with open("./word.txt", 'r') as f: 
#  단어들을 모아둔 txt 파일을 word list에 리턴
    for c in f:
        words.append(c.strip()) # strip 함수를 써줘야 /n 개행이 문자로 같이 안들어옴 

2) 문제 실행 전 안내 메세지 (input)

  • input 함수 : enter 키가 실행 될때까지 기다림, 입력을 받을 수 있음
input("Ready? Press Enter key!")

3) 시간을 재기 위한 time 모듈의 time 함수 사용

  • 파이썬 내장 모듈인 time 모듈의 time 함수: timestamp를 얻는 함수
  • 즉, 현재 시간의 고유 timestamp 숫자를 얻는 것이다.
  • format 함수 : 값의 서식을 지정하고 싶을 경우, format(값 , "서식법")
start = time.time() # start 변수에 timestamp 할당
    "게임 출력"
end = time.time() # end 변수에 timestamp 할당

et = end - start # et변수가 걸린시간이 되는 것임
et = format(et, ".3f")

4) 본격적인 게임 실행 구조 1_(문제 출력과 입력 받기)

  • random.suffle함수
  • random.choice함수
start = time.time() # 시작 시간 기록

"1. 문제 출력 & 입력"
n = 1  # 문제 회차 설정
cor_cnt = 0 # 정답 개수 설정
while n <= 5 :  # 총 5문제 출제
    random.suffle(words)    # words 리스트를 섞는다.
    q = random.choice(words)   # words 리스트에서 무작위로 1개 뽑는다.

    print("Qestion # {}".format(n)) # 현재 문제 회차 출력

    x = input() # 타이핑 입력 받기, 입력 받은 문자 x변수에 할당

    "2. 정답 확인 코드 블록 자리"

    n += 1 # 회차 증가 설정

end = time.time() # 종료 시간 기록

"3. 게임 종료 결과 메세지 코드 블록 자리"

5) 본격적인 게임 실행 구조 2_(정답 확인하기)

start = time.time() # 시작 시간 기록

"1. 문제 출력 & 입력"
n = 1
cor_cnt = 0
while n <= 5 : 
    random.suffle(words) 
    q = random.choice(words) 
    print("Qestion # {}".format(n)) 
    x = input() 

    print() # 구분을 위해서 개행 출력

"2. 정답 확인"
    if str(q).strip() == str(x).strip():
     # 리스트 값의 안전성을 위해서 str로 형변환하고 strip 함수를 통해 다시한번 공백과 개행 제거
        print("Pass!") # 정답 안내 출력
        winsound.PlaySound('./sound/good.wav', winsound.SND_FILENAME)
        # 정답 Sound 출력 -> winsound 모듈 playsound 함수 (경로, 어떤걸 했는지 옵션)
        cor_cnt += 1 # 정답 개수 1개 증가 설정
    else:
        print("Wrong!") # 오답 안내 출력
        winsound.PlaySound('./sound/bad.wav', winsound.SND_FILENAME)
        # 오답 sound 출력

    n += 1

end = time.time() # 종료 시간 기록

"3. 게임 종료 결과 메세지 코드 블록 자리"

6) 본격적인 게임 실행 구조 3_(게임 종료 결과 메세지)

start = time.time()

"1. 문제 출력 & 입력"
n = 1
cor_cnt = 0
while n <= 5 : 
    random.suffle(words) 
    q = random.choice(words) 
    print("Qestion # {}".format(n)) 
    x = input() 
    print() 

"2. 정답 확인"
    if str(q).strip() == str(x).strip():
        print("Pass!")
        winsound.PlaySound('./sound/good.wav', winsound.SND_FILENAME)
        cor_cnt += 1
    else:
        print("Wrong!")
        winsound.PlaySound('./sound/bad.wav', winsound.SND_FILENAME)

    n += 1
end = time.time() 

"3. 게임 종료 결과 메세지"
et = end - start # 걸린 시간 변수
et = format(et, ".3f")

print('-----------게임 종료!-----------') # 게임 종료 메세지

if cor_cnt >= 3:        # 합격, 불합격 메세지
    print('합격!')
else:
    print('불합격!')

# 게임시간, 정답개수 안내 메세지
print("게임 시간 : {} / 정답 개수 : {}".format(et ,cor_cnt))

4. DB 연동 시키기

1) DB 연동 관련 패키지, 모듈 import

"게임 구조 관련한 패키지,모듈"
import random
import time
import winsound
"DB 연동을 위한 패키지, 모듈"
import sqlite3
import datetime

2) 본격적인 DB 연동

import random
import time
import winsound
import sqlite3
import datetime

"DB 파일 생성 및 연결"
conn = sqlite3.connect("C:/record.db", isolation_level=None)
# Auto commit 모드

"커서 연결"
cursor = conn.cursor()

"테이블 및 필드 생성"
cursor.execute("CREATE TABLE IF NOT EXISTS recods(id INTEGER PRIMARY KEY AUTOINCREMENT, cor_cnt INTEGER, record text, regedate text)")
# AUTOINCREMENT는 굳이 입력 안해도 자동으로 넣어주는 거임
# id , cor_cnt, record, regedate 필드 생성

"게임 구조 코드 블록 자리"

"게임 종료 후 DB로 데이터 기록하기"
regedate = datetime.datetime.now().strftime('%Y-%m-%d %H:%M-%S')
# regedate 등록 날짜 시간 할당 datetime 함수 사용하고 strftime으로 서식 지정
cursor.execute("INSERT INTO records('cor_cnt', 'record', 'regedate') VALUES(?, ?, ?)", (cor_cnt, record, regedate))

5. 테스트 문

  • 모듈을 테스트를 해야 되는데, 이미 어느 정도 만들고 다른 곳에 import 하여 사용하고 있는 중이라면 테스트문 없이 넣는다면 계속해서 모듈 코드가 변화해서 다른 곳에 영향을 주게 된다.
"게임 코드 블럭"

"테스트 문"
if __name__ == '__main__':
    pass # 시도할 코드 작성 부분
  • 시도할 코드 부분 부터는 실행을 만들고 있는 모듈에서 실행 시켜도 다른 곳에 영향을 주지 않는다.