8. 공 굴리기 게임(파이선)

【배우기】


1. 파이선으로 게임 만드는 방법 알기

2. 파이선으로 게임 만들기

1파이선으로 게임 만드는 방법 알기

앞에서 모든 파이선 프로그램 코딩에 대해서 이해하고 학습하였다면, 이번 단원에서는 파이선으로 간단한 게임을 만들어 보려고 한다. 그렇다면 파이선으로 게임을 어떻게 만들 수 있을까? 사실 파이선에 서는 GUI(그래픽 유저 인터페이스)의 사용을 위해서는 pygame 등과 같은 모듈을 설치하여 게임을 만들 수 있으나, 현재까지 모듈을 설치하고, 사용하는 방법에 대해서는 학습하지 않았으므로 텍스트 형태로 게임을 만들어야 할 것이다. 그리고 파이선에서도 게임을 만들 때는 게임을 구상하고, 구상에 따라게임에 대한 전략을 수립한다. 그리고 게임에 대한 문제를 생각하고 문제점을 해결한 후 게임을 만들 수 있다. 따라서 우리는 이 번 단원을 통해서 파이선으로 어떻게 게임을 만들 것인지 알아보고, 간단한 프로그램으로 게임을 만들어 보도록 하자.

1. 파이선으로 게임 전략 수립하기

파이선으로 게임을 만들기 위해서는 게임에 대한 전략을 먼저 수립하여 보도록 하자. 가장 먼저 어떤 게임을 만들 것인지에 대한 주제 또는 목적을 세워야 하는데, 엔트리에서 공 굴리기 게임을 만들었듯이 파이선에서도 공을 굴려서 거리에 따라 승패를 결정하는 게임을 만들어 보자. 그렇다면 공을 굴리는 모습을 보이지 않는 파이선에서는 텍스트 형태로 값을 표현할 수 있도록 하며, 게임의 내용을 어떻게 사용자에게 전달하여야 할지 생각해보며, 게임의 전략을 수립한다.

2. 파이선 게임의 문제 해결하기

이번 게임을 만들 때의 문제점을 생각하여 보자. 가장 먼저 첫 번째로 파이선의 기본 모듈에서는 GUI(그래픽 유저 인터페이스)를 제공하지 않고 있다. 따라서 대부분이 문장 형태로 게임이 구성되어야 하는 어려움이 있다. 두 번째는 게임을 할 때, 키보드의 이벤트를 발생하기 위해서는 키보드의 이벤트를 주고받을 수 있는 모듈이 설치되어야 하는 어려움이 있다. 그리고 마지막으로 게임을 반복적으로 실행시키기 위해서는 복잡한 반복구조와 선택구조를 통해서 만들어야 한다. 그렇다면 어떻게 이런 문제들을 해결할 수 있을까 생각해보자. 우선 첫 번째로 게임에 대한 설명을 충분히 사용자에게 전달하여 게임을 진행할 수 있도록 한다. 두 번째로는 모듈의 설치에 대한 어려움을 키값을 입력받아 움직일 수 있도록 한다. 그리고 마지막으로 복잡한 구조는 반복구조 안에 선택구조를 넣어서, 최대한 간결하게 프로그램 코딩할 수 있도록 하여 문제를 해결할 수 있도록 한다.

2파이선으로 게임 만들기

게임을 만들기 위한 방법이 수립되고 해결되었다면 다음으로는 게임을 직접 만들어 보도록 하자. 게임을 만들기 위해서는 게임을 시작할 것인지에 대해서 사용자로부터 값을 입력받아 진행한다. 게임을 시작하기로 하였다면, 첫 번째 선수가 공을 굴릴 것인지 사용자에게 입력받고, 공을 굴린다는 입력을 받으면, 공을 굴려서 나오는 거리의 값을 랜덤 패키지를 통해서 값을 입력받은 후, 값을 결과 값에 저장한다. 그리고 다음으로 두 번째 선수가 공을 굴릴 것인지에 대해서 입력받도록 하고, 공을 굴린다는 입력을 받으면, 랜덤 패키지를 통해서 거리의 값을 입력받은 후, 값을 결과값에 저장하게 된다. 첫 번째와 두 번째 선수가 모두 공을 굴렸다면, 결과 값을 비교하여 승패를 결정한 후 값을 화면에 출력해준다. 그렇다면 파이선으로 프로그램 코딩을 하며, 하나씩 학습하여 보도록 하자.

화상키보드 사용법은 2단원 2차시의 지체장애 학생을 위한 컴퓨터 환경 만들기를 참조하자.

1. 파이선 게임 프로그램 코딩

파이선으로 공 굴리는 게임에 대한 전체적인 프로그램 코딩은 아래와 같은데, 프로그램은 대략적으로 살펴보면 첫 부분은 변수들이 선언되어 있으며, 다음에는 반복구조 안에 선택이 들어가 있는 형태의 순차구조를 가지고 있다.

