1. ννΈ μ²΄ν¬(hit check)
2κ°μ λ¬Όμ²΄κ° μ μ‘±νλμ§ νμ νλ κ²μΌλ‘, κ²μμμλ λ°μ¬ν ννμ΄ μλμκ² λ§μλμ§, μμ΄ν μ μ£Όμ λμ§ λ±μ μ΄λ²€νΈμ μ΄μ©ν μ μλ€.
1) μ¬κ°νμμμ ννΈ μ²΄ν¬
import tkinter
def hit_check_rect():
dx = abs((x1 + w1 / 2) - (x2 + w2 / 2)) # dxμ λ μ¬κ°νμ μ€μ¬ x λ°©ν₯ 거리 λμ
dy = abs((y1 + h1 / 2) - (y2 + h2 / 2)) # dyμ λ μ¬κ°νμ μ€μ¬ y λ°©ν₯ 거리 λμ
if dx <= w1 / 2 + w2 / 2 and dy <= h1 / 2 + h2 / 2: # μ¬κ°νμ΄ κ²ΉμΉλ 쑰건 νμ
return True # κ²ΉμΉλ©΄ True
return False # μλλ©΄ False λ°ν
def mouse_move(e):
global x1, y1 # μ μ λ³μ μ μΈ
x1 = e.x - w1 / 2 # νλμ μ¬κ°ν x μ’νλ₯Ό ν¬μΈν° μ’νλ‘ ν¨
y1 = e.y - h1 / 2 # νλμ μ¬κ°ν y μ’νλ₯Ό ν¬μΈν° μ’νλ‘ ν¨
col = "blue" # colμ blue λ¬Έμμ΄ λμ
if hit_check_rect() == True: # λ§μ½ λ μ¬κ°νμ΄ μ μ‘±νλ€λ©΄
col = "cyan" # colμ cyan λ¬Έμμ΄ λμ
canvas.delete("RECT1") # μΌλ¨ νλ μ¬κ°ν μμ ν
canvas.create_rectangle(x1, y1, x1 + w1, y1 + h1, fill=col, tag="RECT1") # νλ μ¬κ°ν 그리기
root = tkinter.Tk() # μλμ° κ°μ²΄ μμ±
root.title("μ¬κ°νμ μ¬μ©ν ννΈ μ²΄ν¬") # μλμ° νμ΄ν μ§μ
canvas = tkinter.Canvas(width=600, height=400, bg="white") # μΊλ²μ€ μ»΄νΌλνΈ μμ±
canvas.pack() # μΊλ²μ€ λ°°μΉ
canvas.bind("<Motion>", mouse_move) # λ§μ°μ€ ν¬μΈν°λ₯Ό μμ§μΌ λ μ€νν ν¨μ μ§μ
x1 = 50 # νλμ μ¬κ°ν μΌμͺ½ μ λͺ¨μ리 xμ’ν
y1 = 50 # κ·Έ yμ’ν
w1 = 120 # ν
h1 = 60 # λλΉ
canvas.create_rectangle(x1, y1, x1 + w1, y1 + h1, fill="blue", tag="RECT1") # μΊλ²μ€μ νλμ μ¬κ°ν κ·Έλ¦Ό
x2 = 300
y2 = 100
w2 = 120
h2 = 160
canvas.create_rectangle(x2, y2, x2 + w2, y2 + h2, fill="red") # μΊλ²μ€μ λΉ¨κ° μ¬κ°ν κ·Έλ¦Ό
root.mainloop() # μλμ° νμ
μν κ³΅λΆ μνμ§ 2λ μ΄ λ€ λμ΄μ μλ μ½λλ§ λ΄λ μ΄μ§μ΄μ§νλλ°....
κ·Έλλ κ°λ¨ν μμ λ₯Ό μ΄ν΄ λͺ»νλκ² λ무 λΆλλ¬μμ κ³μ μ΄ν΄νλ €κ³ λ Έλ ₯νλμ€
def hit_check_rect():
dx = abs((x1 + w1 / 2) - (x2 + w2 / 2))
dy = abs((y1 + h1 / 2) - (y2 + h2 / 2))
if dx <= w1 / 2 + w2 / 2 and dy <= h1 / 2 + h2 / 2:
return True
return False
μ΄ λΆλΆμ κ·Έλ¦ΌμΌλ‘ νννμλ©΄ λ€μκ³Ό κ°λ€.
νλμ μ¬κ°νμ μ€μ¬ μ’νλ (x1+w1/2, y1+h1/2), λΉ¨κ°μ μ¬κ°νμ μ€μ¬ μ’νλ (x2+w2/2, y2+h2/2)
μ΄ λ dxμ κ° : νλμ μ¬κ°νμ΄ λΉ¨κ°μ μ¬κ°νμ μΌμͺ½μΌ λλ (x2 + w2 / 2) - (x1 + w1 / 2), λΉ¨κ°μ μ¬κ°νμ΄ νλμ μ¬κ°νμ μΌμͺ½μΌ λλ (x1 + w1 / 2) - (x2 + w2 / 2)
=> (x1 + w1 / 2) - (x2 + w2 / 2)μ μ λκ°
=> abs() λͺ λ ΉμΌλ‘ μ λκ°μ ꡬν μ μμ(μνμ κ΄ν λͺ λ Ήμ΄μ΄λ abs()λͺ λ Ήμ math λͺ¨λ μν¬νΈ νμ μμ)
=> dx = abs((x1 + w1 / 2) - (x2 + w2 / 2))
λ§μ°¬κ°μ§λ‘ dyμ κ°μ dy = abs((y1 + h1 / 2) - (y2 + h2 / 2)) λ‘ νννλ€.
νμ§λ§ μ°λ¦¬κ° νλ €κ³ νλ κ²μ λ μ¬κ°νμ΄ κ²ΉμΉ λ μκΈ°λ μ΄λ²€νΈμ΄λ€. μ κ·Έλ¦Όμμ dxμ κ°μ΄ μ΄λ€ κ°μΌ λ xμΆ λ°©ν₯μμ κ²ΉμΉκ² λ κΉ? μμΈν κ·Έλ¦Όμ 33p κ·Έλ¦Ό 2-1-3μ μ°Έκ³ νλλ‘ ν΄μΌκ² λ€... (μ κ±° μ κ·Έλ¦Ό λ§λλκ²λ λ무 νλ€μλ€..)
μ무νΌ! μ§±λμ μ κ΅΄λ €λ³΄λ©΄ dxμ κ°μ΄ w1 / 2 + w2 / 2λ³΄λ€ μμ λ, κ²ΉμΉλ κ²μ μ μ μλ€. μμ μΊ‘μ³λ§ λ΄λ μΌλ¨ w1μ λ°κ³Ό w2μ λ°λ³΄λ€ dxκ° μμΌλ©΄ xμΆ λ°©ν₯μΌλ‘λ κ²Ήμ³μ§λꡬλ! νκ³ λλ μ μλ€.
dyλ λ§μ°¬κ°μ§λ€. dyμ κ°μ΄ h1/2 + h2/2λ³΄λ€ μλ€λ©΄, yμΆ λ°©ν₯μΌλ‘ κ²ΉμΉλ€. μ΄ λ κ°μ§ μ‘°κ±΄μ΄ λͺ¨λ μΆ©μ‘±λ λ λ μ¬κ°νμ΄ κ²ΉμΉκ² λλ€.
μ΄λ₯Ό μ μ΄νλ κ²(dxμ κ°μ΄ w1 / 2 + w2 / 2λ³΄λ€ μμκ² μλλΌ κ°μ λ, dyλ λ§μ°¬κ°μ§) λν ν¬ν¨νλ€λ©΄ λ€μκ³Ό κ°μ΄ μ 리ν μ μλ€.
dx <= w1 / 2 + w2 / 2 and dy <= h1 / 2 + h2 / 2
μ΄ κ³Όμ μ΄ λͺ¨λ hit_check_rect() ν¨μμμ μνλλ€.
μ΄ ν mouse_move() ν¨μμμ νλμ μ¬κ°νμ μ΄λμ μννλ€. μ΄ λ λ§μ°μ€ ν¬μΈν°λ₯Ό μμ§μΌ λ ν¨μκ° μ€νλλλ‘ bind() λͺ λ Ήμ μμ±νλ€.
canvas.bind("<Motion>", mouse_move)
2) μνμμμ ννΈ μ²΄ν¬
import tkinter
import math
def hit_check_circle():
dis = math.sqrt((x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2)) # disμ λ μ μ¬μ΄ 거리λ₯Ό κ³μ°ν΄ λμ
if dis <= r1 + r2: # dis κ°μ΄ λ μ λ°μ§λ¦μ ν© μ΄νμ΄λ©΄
return True # True
return False # μλλ©΄ False λ°ν
def mouse_move(e):
global x1, y1 # μ μ λ³μ μ μΈ
x1 = e.x # μ΄λ‘μ μμ xμ’νλ₯Ό ν¬μΈν° μ’νλ‘ ν¨
y1 = e.y # μ΄λ‘μ μμ yμ’νλ₯Ό ν¬μΈν° μ’νλ‘ ν¨
col = "green" # colμ green λ¬Έμμ΄ λμ
if hit_check_circle() == True: # λ μμ΄ μ μ΄νλ€λ©΄
col = "lime" # colμ lime λ¬Έμμ΄ λμ
canvas.delete("CIR1") # μΌλ¨ μ΄λ‘μ μ μμ ν
canvas.create_oval(x1 - r1, y1 - r1, x1 + r1, y1 + r1, fill=col, tag="CIR1") # λ€μ μ΄λ‘μ μ 그리기
root = tkinter.Tk() # μλμ° κ°μ²΄ μμ±
root.title("μμ μ¬μ©ν ννΈ μ²΄ν¬") # μλμ° νμ΄ν μ§μ
canvas = tkinter.Canvas(width=600, height=400, bg="white") # μΊλ²μ€ μ»΄ν¬λνΈ μμ±
canvas.pack() # μΊλ²μ€ λ°°μΉ
canvas.bind("<Motion>", mouse_move) # λ§μ°μ€ ν¬μΈν°λ₯Ό μμ§μΌ λ μ€νν ν¨μ μ§μ
# μ΄λ‘μ μ
x1 = 50 # μ μ€μ¬ xμ’ν
y1 = 50 # yμ’ν
r1 = 40 # μ λ°μ§λ¦
canvas.create_oval(x1 - r1, y1 - r1, x1 + r1, y1 + r1, fill="green", tag="CIR1") # μΊλ²μ€μ μ΄λ‘μ μ κ·Έλ¦Ό
# μ£Όν©μ μ
x2 = 300
y2 = 200
r2 = 80
canvas.create_oval(x2 - r2, y2 - r2, x2 + r2, y2 + r2, fill="orange")
root.mainloop() # μλμ° νμ
μ΄λ‘μ μμ μ€μ¬ μ’νλ₯Ό (x1, y1), λ°μ§λ¦μ κΈΈμ΄λ₯Ό r1λ‘ μ‘κ³ μ£Όν©μ μμ μ€μ¬ μ’νλ (x2, y2), λ°μ§λ¦μ κΈΈμ΄λ r2λΌκ³ ν λ λ μ μ¬μ΄μ 거리 곡μμΌλ‘ κ³μ°ν μ μλ€.
νμ΄μ¬μμλ 루νΈκ°μ sqrt() λͺ λ ΉμΌλ‘ κ³μ°ν μ μλλ°, μ΄λ μμ abs λͺ λ Ήκ³Ό λ¬λ¦¬ math λͺ¨λμ μν¬νΈ ν΄μΌνλ€.
dis = math.sqrt((x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2))
μ΄ κ°μ΄ λ μμ λ°μ§λ¦μ ν©κ³(r1 + r2)λ³΄λ€ μκ±°λ κ°μΌλ©΄ μμ΄ κ²Ήμ³μ§κ² λλ€.
2. μΌκ°ν¨μ μ¬μ©λ²
λλ λ¬Έκ³ΌμΆ©μ΄λΌ μΌκ°ν¨μμ‘μΌλ‘ μΌκ°ν¨μλ₯Ό λ°°μ λ€...
μλ¬΄νΌ μΌκ°ν¨μλ κ°μ ν¬κΈ°μ λ³μ κΈΈμ΄μ λΉλ₯Ό νμνλ ν¨μλ‘, μ΄λ₯Ό μ΄μ©ν΄ μ κΈ°μ μ΄λ λ°©ν₯μ΄λ λ°©μ¬ν νν λ°μ¬ λͺ¨μ μ μ μν μ μλ€.
κ°λλ xμΆ μ€λ₯Έμͺ½μμ μμν΄ λ°μκ³ λ°©ν₯μΌλ‘ 컀μ§λ©°, 1λ°ν΄λ₯Ό λλ©΄ 360λμ΄λ€. λ€λ§ νμ΄μ¬ κ°μ νλ‘κ·Έλλ° μΈμ΄μμλ κ°λ λ°©ν₯μ΄ μνκ³Ό λ°λ(μκ³ λ°©ν₯)μ΄λ―λ‘ μ£Όμ
1) sin, cos, tan κ° κ³μ°νκΈ°
sin(), cos(), tan() λͺ λ Ήμ μ¬μ©νκΈ° μν΄μλ math λͺ¨λμ μν¬νΈν΄μΌνλ€.
import math
d = 45 # dμ κ°λ κ° λμ
a = math.radians(d) # dκ°μ λΌλμμΌλ‘ λ³νν΄ aμ λμ
s = math.sin(a)
c = math.cos(a)
t = math.tan(a)
print("sin " + str(s))
print("cos " + str(c))
print("tan " + str(t))
μ¬κΈ°μ μ€μν κ²μ νμ΄μ¬ μΌκ°ν¨μμ μΈμλ κ°λκ° μλ radian(λΌλμ)κ°μΌλ‘ μ§μ ν΄μΌ νλ€λ μ μ΄λ€. λ μ²μ λ€μλλ° κ΅μ μ μΌλ‘ μ°μΈλ€κ³ νλ€.. μ§μ μ’ μλ €μ£Όμ§. μ΄λ radians() λͺ λ Ήμ μ¬μ©ν΄ κ°λλ₯Ό radianμΌλ‘ λ³ννλ€. 1 λΌλμμ 180º/π(μ½ 57º)μ΄λ©°, ν λ°ν΄(360º)λ 2πλΌλμμ΄λ€.
2) μΌκ°ν¨μ κ³μ° νλ‘κ·Έλ¨
μλμ° ν μ€νΈ μ λ ₯ νλμ κ°λλ₯Ό μ λ ₯ ν 'κ³μ°' λ²νΌμ λλ₯΄λ©΄ λΌλ²¨μ μΌκ°ν¨μ κ°μ΄ νμλλ νλ‘κ·Έλ¨μ΄λ€.
import tkinter
import math
def trigo() : # ν¨μ μ μ
try : # μμΈ μ²λ¦¬
d = float(entry.get()) # μ
λ ₯ νλκ°μ μ€μνμΌλ‘ dμ λμ
a = math.radians(d) # dκ°μ λΌλμμΌλ‘ λ³νν΄ aμ λμ
s = math.sin(a)
c = math.cos(a)
t = math.tan(a)
label_s["text"] = "sin " + str(s) # λΌλ²¨μ sκ° νμ
label_c["text"] = "cos " + str(c)
label_t["text"] = "tan " + str(t)
except : # μμΈκ° λ°μν κ²½μ°
print("κ°λλ₯Ό λ κ°μΌλ‘ μ
λ ₯ν΄ μ£Όμμμ€ : ") # μ
μλμ°μ κ²½κ³ λ¬Έ μΆλ ₯
root = tkinter.Tk() # μλμ° κ°μ²΄ μμ±
root.geometry("300x200") # μλμ° ν¬κΈ° μ§μ
root.title("μΌκ°ν¨μ κ°") # μλμ° νμ΄ν μ§μ
entry = tkinter.Entry(width = 10) # 1ν ν
μ€νΈ μ
λ ₯ νλ μμ±
entry.place(x = 20, y = 20) # ν
μ€νΈ μ
λ ₯ νλ λ°°μΉ
button = tkinter.Button(text = "κ³μ°", command = trigo) # λ²νΌ μ»΄ν¬λνΈ μμ±, λ²νΌ ν΄λ¦ μ μ€ν ν¨μ μ§μ
button.place(x = 110, y = 20) # λ²νΌ λ°°μΉ
label_s = tkinter.Label(text="sin") # λΌλ²¨ μ»΄ν¬λνΈ μμ±
label_s.place(x = 20, y = 60)
label_c = tkinter.Label(text="cos")
label_c.place(x = 20, y = 100)
label_t = tkinter.Label(text="tan")
label_t.place(x = 20, y = 140)
root.mainloop() # μλμ° νμ
def trigo() :
try :
d = float(entry.get())
a = math.radians(d)
s = math.sin(a)
c = math.cos(a)
t = math.tan(a)
label_s["text"] = "sin " + str(s)
label_c["text"] = "cos " + str(c)
label_t["text"] = "tan " + str(t)
except :
print("κ°λλ₯Ό λ κ°μΌλ‘ μ
λ ₯ν΄ μ£Όμμμ€ : ")
# μ€λ΅
button = tkinter.Button(text = "κ³μ°", command = trigo)
μ½λμμ trigo ν¨μλ λ²νΌμ ν΄λ¦ν΄μΌλ§ ν΄λΉ ν¨μκ° μ€νλλλ°, μ΄λ Button() λͺ λ Ήμ μΈμμΈ 'command = ' μμ trigoλ‘ μ§μ νκΈ° λλ¬Έμ΄λ€.
κ·Έλ¦¬κ³ trigo ν¨μμ λ΄μ©μ λ€μκ³Ό κ°λ€. ν μ€νΈ μ λ ₯ νλμ λ¬Έμμ΄μ float() λͺ λ ΉμΌλ‘ μμλ‘ λ³νμ dμ λμ νλ€. dμ κ°μ radianμΌλ‘ λ³νλμ΄ aμ λμ λκ³ , μ΄ν μΌκ°ν¨μμ κ°μ΄ κ³μ° λμ΄ λΌλ²¨μ κ³μ° κ°μ΄ νμλλ€.
νμ§λ§ μ«μλ§ μ λ ₯λλ€λ λ²μ΄ μλ€. κ°μκΈ° νκΈμ μ°κ±°λ μνλ²³μ΄ μ λ ₯λκ±°λ, μ΄λ€ κ°λ μ λ ₯νμ§ μμ μνμμ λ²νΌμ λλ₯Ό λλ λ³νν μκ° μλλ°, μ΄λ try ~ except μμΈ μ²λ¦¬ ꡬ문μ μ΄μ©νλ©΄ λλ€. μλ¬κ° λ°μν κ²½μ° exceptμ μ ν μ½λκ° μ€νλλλ°, μ¬κΈ°μλ μ Έ μλμ°μ λ©μμ§λ₯Ό μΆλ ₯νλ€. try~exceptλ λ€μκ³Ό κ°μ΄ μ¬μ©νλ€.
try :
μμΈκ° λ°μν κ°λ₯μ±μ΄ μλ μ½λ
except :
μμΈκ° λ°μνμ λ μνν μ²λ¦¬
3) μΌκ°ν¨μλ‘ λν 그리기
import tkinter
import math
root = tkinter.Tk()
root.title("μΌκ°ν¨μλ₯Ό νμ©ν μ 그리기")
canvas = tkinter.Canvas(width = 400, height = 400, bg = "white")
canvas.pack() # μΊλ²μ€ λ°°μΉ
for d in range(0, 90, 10) : # λ°λ³΅ : d κ°μ΄ 0μμ 90κΉμ§ 10μ© μ¦κ°
a = math.radians(d)
x = 300 * math.cos(a)
y = 300 * math.sin(a)
canvas.create_line(0, 0, x, y, fill = "blue") # (0, 0)μμ (x, y)κΉμ§ μ κΈκΈ°
root.mainloop()
create_line() λͺ λ Ήμ μ¬μ©ν΄ μλμ° μΌμͺ½ μλ¨ λͺ¨μ리μ μμ (0, 0)λΆν° cosκ³Ό sinμΌλ‘ κ³μ°ν μ’ν(x, y)κΉμ§ μ μ κ·Έλ¦°λ€. κ·Έλ¦¬κ³ μΌμͺ½ λͺ¨μλ¦¬κ° μ μμμ (0, 0)μ΄κ³ μ΄νλ‘λ μκ³ λ°©ν₯μΌλ‘ μ μ΄ κ·Έμ΄μ§λλ°, νλ‘κ·Έλλ° μΈμ΄μμλ μ μ΄ λ°λλ‘ κ·Έμ΄μ§λ€κ³ νλλ° μ¬κΈ°μ κ·Έ μ¬μ€μ νμΈν μ μλ€.
for d in range(0, 90, 10)μ λ§ κ·Έλλ‘ dλ₯Ό range()μμ μλ λ²μμμ μ¦κ°μν€λ©° λ°λ³΅νκ² λ€λ κ²μ΄λ€. μ¬κΈ°μ 0μ 첫 ν, 90μ λν + 1(νλ² λ λ°λ³΅νμ λμ μ«μλ‘, d = 80μ΄ λνμ΄λ©΄ d = 90μΌ λ λ©μΆλ€λ λ» μ¦ 90μΈ κ²½μ°λ μ€ν μλ¨), λ§μ§λ§ 10μ d = d + 10μ μλ―Έλ‘, 10μ© μ¦κ°νλ€λ κ²μ΄λ€.
λ±μ°¨μμ΄λ‘ κ°λ¨ν μ 리νλ©΄ for d in range(첫ν, λν + 곡차, 곡차)λ‘ λ³Ό μ μκ² λ€.
4) λ€μν μμμ μ 그리기
import tkinter
import math
root = tkinter.Tk()
root.title("μΌκ°ν¨μλ₯Ό νμ©ν λν 그리기")
canvas = tkinter.Canvas(width=600, height=600, bg="black")
canvas.pack()
COL = ["greenyellow", "limegreen", "aquamarine", "cyan", "deepskyblue", "blue", "blueviolet", "violet"] # 8κ°μ μμμ 리μ€νΈλ‘ μ μ
for d in range(0, 360): # λ°λ³΅ : d κ°μ΄ 0μμ 360κΉμ§ 1μ© μ¦κ°
x = 250 * math.cos(math.radians(d)) # μ μ λ xμ’νλ₯Ό cosμΌλ‘ κ³μ°
y = 250 * math.sin(math.radians(d)) # μ μ λ yμ’νλ₯Ό sinμΌλ‘ κ³μ°
canvas.create_line(300, 300, 300 + x, 300 + y, fill=COL[d % 8], width=2) # μΊλ²μ€ μ€μ¬(300, 300)μμ μΌκ°ν¨μλ‘ κ³μ°ν μ’νκΉμ§ μ μ κ·Έμ
root.mainloop()
μ¬μ‘±μ λ§λΆμ΄μλ©΄ deepskyblueλ₯Ό deepblueskyλ‘ μ μλλ° κ³μ μ€λ₯κ° λκΈΈλ λ체 λκ° μλͺ»λλ μΆμ΄μ νμ°Έμ λ΄€μλ...
for d in range(0, 360):
x = 250 * math.cos(math.radians(d))
y = 250 * math.sin(math.radians(d))
canvas.create_line(300, 300, 300 + x, 300 + y, fill=COL[d % 8], width=2)
μ΄λ² νλ‘κ·Έλ¨μ μ€μν μ μ μλμ° ν¬κΈ°λ₯Ό 600 x 600λ‘ λ§μ·μΌλ―λ‘ create_lineμμ μ€μ¬μ μ (300, 300)μΌλ‘ μ‘μλ€. κ·Έλ¦¬κ³ xμ yμ κ°κ° 250μ κ³±ν΄μ, μμ μΌλ‘λΆν°μ κ±°λ¦¬κ° 250ν½μ μ μμ£Ό μ μ μ ν₯ν΄ μ μ κ·Έλ¦¬κ² λλ€. μ μ μκΉμ d % 8λ‘ COL 리μ€νΈμ 0 ~ 7λ² μμλ€μ΄ λ°λ³΅ν΄μ λμ€λλ‘ νλ€.
κ·Έλ¦¬κ³ cos(), sin() λͺ λ Ήμ μΈμλ‘ radians() λͺ λ Ήμ μ¬μ©νλλ° μ΄λ ν¨μλ₯Ό λ€λ₯Έ ν¨μμ μΈμλ‘ μ¬μ©ν μκ° μλ€λ μκΈ°λ€.
4. μΈλ±μ€μ νμ΄λ¨Έ
1) κ²μ μ§ν κ΄λ¦¬
μλ μ½λλ μΈλ±μ€, νμ΄λ¨Έ λ³μλ₯Ό μ€λΉν΄ νμ΄ν νλ©΄, κ²μ νλ μ΄ μ€ νλ©΄, κ²μ μ€λ² νλ©΄μ νμνλ νλ‘κ·Έλ¨μ΄λ€.
import tkinter
# ν°νΈ, μΈλ±μ€ λ³μ, νμ΄λ¨Έ λ³μ μ μ
fnt1 = ("Times New Roman", 20)
fnt2 = ("Times New Roman", 40)
index = 0
timer = 0
key = "" # ν€ κ°μ λμ
ν λ³μ
def key_down(e):
global key # keyλ₯Ό μ μλ³μλ‘ μ μΈ
key = e.keysym # keyμ keysymκ° λμ
def main():
global index, timer # μ μλ³μ μ μΈ
canvas.delete("STATUS") # λ¨Όμ indexμ timer νμ μμ
timer = timer + 1 # timer κ° 1 μ¦κ°
canvas.create_text(200, 30, text="index " + str(index), fill="white", font=fnt1, tag="STATUS") # index κ° νμ
canvas.create_text(400, 30, text="timer " + str(timer), fill="cyan", font=fnt1, tag="STATUS") # timer κ° νμ
if index == 0: # index 0 μ²λ¦¬ (νμ΄ν νλ©΄)
if timer == 1: # timer κ°μ΄ 1μ΄λ©΄
canvas.create_text(300, 150, text = "νμ΄ν", fill="white", font=fnt2, tag="TITLE") # νμ΄ν λ¬Έμ νμ
canvas.create_text(300, 300, text = "Press[SPACE]Key", fill="lime", font=fnt1, tag="TITLE") # 'press[space]key' λ¬Έμμ΄ νμ
if key == "space" : # μ€νμ΄μ€ ν€λ₯Ό λλ μ λ
canvas.delete("TITLE") # νμ΄ν λ¬Έμ μμ
canvas.create_rectangle(0, 0, 600, 400, fill="blue", tag="GAME") # μΊλ²μ€λ₯Ό νλμμΌλ‘ μΉ ν¨
canvas.create_text(300, 150, text = "κ²μ μ€", fill="white", font=fnt2, tag="GAME") # 'κ²μ μ€' λ¬Έμμ΄ νμ
canvas.create_text(300, 300, text = "[E]μ’
λ£", fill="yellow", font=fnt1, tag="GAME") #'[e]μ’
λ£ λ¬Έμμ΄ νμ'
index = 1 # index κ° 1λ‘ λ³κ²½
timer = 0 # timer κ° 0μΌλ‘ λ³κ²½
if index == 1: # index 1 μ²λ¦¬ (κ²μ μ€ νλ©΄)
if key == "e": # E ν€λ₯Ό λλ μ λ
canvas.delete("GAME") # 'κ²μ μ€' λ¬Έμμ΄ μμ
canvas.create_rectangle(0, 0, 600, 400, fill = "maroon", tag="OVER") # μΊλ²μ€ κ°μμΌλ‘ μΉ ν¨
canvas.create_text(300, 150, text = "GAME OVER", fill = "red", font=fnt2, tag="OVER") # 'game over'λ¬Έμμ΄ νμ
index = 2 # index κ° 2λ‘ λ³κ²½
timer = 0 # timer κ° 0μΌλ‘ λ³κ²½
if index == 2: # index 2 μ²λ¦¬ (κ²μ μ€λ² νλ©΄)
if timer == 30: # timer κ°μ΄ 30μ΄ λλ€λ©΄
canvas.delete("OVER") # 'game over'λ¬Έμμ΄ μμ
index = 0 # index κ° 0μΌλ‘ λ³κ²½
timer = 0 # timer κ° 0μΌλ‘ λ³κ²½
root.after(100, main) # 100λ°λ¦¬μ΄ μ΄ν λ€μ main()ν¨μ μ€ν
root = tkinter.Tk() # μλμ° κ°μ²΄ μμ±
root.title("μΈλ±μ€μ νμ΄λ¨Έ") # μλμ° νμ΄ν μ§μ
root.bind("<KeyPress>", key_down) # ν€λ₯Ό λλ μ λ main()ν¨μ λ€μ μ€ν
canvas = tkinter.Canvas(width = 600, height = 400, bg = "black") # μΊλ²μ€ μ»΄ν¬λνΈ μμ±
canvas.pack() # μΊλ²μ€ λ°°μΉ
main() # λ©μΈ μ²λ¦¬ μ€ν
root.mainloop() # μλμ° νμ
μ λ°μ μΌλ‘ μ΄ νλ‘κ·Έλ¨μ index, timer μ΄ λκ°μ λ³μλ‘ μ§νλλ€.
main() ν¨μμμ after() λͺ λ Ήμ μ΄μ©ν΄ 100msλ§λ€ κ³μ μ€νμν€λλ°, μ΄λ timer = timer + 1 μ κ³μ λ°λ³΅μν€λ©΄μ timer κ°μ μ¦κ°μν€κ² λλ€.
νμ΄ν νλ©΄μμλ if ꡬ문μΌλ‘ μ€νμ΄μ€ ν€λ₯Ό λλ μ λ indexλ₯Ό 1λ‘ λ³κ²½ν΄ κ²μ νλ μ΄ νλ©΄μΌλ‘ μ΄λμν€κ³ , κ²μ νλ μ΄ νλ©΄μμλ if ꡬ문μΌλ‘ eν€λ₯Ό λλ μ λ indexλ₯Ό 2λ‘ λ³κ²½ν΄ κ²μ μ€λ² νλ©΄μΌλ‘ μ΄λμν¨λ€. κ²μ μ€λ² νλ©΄μμλ timer = 30μΌ λ index = 0μΌλ‘ λ³κ²½ν΄ νμ΄ν νλ©΄μΌλ‘ λμκ°λ€.
μ± μ λ§λΆμ¬μ§ μ€λͺ μμλ... νλ μ λ μ΄νΈ(frame rate)λ 1μ΄λ§λ€ νλ©΄μ λ€μ 그리λ νμλ‘, μ΄ νλ‘κ·Έλ¨μμλ 0.1μ΄λ§λ€ μ²λ¦¬λλ―λ‘ νλ μ λ μ΄νΈκ° 10μ΄λ€.
5. μ₯μ λ¬Ό νΌνκΈ° κ²μ λ§λ€κΈ°
import tkinter
import random
fnt1 = ("Times New Roman", 24)
fnt2 = ("Times New Roman", 50)
index = 0
timer = 0
score = 0
bg_pos = 0 # λ°°κ²½ νμ μμΉ λ³μ
px = 240 # νλ μ΄μ΄(μ°μ£Όμ ) Xμ’ν λ³μ
py = 540 # νλ μ΄μ΄(μ°μ£Όμ ) Yμ’ν λ³μ
METEO_MAX = 30 # μ μ± μ
mx = [0] * METEO_MAX # μ μ± Xμ’ν κ΄λ¦¬ 리μ€νΈ
my = [0] * METEO_MAX # μ μ± Yμ’ν κ΄λ¦¬ 리μ€νΈ
key = "" # ν€ κ° λμ
λ³μ
koff = False # ν€λ₯Ό λλ λ€ λμ λ μ¬μ©ν λ³μ(νλκ·Έ)
def key_down(e): # ν€λ₯Ό λλ μ λ μ¬μ©ν ν¨μ
global key, koff
key = e.keysym # keyμ keysym κ° λμ
# keysym : ν€λ³΄νΈ μ΄λ²€νΈμμ λ°μνλ ν€μ μ¬λ³Όλͺ
koff = False # koffμ False λμ
def key_up(e): # ν€λ₯Ό λλ λ€ λμ λ μ€νν ν¨μ
global koff
koff = True
def main(): # λ©μΈ μ²λ¦¬ μν ν¨μ
global key, koff, index, timer, score, bg_pos, px
timer = timer + 1
bg_pos = (bg_pos + 1) % 640 # λ°°κ²½μ 그릴 μμΉ κ³μ°
canvas.delete("SCREEN") # νλ©΄ μμ λͺ¨λ κ·Έλ¦Όκ³Ό λ¬Έμμ΄ μμ ν
# λ°°κ²½ μ°μ£Ό μ΄λ―Έμ§ 그리기
canvas.create_image(240, bg_pos - 320, image=img_bg, tag="SCREEN")
canvas.create_image(240, bg_pos + 320, image=img_bg, tag="SCREEN")
if index == 0: # index 0 μ²λ¦¬ (νμ΄ν νλ©΄)
canvas.create_text(240, 240, text="METEOR", fill="gold", font=fnt2, tag="SCREEN") # νμ΄ν λ¬Έμμ΄ νμ
canvas.create_text(240, 480, text="Press [SPACE] Key", fill="lime", font=fnt1, tag="SCREEN") # 'press[space]key' λ¬Έμμ΄ νμ
if key == "space": # μ€νμ΄μ€ ν€λ₯Ό λλ μ λ
score = 0
px = 240 # μ°μ£Όμ μμΉλ₯Ό νλ©΄ μ€μμΌλ‘ μ§μ
init_enemy() # μ μ± μ’ν μ΄κΈ°κ° λμ
index = 1 # index κ° 1λ‘ λ³κ²½
if index == 1: # index 1 μ²λ¦¬(νλ μ΄ μ€ νλ©΄)
score = score + 1 # score μ¦κ°
move_player() # μ°μ£Όμ μ΄λ
move_enemy() # μ μ± μ΄λ
if index == 2: # index 2 μ²λ¦¬ (κ²μ μ€λ² νλ©΄)
move_enemy() # μ μ± μ΄λ
canvas.create_text(240, timer * 4, text="GAME OVER", fill="red", font=fnt2, tag="SCREEN") # 'game over' λ¬Έμμ΄ νμ
if timer == 60: # timer κ°μ΄ 60μΌ λ
index = 0
timer = 0
canvas.create_text(240, 30, text="SCORE " + str(score), fill="white", font=fnt1, tag="SCREEN") # score νμ
if koff == True: # koffκ° TrueμΌ λ
key = "" # key κ° ν΄λ¦¬μ΄
koff = False
root.after(50, main) # 50ms ν λ€μ main() ν¨μ μ€ν
def hit_check(x1, y1, x2, y2): # ννΈ μ²΄ν¬ μν ν¨μ
if ((x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2) < 36 * 36): # λ μ μ¬μ΄μ 거리 νμ , 36ν½μ
λ―Έλ§μΌ λ
return True
return False
def init_enemy(): # μ μ± μ’νμ μ΄κΈ° μμΉ μ§μ ν¨μ
for i in range(METEO_MAX): # xμ’νμ yμ’νλ₯Ό λμλ‘ κ²°μ νλ κ²μ κ³μ λ°λ³΅
mx[i] = random.randint(0, 480)
my[i] = random.randint(-640, 0)
def move_enemy(): # μ μ± μ΄λ ν¨μ
global index, timer
for i in range(METEO_MAX):
my[i] = my[i] + 6 + i / 5 # μ μ± y μ’ν μ
λ°μ΄νΈ
if my[i] > 660: # y μ’νκ° 660 μ΄κ³ΌμΌ λ x, yμ’νλ₯Ό λμλ‘ κ²°μ
mx[i] = random.randint(0, 480)
my[i] = random.randint(-640, 0)
if index == 1 and hit_check(px, py, mx[i], my[i]) == True: # κ²μ μ€ μ°μ£Όμ κ³Ό μ μ΄νμ λ
index = 2 # index κ° 2λ‘ λ³κ²½
timer = 0 # timer κ° 0μΌλ‘ λ³κ²½
canvas.create_image(mx[i], my[i], image=img_enemy, tag="SCREEN") # μ μ± κ·Έλ¦¬κΈ°
def move_player(): # μ°μ£Όμ μ΄λ ν¨μ
global px
if key == "Left" and px > 30: # μΌμͺ½ ν€λ₯Ό λλ₯Έ μνμμ px>30μΌ λ
px = px - 10 # px(xμ’ν) 10 κ°μ
if key == "Right" and px < 450: # μ€λ₯Έμͺ½ ν€λ₯Ό λλ₯Έ μνμμ px<450μΌ λ
px = px + 10 # px(xμ’ν) 10 wmdrk
canvas.create_image(px, py, image=img_player[timer % 2], tag="SCREEN") # μ°μ£Όμ 그리기
root = tkinter.Tk()
root.title("Mini Game")
root.bind("<KeyPress>", key_down) # ν€λ₯Ό λλ μ λ μ€νν ν¨μ μ§μ
root.bind("<KeyRelease>", key_up) # ν€λ₯Ό λλ λ€ λμ λ μ€νν ν¨μ μ§μ
canvas = tkinter.Canvas(width=480, height=640) # μΊλ²μ€ μ»΄ν¬λνΈ μμ±
canvas.pack() # μΊλ²μ€λ₯Ό μλμ°μ λΉμΉ
img_player = [ # 리μ€νΈμ μ°μ£Όμ μ΄λ―Έμ§ λ‘λ©(μ λλ©μ΄μ
μ©)
tkinter.PhotoImage(file="starship0.png"),
tkinter.PhotoImage(file="starship1.png")
]
img_enemy = tkinter.PhotoImage(file="meteo.png") # μ μ± μ΄λ―Έμ§ λ‘λ©
img_bg = tkinter.PhotoImage(file="cosmo.png") # λ°°κ²½ μ΄λ―Έμ§ λ‘λ©
main() # λ©μΈ μ²λ¦¬ μ€ν
root.mainloop() # μλμ° νμ
μ°λ€κ° μ’ λ©λΆμ¬λ» νλ€... μ΄λ° νλ‘κ·Έλ¨μ μ§κΈ μνμμλ μ λ λͺ»λ§λ€ κ² κ°μμ.. γ μ‘Έμ μ£Όμ μλͺ» μ μ²νλ€ μΆλ€.... μ¬μ§μ΄ μ½λλ μ€λͺ μ£Όμ μ°λ©΄μλ μ μ΄ν΄ λͺ»ν λΆλΆμ΄ μλ€.. νν μ¬νκ² μ€λ μ€..γ
1) λ³μμ 리μ€νΈ
- index, timer : μΈλ±μ€μ νμ΄λ¨Έ, κ²μ μ§ν κ΄λ¦¬ λ³μ
- score : μ μ λ³μ
- bg_pos : λ°°κ²½ μ€ν¬λ‘€μ μν μ’ν λ³μ
- px, py : μ°μ£Όμ μ’ν λ³μ
- METEO_MAX : νλ©΄μ νλ₯΄λ μ μ± μ (ν λ² 30μΌλ‘ μ μνκ³ λ³κ²½νμ§ μλ κ°μΌλ‘, μ΄λ₯Ό μμλ‘ λΆλ₯΄κ³ μμλ λͺ¨λ λλ¬Έμλ‘ νμν΄μΌ νλ€κ³ νλ€.)
- mx[], my[] : μ μ± μ’ν
2) indexκ°
- 0 : νμ΄ν νλ©΄ / μ€νμ΄μ€ ν€λ₯Ό λλ₯΄λ©΄ κ° λ³μλ₯Ό μ΄κΈ°ννκ³ index 1λ‘ μ΄λ
- 1 : κ²μ νλ μ΄ μ€ νλ©΄ / μ°μ£Όμ μ΄λ, μ μ± μ²λ¦¬ μν, μ μ± μ²λ¦¬ μ€ μ°μ£Όμ κ³Ό μ μ΄νλ©΄ index 2λ‘ μ΄λ
- 2 : κ²μ μ€λ² νλ©΄ / 3μ΄ λκΈ° ν index 0μΌλ‘ μ΄λ
κ·Έλ¦¬κ³ κ³μ μ΄ν΄λ₯Ό λͺ»νκ³ μλ λΆλΆμ΄ μλλ°,
if index == 2:
move_enemy()
canvas.create_text(240, timer * 4, text="GAME OVER", fill="red", font=fnt2, tag="SCREEN")
if timer == 60:
index = 0
timer = 0
index == 2(κ²μ μ€λ² νλ©΄)μΌ λ, timerκ° 60μ΄λ©΄ νμ΄ν νλ©΄μΌλ‘ λλμκ°λλ° μ μ¬κΈ°μ timer = 60μ΄ λΆλͺ νλ° μ 3μ΄ λ€λ©΄ νμ΄ν νλ©΄μΌλ‘ λμκ°λκ±ΈκΉ?
λ°λ‘ μ μμ μμλ timer == 30μΌ λ (3μ΄ λ€) νμ΄ν νλ©΄μΌλ‘ λμμ¨λ€κ³ νμλ€. κ·Όλ° μ¬κΈ°μλ timer == 60μΈλ°λ 3μ΄ λ€μ νμ΄ν νλ©΄μΌλ‘ λμκ°λ κ±ΈκΉ... μ΄κ±΄ λ무 λͺ¨λ₯΄κ² μ΄μ μΌλ¨ λ λ¬μΌκ² λ€.
3) ν¨μ
- key_down(e) : ν€λ₯Ό λλ μ λ μ€ν
- key_up(e) : ν€λ₯Ό λλ λ€ λμ λ μ€ν
- main() : λ©μΈ μ²λ¦¬ μν
- hit_check(x1, y1, x2, y2) : λ μ μ¬μ΄ κ±°λ¦¬λ‘ ννΈ μ²΄ν¬ μν
- init_enemy() : μ μ± μ’ν μ΄κΈ°ν
- move_enemy() : μ μ± μ΄λ
- move_player() : μ°μ£Όμ μ΄λ
my[i] = my[i] + 6 + i / 5
move_enemy() ν¨μ λ΄ μ΄ μ½λλ μ’νλ₯Ό κ³μ λ³νμμΌ μ μ±λ§λ€ μλλ λ¬λΌμ§κ² νλ€.
if index == 1 and hit_check(px, py, mx[i], my[i]) == True:
index = 2
κ·Έλ¦¬κ³ μ΄ λΆλΆμμλ ννΈ μ²΄ν¬λ₯Ό μνν΄ μ μ±κ³Ό μ°μ£Όμ μ΄ μ μ΄νλ©΄ index = 2λ₯Ό μνν΄ κ²μ μ€λ² μ²λ¦¬λ‘ μ΄λνλ€.
def hit_check(x1, y1, x2, y2):
if ((x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2) < 36 * 36):
return True
return False
ννΈ μ²΄ν¬ ν¨μμμλ μ μ μμ μ λ¬λ¦¬ sqrt() λͺ λ Ήμ μ΄μ©νμ§ μμλλ°, μ°λ³μ 36μ΄ μλ 36μ μ κ³±μ λ£μμΌλ‘μ¨ λ£¨νΈλ₯Ό μ κ±°ν μ μλ€. μλ νλ‘κ·Έλλ¨Έλ€μ μ΄μ κ°μ΄ κ΅³μ΄ λ£¨νΈλ₯Ό μ¬μ©νμ§ μμλ λ λλ λ λΉ λ₯΄κ³ μΎμ ν μ²λ¦¬λ₯Ό μν΄ sqrt() λͺ λ Ήμ μ¬μ©νμ§ μμλ€κ³ νλ€....
4) λ§₯μμμ ν€ μ λ ₯
λ§₯μμλ after() λͺ λ Ήμ μ¬μ©ν μ€μκ° μ²λ¦¬ νλ‘κ·Έλ¨μμ ν€ μ λ ₯μ ν μ μλ κ²½μ°κ° μλ€κ³ νλ€. λ§₯μμλ ν€λ₯Ό λλ μ λ <KeyPress> μ΄λ²€νΈμ <KeyRelease> μ΄λ²€νΈκ° μ°μ λ°μν΄ μ²λ¦¬ νμ΄λ°μ λ°λΌ ν€ κ°μ λͺ»μ»μ΄μ λΌκ³ νλλ° koffκ° λ체 λκ° λκ° νλλ μ¬κΈ°μ μ°μ΄λ κ±°μλ€.
key = ""
koff = False
def key_down(e):
global key, koff
key = e.keysym
koff = False
def key_up(e):
global koff
koff = True
if koff == True:
key = ""
koff = False
koff λΌλ νλκ·Έλ₯Ό μ΄μ©ν΄ <KeyRelease> μ΄λ²€νΈ λ°μ μ koffμ Trueλ₯Ό λμ ν΄ νλ μ΄μ΄ μΊλ¦ν°λ₯Ό μ΄λν ν koffκ° True κ°μ΄λ©΄ ν€ κ°μ΄ λ€μ΄ μλ λ³μλ₯Ό ν΄λ¦¬μ΄ν΄μ λ§₯μμλ μ무λ μ§ μκ² μ μΈ μ μλ κ²μ΄λΌ νλ€.
λ€λ§ μλμ°μ¦μμ μμ΄λ λλ μ½λκ° μκΈ΄κ±°λ koffκ° μμΌλ©΄ ν€ λ°μμ΄ μ’ λλΉ μ§λ€κ³ νλ€....
5) λμ΄λ λ³κ²½νκΈ°
κ²μμμλ λ°Έλ°μ€ ν¨μΉ, λμ΄λ μ‘°μ λ± κ· νμ μ‘λ κ² μ€μν건 μκ³ μλ€. μ΄ λ μ΄ νλ‘κ·Έλ¨μμλ METEO_MAXμ κ°μ λ³κ²½νλ€λμ§, move_enemy ν¨μμ my[i] = my[i] + 6 + i / 5 λΆλΆμ κ³μ°μμ λ³κ²½ν΄ μ μ±μ μλλ λ³κ²½ν΄λ³Ό μ μλ€.
'python' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
νμ΄μ¬μΌλ‘ λ°°μ°λ κ²μ κ°λ° μ€μ νΈ chapter 1 (0) | 2022.01.23 |
---|