-
[두근두근 파이썬 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으로 바꿔줌
로 바꾸면 끝
반응형'학교 수업 > 1-1, 1-2 코딩 기초 (파이썬, C)' 카테고리의 다른 글
[C 프로그래밍: 새내기를 위한 첫 C 언어 책] 실습 2주차 (0) 2020.09.08 [C 프로그래밍: 새내기를 위한 첫 C 언어 책] 실습 1주차 (0) 2020.09.01 [두근두근 파이썬 13장] 실습 12주차 (0) 2020.06.06 [두근두근 파이썬 12장] 실습 11주차 (0) 2020.05.29 [두근두근 파이썬 11장] 실습 10주차 (0) 2020.05.21