前回の迷路制作の記事投稿から7ヶ月程経っていたので、まずは思い出しがてらアルゴリズム[2]を実装しやすいようにアーキテクチャを見直していこうと思う。
全てのプログラムを各々関数にし、グローバル変数を使っていた部分は全体をクラスにすることで置き換えた。
次回以降からこれに肉付けをし、迷路アプリを作成していく。
copy
copied!
meiro.py
# このプログラムのみでは迷路で遊ぶことはできません。
#! /usr/local/bin/env python3
#! encode : -*- utf-8 -*-
import tkinter as tk
import random
import sys
class Meiro:
def __init__(self):
self.height, self.width = 23, 23
self.block_size = 25
self.pad = (3, 3)
self.meiro_width = self.width - 2
self.x0, self.y0, self.x1, self.y1 = 0, 0, 1, 1
self.xs = list(range(self.meiro_width+1))
self.ys = list(range(self.meiro_width+1))
# アプリの定義、起動
def meiro(self):
self.app = tk.Tk()
self.app.title("迷路")
self.app.geometry("530x530")
self.app.resizable(False, False)
self.canvas = tk.Canvas(self.app, width=525, height=525)
self.canvas.place(x=0, y=0)
self.x0, self.y0, self.x1, self.y1 = 0, 0, 1, 1
self.put_start()
self.put_goal()
self.put_block()
# [矢印キー] : 上下左右
self.app.bind("<Key-Left>", self.left)
self.app.bind("<Key-Right>", self.right)
self.app.bind("<Key-Up>", self.up)
self.app.bind("<Key-Down>", self.down)
# [a] : 答えの表示
self.app.bind("<Key-a>", self.answer)
# [Enter] : 迷路の再生成
self.app.bind("<Return>", self.reset)
# [ESC] : アプリの終了
self.app.bind("<Key-Escape>", self.quit)
self.app.mainloop()
# 迷路の生成
def make_meiro(self):
pass
# プレイヤーの左移動
def left(self, event):
pass
# プレイヤーの右移動
def right(self, event):
pass
# プレイヤーの上移動
def up(self, event):
pass
# プレイヤーの下移動
def down(self, event):
pass
# 壁を表示
def put_block(self):
pass
# 迷路の再生成
def reset(self, event):
self.canvas.delete("wall")
self.canvas.delete("answer")
self.x0, self.y0, self.x1, self.y1 = 0, 0, 1, 1
self.put_start()
self.put_block()
# ゴール到達時に迷路を再生成
def restart(self):
if(self.x0 == self.meiro_width - 1) and (self.y0 == self.meiro_width - 1):
self.canvas.delete("wall")
self.canvas.delete("answer")
self.x0, self.y0, self.x1, self.y1 = 0, 0, 1, 1
self.put_start()
self.put_block()
# スタート地点にプレイヤーを表示
def put_start(self):
pass
# ゴールの表示
def put_goal(self):
pass
# 答えの表示
def answer(self, event):
pass
# 壁に当たった時にアラートを鳴らす
def alert(self):
sys.stdout.write("\a")
# アプリの終了
def quit(self, event):
self.app.destroy()
# インスタンス破壊時にアプリも終了
def __delete__(self):
self.quit()
#! /usr/local/bin/env python3
#! encode : -*- utf-8 -*-
import tkinter as tk
import random
import sys
class Meiro:
def __init__(self):
self.height, self.width = 23, 23
self.block_size = 25
self.pad = (3, 3)
self.meiro_width = self.width - 2
self.x0, self.y0, self.x1, self.y1 = 0, 0, 1, 1
self.xs = list(range(self.meiro_width+1))
self.ys = list(range(self.meiro_width+1))
# アプリの定義、起動
def meiro(self):
self.app = tk.Tk()
self.app.title("迷路")
self.app.geometry("530x530")
self.app.resizable(False, False)
self.canvas = tk.Canvas(self.app, width=525, height=525)
self.canvas.place(x=0, y=0)
self.x0, self.y0, self.x1, self.y1 = 0, 0, 1, 1
self.put_start()
self.put_goal()
self.put_block()
# [矢印キー] : 上下左右
self.app.bind("<Key-Left>", self.left)
self.app.bind("<Key-Right>", self.right)
self.app.bind("<Key-Up>", self.up)
self.app.bind("<Key-Down>", self.down)
# [a] : 答えの表示
self.app.bind("<Key-a>", self.answer)
# [Enter] : 迷路の再生成
self.app.bind("<Return>", self.reset)
# [ESC] : アプリの終了
self.app.bind("<Key-Escape>", self.quit)
self.app.mainloop()
# 迷路の生成
def make_meiro(self):
pass
# プレイヤーの左移動
def left(self, event):
pass
# プレイヤーの右移動
def right(self, event):
pass
# プレイヤーの上移動
def up(self, event):
pass
# プレイヤーの下移動
def down(self, event):
pass
# 壁を表示
def put_block(self):
pass
# 迷路の再生成
def reset(self, event):
self.canvas.delete("wall")
self.canvas.delete("answer")
self.x0, self.y0, self.x1, self.y1 = 0, 0, 1, 1
self.put_start()
self.put_block()
# ゴール到達時に迷路を再生成
def restart(self):
if(self.x0 == self.meiro_width - 1) and (self.y0 == self.meiro_width - 1):
self.canvas.delete("wall")
self.canvas.delete("answer")
self.x0, self.y0, self.x1, self.y1 = 0, 0, 1, 1
self.put_start()
self.put_block()
# スタート地点にプレイヤーを表示
def put_start(self):
pass
# ゴールの表示
def put_goal(self):
pass
# 答えの表示
def answer(self, event):
pass
# 壁に当たった時にアラートを鳴らす
def alert(self):
sys.stdout.write("\a")
# アプリの終了
def quit(self, event):
self.app.destroy()
# インスタンス破壊時にアプリも終了
def __delete__(self):
self.quit()