import random


start=‘’

player_start=‘’

player_one=0

player_two=0



while True:


     print(“--------------- 공 굴리기 게임 --------------”)

     print(“--------------- 게임 시작(s) ---------------”)

     print(“--------------- 종 료(q) --------------- ⁄n”)


     start=input(“시작은 원하면 s, 종료를 원하면 p를 입력: ”)

     print(“ ⁄n”)


     if start==‘s’ or start==‘S’ :

       print(“첫 번째 선수의 공 굴리기가 시작된다. ⁄n”)

       player_start=input(“첫 번째 선수의 공 굴리기를 시작은 ‘s’를 입력: ”)

       print(“ ⁄n”)

       if player_start==‘s’ or player_start==‘S’ :

         player_one=random.randint(1,200)

         print(“첫 번째 선수의 공이 굴러간 거리는”, player_one, “입니다. ⁄n”)

         player_start=‘’

       else :

         print(“첫 번째 선수는 시작하지 않으셨습니다. ⁄n”)

         player_one=0


       print(“두 번째 선수의 공 굴리기가 시작된다. ⁄n”)

       player_start=input(“두 번째 선수의 공 굴리기를 시작은 ‘s’를 입력: ”)

       print(“ ⁄n”)

       if player_start==‘s’ or player_start==‘S’:

         player_two=random.randint(1,200)

         print(“두 번째 선수의 공이 굴러간 거리는” ,player_two, “입니다. ⁄n”)

         player_start=‘’

       else :

         print(“두 번째 선수는 시작하지 않으셨습니다. ⁄n”)

         player_two=0


       print(“최종 결과를 입니다.”)


       if(player_one>player_two):

         print(“첫 번째 선수가” ,player_one, “점수로 우승입니다. ⁄n”)

       elif(player_one<player_two):

         print(“두 번째 선수가” ,player_two, “점수로 우승입니다. ⁄n”)


       if start==‘q’ or start==‘Q’:

         break

전체적인 공 굴리기 게임의 프로그램을 살펴보면, 가장 먼저 변수는 네 개가 선언되어 있는데, 선언에서는 게임 시작에 관한 변수 start와 선수가 공을 굴리는 시작에 대한 변수 player_start 변수가 있고, 거리에 대한 점수에는 player_one과 player_two 변수가 선언되어 있다. 그리고 다음에는 while 문으로 반복구조가 있는데, 게임을 지속적으로 반복해주기 위해서 True로 조건 값이 설정되어 있다. 그리고 반복구조 안에는 선택에 따라 게임이 실행될 수 있도록 if 문이 설정되어 있는데, 첫 번째 선수가 공을 굴릴 것인지, 아닌지가 선택될 수 있으며, 다음으로는 두 번째 선수가 공을 굴릴 것인지, 아닌지가 선택될 수 있도록 되어 있다. 전체적인 프로그램 코딩에 대한 이해가 되었다면 다음으로는 세부적으로 프로그램 코딩을 하나씩 살펴보도록 하자.

import random


start=‘’

player_start=‘’

player_one=0

player_two=0



첫 부분은 가장 먼저 랜덤으로 거리의 값을 지정하기 위해서 “import random” 랜덤 패키지를 임폴트 하였다. 그리고 다음에는 변수를 초기화하였는데, “start”와 “player_start”은 시작과 관련된 변수로써 문자를 입력받을 수 있도록 초기화되어 있으며, “player_one”와“player_two=0”은 거리에 따른 점수에 대한 점수를 저장할 수 있는 변수로써 정수형을 받을 수 있도록 초기화되어 있다.

while True:


     print(“--------------- 공 굴리기 게임 --------------”)

     print(“--------------- 게임 시작(s) ---------------”)

     print(“--------------- 종 료(q) ---------------/n”)


     start=input(“시작은 원하면 s, 종료를 원하면 p를 입력: ”)

     print(“/n”)


변수의 선언이 끝났다면, 다음에는 게임을 시작할 것인지에 대한 설명을 출력할 수 있도록 하였는데, 게임을 시작하기 위해서는 ‘s’를 입력받고, 게임의 종료를 위해서는 ‘q’를 입력받을 수 있도록 하였다. 따라서 “start=input(“시작은 원하면 s, 종료를 원하면 p를 입력: ”)” 프로그램 코딩에서 값을 입력받아 start의 변수에 입력하고 start의 입력 값에 따라 뒤쪽의 선택에서 게임이 실행되거나 종료되게 된다.

     if start==‘s’ or start==‘S’ :

       print(“첫 번째 선수의 공 굴리기가 시작된다./n”)

       player_start=input(“첫 번째 선수의 공 굴리기를 시작은 ‘s’를 입력: ”)

       print(“/n”)

       if player_start==‘s’ or player_start==‘S’ :

         player_one=random.randint(1,200)

         print(“첫 번째 선수의 공이 굴러간 거리는”, player_one, “입니다./n”)

         player_start=‘’

       else :

         print(“첫 번째 선수는 시작하지 않으셨습니다./n”)

         player_one=0


       print(“두 번째 선수의 공 굴리기가 시작된다./n”)

       player_start=input(“두 번째 선수의 공 굴리기를 시작은 ‘s’를 입력: ”)

       print(“/n”)

       if player_start==‘s’ or player_start==‘S’:

         player_two=random.randint(1,200)

         print(“두 번째 선수의 공이 굴러간 거리는” ,player_two, “입니다./n”)

         player_start=‘’

       else :

         print(“두 번째 선수는 시작하지 않으셨습니다./n”)

         player_two=0


