ååãããTkinterãšããGUIã©ã€ãã©ãªãå©çšããŠãã²ãŒã å¶äœã«ææŠããŠãããä»åäœãã®ã¯ãç¥ã人ãç¥ããã©ã€ãã²ãŒã ããšããã·ãã¥ã¬ãŒã·ã§ã³ã²ãŒã ã ãæ¯èŒçç°¡åã§ãããªãããèŠãç®ãé¢çœãã®ã§ææŠããŠã¿ããã
ã©ã€ãã²ãŒã ãšã¯ïŒ
çè ããæ°ããããã°ã©ãã³ã°èšèªããã¬ãŒã ã¯ãŒã¯ãèŠããæã«ã¯ãå¿ ãäœã£ãŠããããã°ã©ã ããããããããã©ã€ãã²ãŒã (LIfe Game)ãã ãããã¯ãçç©éå£ã®æ æ¯çè¡°ãã·ãã¥ã¬ãŒã·ã§ã³ããç°å¢ã²ãŒã ã§ãã€ã®ãªã¹ã®æ°åŠè ãžã§ã³ã»ããŒãã³ã»ã³ã³ãŠã§ã€ã«ãã£ãŠèæ¡ããããã®ã ã
å®éã®ç»é¢ã¯ã次ã®ãããªãã®ã ã
![]() |
ã©ã€ãã²ãŒã ã®ç»é¢ - çç©ã®èªçãšæ·æ±°ãã«ãŒã«ã«åºã¥ããŠæ±ºå®ããã |
ã©ã€ãã²ãŒã ã§ã¯ããã®ç»é¢ã®éããäºæ¬¡å ã®ã°ãªããã§çç©(ã»ã«)ã®çæ»ã衚çŸãããèµ€ãåãçããŠããã»ã«ã ããããŠãçç©éå£ã¯ãéçã§ãéå¯ã§ãçããŠã¯ãããªããšããåºæ¬çãªã«ãŒã«ãããã
çç©ã®åšå²(8æ¹å)ã調ã¹ãŠãäœå¹ã®çããã»ã«ããããã«ãã£ãŠã次ã®äžä»£ã®çæ»ã決å®ããããã€ãŸããçç©ã®èªçãšæ·æ±°ã以äžã®ç°¡åãªã«ãŒã«ã«åºã¥ããŠæ±ºå®ãããã
ã©ã€ãã²ãŒã ã®ã«ãŒã«ã¯ã次ã®éã:
- çç©ã®èªç --- æ»ãã§ããã»ã«ã®åšå²ã«ãçããŠããã»ã«ã3ã€ããã°ã次ã®äžä»£ã«çç©ãèªçãã
- çç©ãç¶ç¶ããŠçå --- çããŠããã»ã«ã®åšå²ã«ãçããŠããã»ã«ã2ã€ä»¥äž3ã€ä»¥äžããã°ã次ã®äžä»£ã«çç©ã¯ç¶ç¶ããŠçåãã
- éçç¶æ
--- åšå²ã«çããŠããã»ã«ã1ã€ä»¥äžãããªããã°ã次ã®äžä»£ã«ã¯æ»æ»
ãã
- éå¯ç¶æ
--- çããŠããã»ã«ã®åšå²ã«ãçããŠããã»ã«ã4ã€ä»¥äžããã°ãéå¯ã«ããæ»æ»
ãã
ããã ãã®ã«ãŒã«ã ããé
眮ããã»ã«ã®åœ¢ã«ãã£ãŠãåãã«èŠåããããèŠãç®ãé¢çœãã®ã§ã楜ãããã
ããã°ã©ã ãäœã£ãŠã¿ãã
ããã§ã¯ããã£ãããããã°ã©ã ãäœã£ãŠã¿ããã以äžã¯ãæåã«ãã¹ããŒãžãã©ã³ãã ã«åæåãããã®åŸãã©ã€ãã²ãŒã ã®ã«ãŒã«ã«æ²¿ã£ãŠã300ããªç§ããšã«ã·ãã¥ã¬ãŒã·ã§ã³ãè¡ãããã°ã©ã ã ã
from random import randint
from tkinter import *
# 倿°ã»å®æ°ã®å®çŸ© --- (*1)
COLS, ROWS = [30, 20] # ã¹ããŒãžã®ãµã€ãºãå®çŸ©
CW = 20 # ã»ã«ã®æç»ãµã€ãº
data = [] # ã¹ããŒãžããŒã¿
for y in range(0, ROWS): # ã¹ããŒãžãã©ã³ãã ã«åæå
data.append([(randint(0, 9) == 0) for x in range(0, COLS)])
# ã©ã€ãã²ãŒã ã®ã«ãŒã«ãå®è£
ãããã® --- (*2)
def check(x, y):
# åšå²ã®çåã»ã«ãæ°ãã
cnt = 0
tbl = [(-1, -1), (0, -1), (1, -1), (1, 0), (1, 1), (0, 1), (-1, 1), (-1, 0)]
for t in tbl:
xx, yy = [x + t[0], y + t[1]]
if 0 <= xx < COLS and 0 <= yy < ROWS:
if data[yy][xx]: cnt += 1
# ã«ãŒã«ã«æ²¿ã£ãŠæ¬¡äžä»£ã®çæ»ã決ãã
if cnt == 3: return True # èªç
if data[y][x]:
if 2 <= cnt <= 3: return True # çå
return False # éç or éå¯
return data[y][x]
# ããŒã¿ã次ã®äžä»£ã«é²ãã --- (*3)
def next_turn():
global data
data2 = []
for y in range(0, ROWS):
data2.append([check(x, y) for x in range(0, COLS)])
data = data2 # ããŒã¿ã®å
å®¹ãæ¬¡ã®äžä»£ãžå·®ãæ¿ã
# ç»é¢ãæ§ç¯ --- (*4)
win = Tk() # ãŠã£ã³ããŠãäœæ
cv = Canvas(win, width = 600, height = 400) # ãã£ã³ãã¹ãäœæ
cv.pack()
# ã¹ããŒãžãæç» --- (*5)
def draw_stage():
cv.delete('all') # æ¢åã®æç»å
容ãç Žæ£
for y in range(0, ROWS):
for x in range(0, COLS):
if not data[y][x]: continue
x1, y1 = [x * CW, y * CW]
cv.create_oval(x1, y1, x1 + CW, y1 + CW,
fill="red", width=0) # çããŠããã»ã«ãæç»
# 300ããªç§ããšã«äžä»£ãé²ãã --- (*6)
def game_loop():
next_turn() # äžä»£ãé²ãã
draw_stage() # ã¹ããŒãžãæç»
win.after(300, game_loop) # æå®æéåŸã«å床æç»
game_loop() # ã²ãŒã ã«ãŒããå®è¡
win.mainloop() # ã€ãã³ãã«ãŒã
äžèšã®ããã°ã©ã ããlifegame-simple.pyã(ãœãŒã¹ã³ãŒãïŒlifegame-simple.lzh)ãšããååã§ä¿åãããããããŠãWindowsã§ã¯ã³ãã³ãããã³ãããPowerShellããmacOSã§ã¯ã¿ãŒããã«ãèµ·åãããããã以äžã®ã³ãã³ããå®è¡ããŠã¿ããã
# Windows
python lifegame-simple.py
---
# macOS
python3 lifegame-simple.py
ããã°ã©ã ãå®è¡ããããšã以äžã®ãããªç»é¢ãåºãŠãçç©ã®æ æ¯çè¡°ã®æ§åãæ¥œãããã
ããã°ã©ã ãèŠãŠã¿ãããããã°ã©ã ã®åé (ïŒ1)ã§ã¯ã倿°ã宿°ã®å®çŸ©ãè¡ã£ãŠããããããã宣èšã¯ãããã°ã©ã ã®å é ã«ãŸãšããŠãããšãããšããšå€æŽã容æã ãã¹ããŒãžäžã®ã»ã«ã®çæ»ã®ç¶æ ãäºæ¬¡å é åã§ç®¡çããã®ã倿°dataã ãã©ã³ãã ã«ã»ã«ã®åæç¶æ ãæ±ºå®ããŠãããTrueãçãFalseãæ»ã衚ãããšã«ããã
ããã°ã©ã ã®(ïŒ2)ãš(ïŒ3)ã®éšåã§ã¯ãã«ãŒã«ã«æ²¿ã£ãŠæ¬¡äžä»£ã®ã»ã«ã®ç¶æ
ãæ±ºå®ããã(ïŒ2)ã®check()颿°ã§ã¯ã(x, y)ã®äœçœ®ã«ã€ããŠã次äžä»£ã®çæ»ã®ç¶æ
ãè¿ããçæ»ã®ç¶æ
ã¯ããã®äœçœ®ã®åšå²(8æ¹å)ã«çããŠããã»ã«ãããã€ãããã«ãã£ãŠæ±ºå®ããããã¡ãã£ãšåããã¥ããã®ã ããããã§ãã»ã«ã®8æ¹åã調ã¹ãããã«ã倿°tblã«çŸåšã®äœçœ®ããã®çžå¯Ÿåº§æšã代å
¥ããŠããããããŠãfor .. in .. æ§æã䜿ã£ãŠãå®éã®ã»ã«ãèšç®ããŠãçæ»ã®ç¶æ
ã確èªããã(ïŒ3)ã®éšåã§ã¯ãã¹ããŒãžã®å
šãŠã®ã»ã«ã«ã€ããŠcheck()颿°ã§æ¬¡äžä»£ã®çæ»ã確èªããã
ããã°ã©ã ã®(ïŒ4)ã®éšåã§ã¯ããŠã£ã³ããŠãäœæããå³åœ¢ã®æç»ãå¯èœãªãã£ã³ãã¹ãèŒããããã®ç¹ã«é¢ããŠã¯ãåå詳ãã玹ä»ããã
(ïŒ5)ã§ã¯ãæ¢åã®æç»å
容ãå
šãŠåé€ããåŸã§ãæ¹ããŠãã»ã«ãæç»ããããã®ãšããcreate_oval()ã¡ãœããã§ãèµ€ãåãæç»ããã
ãããŠã(ïŒ6)ã®éšåã§ã300ããªããšã«ãäžä»£ãé²ããã¹ããŒãžã®æç»ãè¡ããafter()ã¡ãœããã䜿ãããšã§ã宿çãªæç»ãè¡ãããã®ã¡ãœããã¯ã以äžã®æžåŒã§æå®ããã
[æžåŒ] msecããªç§åŸã«ã颿°funcãå®è¡ãã
win.after(msec, func)
ãŸãšã
以äžãä»åã¯ãã©ã€ãã²ãŒã ã®äœãæ¹ã玹ä»ããããããŸã§æ¬é£èŒã§ç޹ä»ããããã°ã©ã ãšæ¯ã¹ããšãå°ãè€éãããããªãããããã60è¡ä»¥äžã®ããã°ã©ã ãªã®ã§ãåéšåã®åœ¹å²ãæèããªããåæããŠã¿ããšè¯ãã ãããPythonã®åºæ¬ææ³ã®ç解床ã確ãããããšãã§ããã ããã
ãªããã¹ããŒãžäžã®ã»ã«ãèªç±ã«ããŠã¹ã§é 眮ã§ããããã«ããã©ã€ãã²ãŒã ãäœã£ãŠã¿ããããã°ã©ã ãé·ããªã£ãã®ã§ãå šããã°ã©ã ãæ²èŒããããšã¯ããªããã以äžããããŠã³ããŒãã§ããã®ã§ãèå³ã®ããæ¹ã¯ããã¡ãã確èªããŠã¿ãŠæ¬²ããã
ããã°ã©ã ã®ããŠã³ããŒã: lifegame-full.lzh
èªç±åããã°ã©ããŒããããã¯ãã©ã«ãŠãããã°ã©ãã³ã°ã®æ¥œãããäŒããæŽ»åãããŠããã代衚äœã«ãæ¥æ¬èªããã°ã©ãã³ã°èšèªããªã§ããã ãããã¹ã鳿¥œããµã¯ã©ããªã©ã2001幎ãªã³ã©ã€ã³ãœãã倧è³å ¥è³ã2004幎床æªèžãŠãŒã¹ ã¹ãŒããŒã¯ãªãšãŒã¿èªå®ã2010幎 OSSè²¢ç®è ç« åè³ãæè¡æžãå€ãå·çããŠããã

