たまこんブログ

学生×プログラミング→2020年3月ブログ開設!趣味の一環でPythonでつくったゲーム や自分が読んで役に立った 本、知識などを紹介しています!

 [Python]迷路プログラム用の新たなエディタを作ってみた

前に作ったプログラムの迷路プログラムの床パターンを作る新たなエディタを作ってみました。Excelで作り、Pythonに貼り付けるということをできるようにしました。

前回の迷路
tamakon3.hatenablog.com

メリット

  • Excelで作るため""を削除する手間がありますが、視覚的に作れるので見やすい
  • 貼り付けるのがそこそこ簡単にできる
  • 色んなパターンが作れる


ただし、全てTkinterで表せるのですが第一段階としてExcelでつくってみました。
f:id:tamakon3:20200606230346p:plain

実行結果

f:id:tamakon3:20200606230503p:plain
Excelで書いたものが、Pythonで簡単に表現できます

プログラム

import tkinter
import tkinter.messagebox
key = ""
def key_down(e):    #キーが押された時に行う処理
    global key
    key = e.keysym    #keysymには押されたキーの情報が入る
def key_up(e):      #キーが離された時に行う処理
    global key
    key = ""          #キーが離された時、キーの情報を空にする
mx = 1
my = 1
yuka = 0
yukanokazu = 0

def main_proc():
    global mx,my,yuka,yukanokazu   
    if key == "Shift_L"and yuka >1:   #左シフトキーを押し、2マス以上塗っていたら
        canvas.delete("PAINT")      #塗ったところを消す
        mx = 1                        #キャラクターを初期位置に戻す
        my = 1
        yuka = 0
        for y in range(7):
            for x in range(10):
                if maze[y][x] == 2:
                    maze[y][x] = 0
    
    if key == "Up"and maze[my-1][mx] == 0:    #upのキーが押されたら
        my = my-1                             #キャラクターのy座標を-20
    if key == "Down"and maze[my+1][mx] == 0:
        my = my+1
    if key == "Left"and maze[my][mx-1] == 0:
        mx = mx-1
    if key == "Right"and maze[my][mx+1] == 0:
        mx = mx+1
    if maze[my][mx] == 0: #移動したところが通路なら
        maze[my][mx] = 2 #リストの値を2にする
        yuka = yuka+1
        canvas.create_rectangle(mx*80,my*80,mx*80+79,my*80+79,fill="pink",width=0,tag="PAINT") #そこをピンクで塗る
    canvas.delete("MYCHR")  #一旦消す
    canvas.create_image(mx*80+40,my*80+40,image = img,tag = "MYCHR")#再度キャラクターの画像を表示

    if yuka == yukanokazu:
        canvas.update()
        tkinter.messagebox.showinfo("おめでとう!","全ての床を塗りました!")
    else:
        root.after(100,main_proc)

root = tkinter.Tk()
root.title("一筆書き迷路")
root.bind("<KeyPress>",key_down)    #keyが押された時に行う処理を指定。
root.bind("<KeyRelease>",key_up)    #keyが離された時に行う処理を指定。
canvas = tkinter.Canvas(width = 800,height = 560,bg = "white")
canvas .pack()


maze=[                      #床と壁を数値に置き換える。床を0、壁を1。Excelからのコピペをここの下に貼り付ける
	[1,1,1,1,1,1,1,1,1,1],
	[1,0,0,0,0,1,0,0,0,1],
	[1,1,1,1,0,1,0,0,0,1],
	[1,1,1,1,0,1,1,0,0,1],
	[1,0,0,0,0,1,1,0,0,1],
	[1,0,0,0,0,0,0,0,0,1],
	[1,1,1,1,1,1,1,1,1,1]
    ]
kabenokazu = 0
for y in range(7):  #yは0-6まで繰り返す
    for x in range(10):
        if maze[y][x] == 1:#maze[y][x]が1,つまり壁なら灰色の四角を表示させる
            kabenokazu = kabenokazu+1
            canvas.create_rectangle(x*80,y*80,x*80+80,y*80+80,fill = "skyblue",width = 0)   #
yukanokazu = 70-kabenokazu #Nmasuに70-yukanokazuを代入
img = tkinter.PhotoImage(file = "kk_100.png")
canvas.create_image(mx*80+40,my*80+40,image = img,tag = "MYCHR")
main_proc()
root.mainloop()

使い方

  • Excelで0(床)か1(壁)で書きます
  • 右下の赤いセルをコピーして、Pythonのエディタに貼り付けてください。
  • そのとき、""が入るので手動で削除してください

Point

  • Excelの条件付き書式でカラースケールで1と0の塗り分けをした。
  • Pythonに合うように数字の結合をした。

例)=CHAR(9)&"["&A1&","&B1&","&C1&","&D1&","&E1&","&F1&","&G1&","&H1&","&I1&","&J1&"],"

  • 各行の文字列を全部結合した。

例)=L1&CHAR(13)&L2&CHAR(13)&L3&CHAR(13)&L4&CHAR(13)&L5&CHAR(13)&L6&CHAR(13)&L7&CHAR(13)

  • ゴールの条件がマス目に合うようにしたので、どんな形でも対応できる。(従来30固定)

ダウンロード

こちらから、ファイル一式ダウンロードできます。Macで作ったので、文字化けしたらごめんなさい。
drive.google.com