이 부분은 게임이 진행되는 부분으로써, 만약 앞에서 start의 변수의 값이 ‘s’인 경우에 실행되는데, “if start==‘s’ or start==‘S’:”을 보면 대문자 “S”의 값을 입력받아도 게임이 실행될 수 있도록 하였다. 그리고 다음에는 “ print(“첫 번째 선수의 공 굴리기가 시작된다./n”)”를 통해서 첫 번째 선수의 공 굴리기에 대해서 설명해주고, 다시 시작할 것인지에 대해서 값을 입력받는다. 따라서 “player_start=input(“첫 번째 선수의 공 굴리기를 시작은 ‘s’를 입력: ”)”의 프로그램 코딩을 보면 입력받은 값은 player_start의 변수에 값이 저장되며, 입력 받은 값에 따라 아래의 if 문이 실행되게 된다. 그다음에 프로그램 코딩된 if 문은 “if player_start==‘s’ or player_start==‘S’:”으로써 player_start의 변수값이 ‘s’인 경우에 시작되는데, 만약 ‘s’가 아닌 경우에는 else 문이 실행되어 결과 값에는 0 값이 저장되게 된다. 따라서 첫 번째 선수가 공을 굴리기로 하였다면, 다음으로 “player_one=random.randint(1,200)”가 실행되는데 player_one은 1에서 200 사이의 값이 무작위로 저장되는데 이 값이 거리 값으로 사용된다. 그리고 다음으로 “print(“첫 번째 선수의 공이 굴러간 거리는”, player_one, “입니다./n”)”에서 거리의 값을 출력해준다. 그런 다음에는 다시 player_start의 값을 초기화해준다. 이렇게 첫 번째 선수가 공을 굴렸다면, 다음에는 두 번째 선수가 공을 굴릴 준비를 하게 된다. 그리고 두 번째 선수도 첫 번째 선수와 마찬가지로 같은 명령을 수행하게 되는데, 첫 번째 선수와 차이점은 거리의 값을 player_two에 저장한다는 것이다. 이렇게 게임은 첫 번째 선수와 두 번째 선수가 공을 굴리고, 공을 굴린 거리의 값을 각각 저장하게 되는데, 승패를 결정하기 위해서는 다음 선택문에서 값을 비교하여 결과 값을 출력해주게 된다.

       print(“최종 결과를 입니다.”)


       if(player_one>player_two):

         print(“첫 번째 선수가” ,player_one, “점수로 우승입니다./n”)

       elif(player_one<player_two):

         print(“두 번째 선수가” ,player_two, “점수로 우승입니다./n”)


       if start==‘q’ or start==‘Q’:

         break

이번 부분은 첫 번째 선수와 두 번째 선수의 승패를 결정해주는 프로그램 코딩 부분으로써 “print(“최종 결과를 입니다.”)”에서 출력을 통해서 승패의 결과를 출력할 것을 설명한다. 그리고 그다음 if 문에서 “if(player_one>player_two)”과 같이 프로그램 코딩되어 있는데, 조건에 있어서 첫 번째 선수의 거리 값과 두 번째 선수의 거리 값을 비교하여 첫 번째 선수의 값이 크다면, “print(“첫 번째 선수가”, player_one, “점수로 우승입니다./n”)”의 코딩을 실행하여 첫 번째 선수의 점수와 승리를 출력해준다. 그런데 만약 두 번째 선수의 거리 값이 높다면, “elif(player_one<player_two):”의 elif 문이 실행되며, 두 번째 선수의 점수를 출력해주며 게임을 종료하고 새롭게 게임을 시작하기 위해서 다시 처음으로 돌아가서 처음부터 다시 시작한다.

       if start==‘q’ or start==‘Q’:

         break

마지막으로 이 부분의 if 문은 while 문에서 게임을 종료하기 위해서 프로그램 코딩된 것으로써 “if start==‘q’ or start==‘Q’:”의 코딩을 보면, start의 변수값이 ‘q’인 경우에는 break가 실행되어 반복구조를 빠져나와 전체적인 프로그램을 종료할 수 있도록 하였다.

생각해보기

1) 숫자를 활용하여, 숫자 게임을 만들어 보자.

2) 확률로 알아보는 야구 게임을 만들어 보자.