ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [두근두근 파이썬 14장] 실습 13주차
    학교 수업/1-1, 1-2 코딩 기초 (파이썬, C) 2020. 6. 11. 23:08
    반응형

    컴퓨팅적 사고와 문제 해결 6월 9일 실습과제(두근두근파이썬 14장 도전문제)

     

    pg.393 도전문제 1

    from tkinter import *
    import time
    import random
    
    WIDTH = 800
    HEIGHT = 400
    score = 0 #점수 변수 추가
    
    class Ball:
        def __init__(self,canvas,color,size,x,y,xspeed,yspeed):
            self.canvas = canvas
            self.color = color
            self.size = size
            self.x = x
            self.y = y
            self.xspeed = xspeed
            self.yspeed = yspeed
            self.id = canvas.create_oval(x,y,x+size,y+size,fill=color)
    
        def move(self):
            self.canvas.move(self.id, self.xspeed, self.yspeed)
            (x1,y1,x2,y2) = self.canvas.coords(self.id)
            (self.x, self.y) = (x1,y1)
            if x1<=0 or x2>=WIDTH:
                self.xspeed = -self.xspeed
            if y1<=0 or y2>=HEIGHT:
                self.yspeed = -self.yspeed
    
    bullets = []
    
    def fire(event):
        bullets.append(Ball(canvas, "red", 10, 150, 250, 10, 0))
    
    window = Tk()
    canvas = Canvas(window, width=WIDTH, height=HEIGHT)
    canvas.pack()
    canvas.bind("<Button-1>",fire)
    
    spaceship = Ball(canvas,"green",100,100,200,0,0)
    enemy = Ball(canvas, "red", 100, 500, 200, 0, 5)
    
    label = canvas.create_text(150,100,text=str(score)+"점") #처음에 0점을 보여줌
    
    while True:
        for bullet in bullets:
            bullet.move()
            if (bullet.x+bullet.size)>=WIDTH:
                canvas.delete(bullet.id)
                bullets.remove(bullet)
            bullet_x = bullet.x + bullet.size * 0.5 #총알 중앙에 위치한 x좌표
            bullet_y = bullet.y + bullet.size * 0.5 #총알 중앙에 위치한 y좌표
            enemy_x = enemy.x + enemy.size * 0.5 #적 중앙에 위치한 x좌표
            enemy_y = enemy.y + enemy.size * 0.5 #적 중앙에 위치한 y좌표
            # 총알의 중심과 적의 중심 사이의 거리가 각각의 반지름을 합한 것보다 작거나 같을 경우
            # 영역이 겹치므로 적을 명중시킨것과 다름없음
            if ((enemy_x-bullet_x)**2+(enemy_y-bullet_y)**2)**0.5 < (enemy.size * 0.5+bullet.size * 0.5):
                score += 1
                canvas.delete(bullet.id)
                bullets.remove(bullet)
                canvas.itemconfig(label, text=str(score)+"점")
        enemy.move()
        window.update()
        time.sleep(0.03)
    
    
    

    1. bullet_x, bullet_y, enemy_x, enemy_y 를 구하는 이유

    다음과 같이 x, y는 오른쪽 윗 부분, x+size, y+size는 왼쪽 밑 부분의 좌표라서 중심을 구하려면 두 좌표를 더한 뒤 2로 나눠야함

     

    2. 아래의 코드가 쓰이는 이유

    if ((enemy_x-bullet_x)**2+(enemy_y-bullet_y)**2)**0.5 < (enemy.size * 0.5+bullet.size * 0.5):

    3. 아래의 코드 작동과정

    score = 0 #점수 변수 추가
    
    label = canvas.create_text(150,100,text=str(score)+"점") #처음에 0점을 보여줌
    
    while True:
    	...
    	if ((enemy_x-bullet_x)**2+(enemy_y-bullet_y)**2)**0.5 < (enemy.size * 0.5+bullet.size * 0.5):
                  score += 1
                  canvas.delete(bullet.id)
                  bullets.remove(bullet)
                  canvas.itemconfig(label, text=str(score)+"점")
    	...
    

    score = 0 은 점수를 갱신할 때 필요한 변수임

    label = ... 을 통해 처음에 0점을 화면에 표시함

    if 포탄이 우주선에 명중했다면:

    점수를 1점 얻어야하니 score += 1을 해주고,

    명중한 총알은 없애줘야하니 delete 함수, remove 함수를 사용하고,

    점수판을 갱신해야하니 itemconfig 함수를 이용하여 점수를 수정해줌

     

     

    4. 바꿔도 되는 내용

    if ((enemy_x-bullet_x)**2+(enemy_y-bullet_y)**2)**0.5 < (enemy.size * 0.5+bullet.size * 0.5):
                score += 1
                canvas.delete(bullet.id)
                bullets.remove(bullet)
                canvas.itemconfig(label, text=str(score)+"점")

    이 부분을

    if ((enemy_x-bullet_x)**2+(enemy_y-bullet_y)**2)**0.5 < (enemy.size * 0.5+bullet.size * 0.5):
                score += 1
                canvas.delete(bullet.id)
                bullets.remove(bullet)
                canvas.delete(label)
                label = canvas.create_text(150,100,text=str(score)+"점")

    로 할 수도 있음

    1번 코드는 itemconfig를 이용하여 텍스트 상자에 있는 글자만 수정하지만

    2번 코드는 delete를 통해 텍스트 상자를 없애주고, create_text를 사용하여 그 자리에 갱신한 점수의 텍스트 상자를 만들어줌

     

    텍스트 상자를 가만히 두고 글자만 수정하느냐, 텍스트 상자를 없애고 텍스트 상자를 다시 만드느냐의 차이라서 둘은 결과적으로 같음

     

     

     

     

     

     

    문제 2

    포탄의 속도를 2배 빠르게 수정하기

     

    from tkinter import *
    import time
    import random
    
    WIDTH = 800
    HEIGHT = 400
    
    class Ball:
        def __init__(self,canvas,color,size,x,y,xspeed,yspeed):
            self.canvas = canvas
            self.color = color
            self.size = size
            self.x = x
            self.y = y
            self.xspeed = xspeed
            self.yspeed = yspeed
            self.id = canvas.create_oval(x,y,x+size,y+size,fill=color)
    
        def move(self):
            self.canvas.move(self.id, self.xspeed, self.yspeed)
            (x1,y1,x2,y2) = self.canvas.coords(self.id)
            (self.x, self.y) = (x1,y1)
            if x1<=0 or x2>=WIDTH:
                self.xspeed = -self.xspeed
            if y1<=0 or y2>=HEIGHT:
                self.yspeed = -self.yspeed
    
    bullets = []
    
    def fire(event):
        bullets.append(Ball(canvas, "red", 10, 150, 250, 20, 0)) #속도만 10->20으로 바꿔줌
    
    window = Tk()
    canvas = Canvas(window, width=WIDTH, height=HEIGHT)
    canvas.pack()
    canvas.bind("<Button-1>",fire)
    
    spaceship = Ball(canvas,"green",100,100,200,0,0)
    enemy = Ball(canvas, "red", 100, 500, 200, 0, 5)
    
    while True:
        for bullet in bullets:
            bullet.move()
            if (bullet.x+bullet.size)>=WIDTH:
                canvas.delete(bullet.id)
                bullets.remove(bullet)
        enemy.move()
        window.update()
        time.sleep(0.03)
    

     

    393쪽 ~ 394쪽 코드중 한 줄만 바꾸면 속도가 2배로 늘어남

    def fire(event):
        bullets.append(Ball(canvas, "red", 10, 150, 250, 10, 0))

    에서

    def fire(event):
        bullets.append(Ball(canvas, "red", 10, 150, 250, 20, 0)) #속도만 10->20으로 바꿔줌

    로 바꾸면 끝

    반응형

    댓글

Designed by Tistory.