프로그래밍/python

[학교/파이썬프로젝트/20.05.23] 중간과제

pxatd 2020. 6. 28. 16:37
728x90

교수님께서 중간고사 대체과제로 축구게임을 만들어오라고 하셨습니다.

터틀그래픽을 사용하였고 구글링하여 이미지도 gif형식으로 넣었습니다. 

 

 

조건은 다음과 같습니다.

-사용자가 총 5번 공을 차서, 3번이상 성공하면 승리

-5번 공을 차면 화면에 승/패 결과를 보여주고 종료

-키커(=사용자): 키보드 l,r,c버튼으로 공을 왼쪽, 가운데, 오른쪽으로 참

-골키퍼: 랜덤으로 왼쪽, 가운데, 오른쪽으로 결정하여 뛰기

-시작화면: 사용자에게 입력할 버튼에 대해 설명

-키커가 공을 차는 방향으로 공 위치 표현

-골키퍼는 랜덤으로 정해진 방향에 따라 적절한 그림을 사용하여 표현

-최종화면: 5회의 승부차기가 끝나면 최종 결과 보여주기, 볼 것인지 말 것인지 물어본 후 대답에 따라 결과 출력

 

제 코드는 다음과 같습니다.

import turtle
import random
def ballMove(x):
    ball.shape(ball_img)
    ball.penup()
    ball.goto(x,200)
    ball.pendown()
    ball.stamp()
def add_img(x):
    keeper.shape(x)
    keeper.stamp()
    keeper.reset()
def penUpDown(x,y):
    score.penup()
    score.goto(x,y)
    score.pendown()
def penUpDownT(x,y):
    t.penup()
    t.goto(x,y)
    t.pendown()
t=turtle.Turtle()
screen=turtle.Screen()
user=turtle.Turtle()
bg=turtle.Screen()
score=turtle.Turtle()
scoreO=0
scoreX=0
for i in range(0,5,1):
    keeper=turtle.Turtle()
    ball=turtle.Turtle()
    ball.speed(1)
    bg.setup(600.600)
    bg.bgpic("image\\background.gif")
    bg.update()
    user=turtle.textinput("승부차기 게임","왼쪽은 'l'/ 오론쪽은 'r'/ 중앙은 'c'를 입력하세요") 
    left_img = "image\\left1.gif"
    right_img = "image\\right1.gif"
    center_img = "image\\center1.gif"
    ball_img = "image\\ball.gif"
    screen.addshape(left_img)
    screen.addshape(right_img)
    screen.addshape(center_img)
    screen.addshape(ball_img)
    com=random.randint(1,3)
    if user=="l": #공 왼쪽 
        if com==1: #막음 
            add_img(left_img)
            scoreX=scoreX+1
        elif com==2: #못막음 
            add_img(right_img)
            scoreO=scoreO+1
        elif com==3: #못막음
            add_img(center_img)
            scoreO=scoreO+1
        ballMove(-200)
    if user=="r": #공 오른쪽 
        if com==1: #못막음
            add_img(left_img)
            scoreO=scoreO+1
        elif com==2: #막음 
            add_img(right_img)
            scoreX=scoreX+1
        elif com==3: #못막음
            add_img(center_img)
            scoreO=scoreO+1
        ballMove(200)                                                                                      
    if user=="c": #공 중앙  
        if com==1: #못막음 O
            add_img(left_img)
            scoreO=scoreO+1
        elif com==2: #못막음 O
            add_img(right_img)
            scoreO=scoreO+1
        elif com==3: #막음 X
            add_img(center_img)
            scoreX=scoreX+1
        ballMove(0)
    screen.clear()
    score.color("red")
    penUpDown(180,200)
    score.write("승부차기 성공횟수:"+str(scoreO))
    penUpDown(180,185)
    score.write("O"*scoreO)
    score.color("blue")
    penUpDown(180,170)
    score.write("승부차기 실패횟수:"+str(scoreX))
    penUpDown(180,155)
    score.write("X"*scoreX)
    score.color("black")
    penUpDown(180,140)
    score.write(str(i+1)+"라운드 입니다.")
user=turtle.numinput("게임 종료","결과를 보시겠습니까? (예:1 아니오:0)")
screen.clear()
if user==1:
    if scoreO>=3:
        t.color("purple")
        penUpDownT(-90,0)
        t.write("YOU WIN !! 승부차기 게임에서 승리했습니다!\n결과는 다음과 같습니다\n")
        t.write("승부차기 성공횟수:"+str(scoreO),"\n")
        t.write("      승부차기 실패횟수:"+str(scoreX),"\n")
    else:
        t.color("purple")
        penUpDownT(-90,0)
        t.write("YOU LOSE !! 승부차기 게임에서 패배했습니다.")
        t.write("승부차기 성공횟수:"+str(scoreO),"\n")
        t.write("      승부차기 실패횟수:"+str(scoreX),"\n")
elif user==0:
    t.color("green")
    penUpDownT(-50,0)
    t.write("게임을 종료합니다.")

 

 

시작화면입니다. 

화면에서 l키를 입력했을 때

화면에서 c키를 입력했을 때

종료화면입니다. 5회를 끝낸 후 결과를 보고싶으면 1 아니면 0을 선택하는 문구가 나오는데 사진은 0을 선택하여 바로 게임이 종료된 모습입니다. 

 

오류 해결 부분:

5번 for 반복문을 사용하는 과정에서 한번 반복 후 공이 다시 화면에 나타나지 않는다는 오류가 발생하였습니다. 오류를 해결하기 위해 코드를 최소화하여 수십번 파이썬 new file에서 연습해보았고 그 결과 keeper=turtle.Turtle과 screen=turtle.Screen이 for반복문 안에 있어야된다는 것을 알게되었습니다. 처음에 코딩할 때는 저 부분을 for반복문 밖으로 빼놨었는데 그렇게 되면 for반복문이 돌면서 키퍼와 터틀의 객체가 제대로 선언되지 못하기 때문이였습니다. 다행히 여러번의 시행착오끝에 오류를 해결하여 제출 할 수 있었습니다. 

728x90