본문 바로가기

Studying/Python

20. miniProject(10) - 미국 states 퀴즈 (feat. turtle, pandas)

이번엔 미국의 지도를 띄워두고 50개 주 이름을 입력하는 퀴즈를 만들어볼 것이다. 

 

플레이어가 입력한 내용이 50개 주 이름에 있다면 지도 상 주 위치에 그 정답이 화면에 띄워지는 방식으로 진행할 것이다. 

 

예를 들어 미국 지도가 화면에 있고 Alaska 를 입력하면 지도 상 Alaska 위치에 표기가 될 것이다. 

 

주 이름과 스크린 상의 좌표는 미리 만들어놓은 csv 파일을 사용할 것이다. 

 

먼저 csv 파일이 무엇인지 간단히 이해하고 가자. 


csv 는 몇 가지 필드를 쉼표(,) 로 구분한 텍스트 및 텍스트파일이다. 확장자는 .csv 를 사용한다. 

 

즉, 각 칼럼을 쉼표 또는 공백으로 구분하며 모든 행을 나열한 파일 형식을 의미한다.

 

일반적인 텍스트 파일이므로 pycharm, vscode 같은 에디터에서 그냥 열리지만, 보기에 불편할 수 있다. 

 

더구나 파일이 크고 공백값이 존재할 경우, 열을 맞춰 데이터를 확인하기 불편해 쉽게 가공할 수 있는 기능이 필요하다. 

 

( csv 에 대한 내용은 아래 블로그를 참고했다. )

https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=resumet&logNo=221449693886

 

[Python] CSV 파일 읽고 쓰기 (Pandas)

파이선으로 어떤 과제를 수행하다 보면, CSV 형식의 파일을 읽고 써야 할 때가 많다. 이 때 여러가지 라...

blog.naver.com


이럴 때 우리가 사용할 것이 pandas 이다. 그렇다면 pandas 는 무엇일까?

 

pandas 는 Python Data Analysis Library로 빅데이터 분석을 위한 파이썬 라이브러리이다. 

 

엑셀이나 텍스트 파일, SQL 데이터베이스 등의 분석을 위해 사용할 수 있다. 

 

pandas 에는 여러 기능이 있지만 우리늰 csv 와 관련된 기능을 위주로 사용할 것이다. 

 

csv 파일을 가공하기 위해 우리에게 편리한 데이터 구조로 가져와야 한다. 

 

이 때 우리는 read_csv() 를 사용할 것이다. {  ex) data = pandas.read_csv("dataset.csv")  }

 

이름 그대로 csv 파일을 읽어 pandas 의 기본 데이터 구조인 DataFrame 으로 만들어준다. 

 

DataFrame 은 2차원 행 방향 ( index ) 와 열 방향 ( column ) 이 존재한다. 

 

불러온 DataFrame을 가공하는 방법은 직접 해보면서 예를 들기로 하자. 

 

그렇다면 만들어진 데이터를 pandas 를 통해 csv 로 새로 저장하는 경우에는 어떻게 해야 할까?

 

이 때는 to_csv() 를 사용한다. {  ex) pandas.to_csv("new_dataset.csv")  }

 

( pandas 에 대한 내용은 여기를 참고했다. )

https://wikidocs.net/32829

 

4) 판다스(Pandas) and 넘파이(Numpy) and 맷플롭립(Matplotlib)

데이터 분석을 위한 필수 패키지 삼대장이 있습니다. 바로 Pandas와 Numpy 그리고 Matplotlib입니다. 세 개의 패키지 모두 아나콘다를 설치했다면 추가 설치 없 ...

wikidocs.net


그럼 이제 실제적으로 위에서 말한 내용을 구현해보자. 

 

blank_states_img

 

먼저 준비한 미국의 지도이다. 우린 이 지도를 turtle.Screen 을 통해 screnn 에 불러와 활용할 것이다. 

 

50_states.csv

 

이 역시 미리 준비한 csv 파일이다. 

 

미국의 50개 주 이름과 각 주 위치에 맞는 지도 상 좌표를 구해 rowcolumn 을 구분하여 작성해 놓은 것이다. 

 

이제 진짜로 진행해보자. 

 

main.py (1)

 

먼저 pandasturtel 을 각각 import 한다. 

 

우리가 준비한 지도를 turtle.Screen 에 집어넣어야한다. 이럴 땐 어떻게 할까?

 

먼저 객체 image 에 준비한 지도 파일을 할당한다.  그리고 그 imagesceen.addshape() 를 통해 많은 shape 중 하나로 추가한다. ( 여기서 shape 는 기존에 사용했던 circle, turtle, square 등 을 의미한다. )

 

그리고 turtle.shape(image) 를 통해 turtle의 모양을 image 로 변경한다.

 

여기까지 하면 지도가 나온는 screen 이 완료된다. 

 

지도가 준비되었으니 마저 준비한 states 이름과 위치 좌표를 data 라는 이름의 객체로 가져오자. 

( data = pandas.read_csv( "50_states.csv" ) 

 

준비해뒀던 csv 에서 state column 이 있다. 이 column 만 따로 가져와서 all_states 에 지정한다. 

( all_states = data.state.to_list() -- data로 지정한 csv 파일의 state 에 해당하는 내용을 리스트 형식으로 to_list() 하는 것 )

 

그리고 guessed_states 라는 빈 list 를 만들것이다.

 

list 는 퀴즈 게임을 진행하면서 정답을 맞춘 주를 추가할 것이고 나중에 50개의 주에서 차감하여 앞으로 공부해야할 주 목록을 담은 states_to_learn.csv 파일을 만들 때 사용할 것이다. 

 

main.py (2)

 

이제 직접적인 게임을 실행해보자. 

 

50개의 주를 다 입력하기 전까진 계속 진행할 것이므로 while len(guessed_states) < 50 으로 반복문을 작성한다. 

 

screen 이 실행될 때 먼저 text 를 입력받을 textinputprompt 를 사용한다. 

 

이 때 플레이어가 입력한 내용 answer_states"Exit" 일 경우, missing_states 라는 새로운 변수를 생성한다. 

 

missing_statesall_states 의 값들을 가져오는데 guessed_states 에 없는 state 만 가져온다는 뜻이다. 

( list comprehension 을 사용 )

 

listmissing_states 를 데이터형식으로 바꾸기 위해 new_data = pandas.DataFrame(missing_states) 를 사용한다. 

 

그리고 이 new_datacsv 파일로 다시 변환하고 break 문을 사용하여 while 을 탈출한다. 

 

이제 answer_state 로 입력받은 내용이 all_states 에 포함되어 있다면, 즉 정답 중 하나라면, 

 

guessed_states list 에 그 값을 추가시키고 turtle 을 통해 준비했던 좌표에 주 이름을 작성하도록 한다. 

 

 

게임 실행 화면