ããæ°åãTkinterãšããGUIã©ã€ãã©ãªãå©çšããŠãã²ãŒã å¶äœã«ææŠããŠãããä»åäœãã®ã¯ãã¬ããææº¢ããã²ãŒã ããããã¯åŽ©ããã ã100è¡çšåºŠã®ããã°ã©ã ã§å®çŸã§ããã®ã§ææŠããŠã¿ããã
![]() |
ãããã¯åŽ©ãã®ã²ãŒã (GIFã¢ãã¡) |
ãããã¯åŽ©ããšã¯ïŒ
ãããã¯åŽ©ããšããã®ã¯ã1970幎ãã1980幎ã«ãããŠç»å Žããã²ãŒã ã®ãžã£ã³ã«ãå£ã«ã¶ã€ãããšåå°ããããŒã«ããç»é¢äžéšã«èœãšããªãããã«ãããŒãå·Šå³ã«ç§»åãããã²ãŒã ã ãç»é¢ã«ã¯ãããã¯ãé 眮ãããŠãããããŒã«ã§ãããã¯ã厩ããŠããã
ãŸãã¯ããŒã«ãåå°ãããã ãã®ããã°ã©ã ããäœã£ãŠã¿ãã
ããŒã«ãç»é¢äžéšã«èœãšããªãããã«ãããšããç°¡åãªã«ãŒã«ã®ã²ãŒã ã ããäžåºŠã«å šéšãå®è£ ããããšãããšãã©ã®ããã«ããã°ã©ã ãçµã¿ç«ãŠãŠè¯ãã®ãæ©ããããããªããã²ãŒã ã®ããã°ã©ã ãäœãå Žåããã®æ žãšãªãéšåãå°ããã€çµã¿ç«ãŠãŠè¡ããšè¯ããããã§ããŸãã¯ãããŒã«ãåå°ãããã ãã®ããã°ã©ã ããäœã£ãŠã¿ããã
![]() |
ããŒã«ãåå°ããŠåãã ãã®ããã°ã©ã |
以äžã¯ããŒã«ãåå°ããŠåãã ãã®ããã°ã©ã ã ã以äžã®ããã°ã©ã ããball-move.pyã(ãœãŒã¹ã³ãŒãïŒball-move.lzh)ãšããååã§ä¿åãããã
# ãããã¯åŽ©ã
from tkinter import *
# ããŒã«ã衚ãèŸæžåããŒã¿ --- (*1)
ball = {
"dirx": 15, # Xæ¹åã®ããŒã«ã®éã
"diry": -15, # Yæ¹åã®ããŒã«ã®éã
"x": 350, # ããŒã«ã®äœçœ®
"y": 300,
"w": 10, # ããŒã«ã®å¹
}
# ãŠã£ã³ããŠã®äœæ --- (*2)
win = Tk()
cv = Canvas(win, width = 600, height = 400)
cv.pack()
# ç»é¢ãæç»ãã --- (*3)
def draw_objects():
cv.delete('all') # æ¢åã®æç»ãç Žæ£
# ããŒã«ãæç»
cv.create_oval(
ball["x"] - ball["w"], ball["y"] - ball["w"],
ball["x"] + ball["w"], ball["y"] + ball["w"],
fill="green")
# ããŒã«ã®ç§»å --- (*4)
def move_ball():
# ä»®ã®å€æ°ã«ç§»ååŸã®å€ãèšé²
bx = ball["x"] + ball["dirx"]
by = ball["y"] + ball["diry"]
# äžå·Šå³ã®å£ã«åœãã£ãïŒ
if bx < 0 or bx > 600: ball["dirx"] *= -1
if by < 0 or by > 400: ball["diry"] *= -1
# ç§»åå
容ãåæ
if 0 <= bx <= 600: ball["x"] = bx
if 0 <= by <= 400: ball["y"] = by
# ã²ãŒã ã«ãŒã --- (*5)
def game_loop():
draw_objects()
move_ball()
win.after(50, game_loop)
game_loop()
win.mainloop() # ã²ãŒã ãŠã£ã³ããŠã衚瀺
ããã°ã©ã ãå®è¡ããã«ã¯ãPowerShellãã¿ãŒããã«ãèµ·åããããã°ã©ã ãã«ã¬ã³ããã£ã¬ã¯ããªã«ä¿åããããæ¬¡ã®ã³ãã³ããå®è¡ãããWindowsã§ã¯ããpythonãã³ãã³ãããmacOSã§ã¯ãpython3ãã³ãã³ããå®è¡ããã
# Windowsã®å Žå
python ball-move.py
# macOSã®å Žå
python3 ball-move.py
ããã§ã¯ãããã°ã©ã ãäžã€ãã€èŠãŠã¿ãããããã°ã©ã ã®(ïŒ1)ã®éšåã§ã¯ãããŒã«ã衚ãèŸæžåã®ããŒã¿ãå®çŸ©ããŠãããããã¯ãèŸæžå(dictå)ã®å€æ°ã ãèŸæžåã®å€æ°ã䜿ããšãè€æ°ã®å€ãäžã€ã®å€æ°ã§ç®¡çã§ããã®ãè¯ããããã§ã¯ãããŒã«ã®äœçœ®(x, y)ãå¹
(w)ãããŒã«ã®éããšé²è¡æ¹å(dirx, diry)ãäžã€ã®å€æ°ã§ç®¡çããã
ã²ãŒã ã®äžã§ã¯ãããŸããŸãªå€æ°ãå©çšããã®ã§ããã®ããã«ãèŸæžå倿°ã䜿ã£ãŠãç¹å®ã®ç®çã§å©çšãã倿°ããŸãšããŠãããšç®¡çãããããªãã
ããã°ã©ã ã®(ïŒ2)ã§ã¯ããŠã£ã³ããŠãäœæãããããã§ã¯ãå¹
600ãé«ã400ãã¯ã»ã«ã®ãŠã£ã³ããŠãäœæããã(ïŒ3)ã§ã¯ãç»é¢ãæç»ãããããã§ã¯ãæ¯åãå
šãŠã®æç»å
容ãã¯ãªã¢ããŠãããã«æ°ãã«æç»å
å®¹ãæžã蟌ããšããåŠçãèšè¿°ããŠãããcv.delete('all')ãšèšè¿°ãããšãå
šãŠã®æç»å
容ãã¯ãªã¢ã§ããããããŠãcreate_oval()ã¡ãœããã§ã(x1, y1, x2, y2)ã®ãµã€ãºã®æ¥åãæç»ãããããã§ã¯ãããŒã«ã®å·Šäž(x1, y1)ãšå³äž(x2, y2)ã®åº§æšãæå®ããã
ããã°ã©ã ã®(ïŒ4)ã§ã¯ãããŒã«ã®åº§æšãç§»åãããããã®ãšããX座æšãšY座æšã確èªããŠãäžäžå·Šå³ã®å£ã«åœãã£ãããšãåããã°ãããŒã«ã®é²è¡æ¹åã«-1ããããŠãåå°ãããåŠçãè¡ãã
ãããŠãããã°ã©ã ã®(ïŒ5)ã®éšåã§ãç¹°ãè¿ããç»é¢ã®æç»ãšããŒã«ã®ç§»åãè¡ãããã«æå®ããã
ãããã¯åŽ©ãã宿ãããã
ãããŠãããŒã«ç§»åã®ããã°ã©ã ã«ãããã¯ãšããŒã®æç»ããããŠãããŠã¹ã®åº§æšã調ã¹ãŠãããŒã®ç§»ååŠçã远å ãããšããããã¯åŽ©ãã®ã²ãŒã ã宿ããã
ãããã®åŠçã®äžã§ããããã¯ã«é¢ããæ±ãã玹ä»ãããããããã¯ã®å座æšã管çããblocksãšããé å倿°ãçšæãããã®äžã«åãããã¯ã®åº§æšãè²ãèšå®ããããšã«ãããããã®å Žåã以äžã®ãããªããã°ã©ã ãçšæãã5x8ã§åèš40åã®ãããã¯ãçæããã
blocks = [] # ãããã¯ã管çããé
å
# ... çç¥ ...
# ãããã¯ãé
眮ãã
for iy in range(0, 5):
for ix in range(0, 8):
color = "red"
if (iy + ix) % 2 == 1: color = "blue"
x1 = 4 + ix * block_size["x"]
x2 = x1 + block_size["x"]
y1 = 4 + iy * block_size["y"]
y2 = y1 + block_size["y"]
blocks.append([x1, y1, x2, y2, color])
ãããã¯ãæç»ããããã«ãcreate_rectangle()ã¡ãœããã䜿ã£ãŠã以äžã®ããã«ãç©åœ¢ãæç»ã§ããããã®ããã«ããŠãè€æ°ã®ãããã¯ãçšæããããç¹°ãè¿ãæ§æã®forã䜿ããªããæ°è¡ã®ããã°ã©ã ã§æç»ã§ããã
# ãããã¯ãäžã€ãã€æç»
for w in blocks:
x1, y1, x2, y2, c = w
cv.create_rectangle(x1, y1, x2, y2, fill=c, width=0)
ããšã¯ãããŒã«ããããã¯ã«åœãã£ããã©ããããŸããããŒã«ãç»é¢äžéšã«èœã¡ããã©ãããäžã€ãã€ç¢ºèªããã°ã²ãŒã ã宿ã ã
å®éã®ããã°ã©ã ã¯ããã¡ã(block-ball.lzh)ããããŠã³ããŒãã§ããã100è¡çšåºŠã®ããã°ã©ã ã§ãããã»ã©é·ããªãã®ã§ãããŠã³ããŒãããããã°ã©ã ããäžè¡ãã€ç¢ºèªããŠã¿ãŠæ¬²ãããåºæ¬ãšãªãéšåã¯ãããŒã«ã®åå°ããã°ã©ã ãšã»ãšãã©åããªã®ã§ãäœãä»ãå ããããã®ããèŠæ¯ã¹ãªãã確èªããŠã¿ããšçè§£ããããã ããã
ãªããããã°ã©ã ãå®è¡ããã«ã¯ãã¿ãŒããã«ãã以äžã®ã³ãã³ããå®è¡ããã
# Windowsã®å Žå
python block-ball.py
# macOSã®å Žå
python3 block-ball.py
ãŸãšã
以äžãä»åã¯ãæããã®ã¬ããã²ãŒã ã®ãããã¯åŽ©ããäœã£ãŠã¿ããã²ãŒã ãäœã£ãŠã¿ããšãããã°ã©ãã³ã°åããã£ãšã¢ãããããã²ãŒã éçºã¯ã楜ããããã°ã©ãã³ã°èœåãåäžãããããšãã§ãããçŽ æŽããã顿ã ãPythonã®åºç€æ§æã身ã«ã€ãããããã²ãã²ãŒã éçºã«ææŠããŠã¿ããããªããã¬ããã²ãŒã ã¯ãããã»ã©é£ããåŠçã豪è¯ãªã°ã©ãã£ãã¯åŠçãäžèŠãªã®ã§ããªã¹ã¹ã¡ã ã
èªç±åããã°ã©ããŒããããã¯ãã©ã«ãŠãããã°ã©ãã³ã°ã®æ¥œãããäŒããæŽ»åãããŠããã代衚äœã«ãæ¥æ¬èªããã°ã©ãã³ã°èšèªããªã§ããã ãããã¹ã鳿¥œããµã¯ã©ããªã©ã2001幎ãªã³ã©ã€ã³ãœãã倧è³å ¥è³ã2004幎床æªèžãŠãŒã¹ ã¹ãŒããŒã¯ãªãšãŒã¿èªå®ã2010幎 OSSè²¢ç®è ç« åè³ãæè¡æžãå€ãå·çããŠããã

