質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.51%

  • Python 3.x

    9841questions

    Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

pythonで迷路を作成中です。

解決済

回答 3

投稿

  • 評価
  • クリップ 0
  • VIEW 270

proTiku

score 1

前提・実現したいこと

pythonで迷路を作成したいです。

発生している問題・エラーメッセージ

line28, in draw_map
fill=color
UnBoundError: Local variable 'color' referenced before assignment
エラーメッセージ

### 該当のソースコード
from tkinter import *

tile_size  = 20

def load_map_data():
     from maze_data import data
     return data

def draw_map(cv, data):
    rows = len(data)
    cols = len(data[0])
    for y in range(rows):
        y1 = y * tile_size
        y2 = y1 + tile_size
    for x in range(cols):
        x1 = x * tile_size
        x2 = x1 + tile_size

        p = data[y][x]

        if p == 0: color = "white"
        if p == 0: color = "#404040"
        if p == 0: color = "red"
        if p == 0: color = "blue"

        cv.create_rectangle(
                x1, y1, x2, y2,
                fill=color,
                outline="black", width=2)

def create_window(map_data, events = []):
        win = Tk()
        win.title("迷路")
        rows = len(map_data)
        cols = len(map_data[0])
        cv = Canvas(win,
                    width=(cols * tile_size),
                    height=(rows * tile_size))
        cv.pack()
        draw_map(cv, map_data)

        for func in events: func(cv, map_data)
        win.mainloop()

if __name__ == "__main__":
    map_data = load_map_data()
    create_window(map_data)

ここに言語名を入力 python
ソースコード
```

試したこと

ここに問題に対して試したことを記載してください。

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • 退会済みユーザー

    2019/02/10 10:46

    複数のユーザーから「やってほしいことだけを記載した丸投げの質問」という意見がありました
    「質問を編集する」ボタンから編集を行い、調査したこと・試したことを記入していただくと、回答が得られやすくなります。

回答 3

checkベストアンサー

+1

https://teratail.com/questions/152316
とおなじプログラムでしょうか?

こんな風にしてみては?

color="yellow"
if p==0:color="white"
if p==1:color="#404040"
if p==2:color="red"
if p==3:color="blue"

現象を再現できるコード、データが不足しているので、これで解決できるかは確認をしていませんが。

データ読み取り部を コメントで提示されたデータでおきかえてみました。
また、 for x in range(cols): 以下のインデントが https://teratail.com/questions/152316 のプログラムとは異なっていたので、そちらと合わせました。
すると、迷路らしきものは表示されました。

from tkinter import *

tile_size  = 20

def load_map_data():
     # from maze_data import data
     data = [
          [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],
          [1,2,0,0,1,0,0,0,1,0,0,1,0,0,0,1,0,0,1],
          [1,0,1,0,1,1,1,0,0,0,0,0,0,1,0,0,0,1,1],
          [1,0,1,0,0,0,0,0,1,1,1,1,1,1,1,1,0,0,1],
          [1,0,1,0,0,0,1,0,0,0,0,1,0,1,0,1,0,0,1],
          [1,0,0,0,1,1,1,1,1,1,0,1,0,0,0,0,1,1,1],
          [1,0,1,0,1,0,0,1,0,0,0,1,0,0,1,0,0,0,1],
          [1,0,1,0,0,1,1,1,0,1,0,1,0,1,1,0,1,1,1],
          [1,0,1,0,1,0,0,0,0,1,0,0,0,1,0,0,0,3,1],
          [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]
     ]
     return data

def draw_map(cv, data):
    rows = len(data)
    cols = len(data[0])
    for y in range(rows):
        y1 = y * tile_size
        y2 = y1 + tile_size
        for x in range(cols):
             x1 = x * tile_size
             x2 = x1 + tile_size

             p = data[y][x]
             color = "yellow"
             if p == 0: color = "white"
             if p == 1: color = "#404040"
             if p == 2: color = "red"
             if p == 3: color = "blue"

             cv.create_rectangle(
                  x1, y1, x2, y2,
                  fill=color,
                  outline="black", width=2)

def create_window(map_data, events = []):
        win = Tk()
        win.title("迷路")
        rows = len(map_data)
        cols = len(map_data[0])
        cv = Canvas(win,
                    width=(cols * tile_size),
                    height=(rows * tile_size))
        cv.pack()
        draw_map(cv, map_data)

        for func in events: func(cv, map_data)
        win.mainloop()

if __name__ == "__main__":
    map_data = load_map_data()
    create_window(map_data)

イメージ説明

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/02/10 10:43

    color = "yellow"としても
    タイトルが迷路で黒色の一列しか書かれていないウィンドウが出てきました。
    どうすれば良いのか分かりません。

    キャンセル

  • 2019/02/10 10:52

    load_map_data() がどんなデータをかえしているかを調べる必要があります。
    こちらで再現できるだけのデータとコードを提示していただくか、
    map_data = load_map_data() 後の map_data の内容を提示してください。

    キャンセル

  • 2019/02/10 11:10

    こちらです。
    data = [
    [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],
    [1,2,0,0,1,0,0,0,1,0,0,1,0,0,0,1,0,0,1],
    [1,0,1,0,1,1,1,0,0,0,0,0,0,1,0,0,0,1,1],
    [1,0,1,0,0,0,0,0,1,1,1,1,1,1,1,1,0,0,1],
    [1,0,1,0,0,0,1,0,0,0,0,1,0,1,0,1,0,0,1],
    [1,0,0,0,1,1,1,1,1,1,0,1,0,0,0,0,1,1,1],
    [1,0,1,0,1,0,0,1,0,0,0,1,0,0,1,0,0,0,1],
    [1,0,1,0,0,1,1,1,0,1,0,1,0,1,1,0,1,1,1],
    [1,0,1,0,1,0,0,0,0,1,0,0,0,1,0,0,0,3,1],
    [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]
    ]

    キャンセル

  • 2019/02/10 11:58

    データ文をいただいたので、現象が再現できました。
    迷路らしきものが表示できるように修正してみたものを回答に追記しました。

    キャンセル

  • 2019/02/10 12:06

    丁寧な対応ありがとうございました。

    キャンセル

+1

エラーメッセージの意味がわからないという質問でしょうか?
colorという変数が、代入していないのに参照されていると言うことです。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/02/10 10:05

    どうすればエラーが無くなりますか。
    その理由も教えて頂けたら幸いです。

    キャンセル

  • 2019/02/10 10:50

    colorに代入すれば良いです。

    キャンセル

+1

draw_mapの中のp = data[y][x]p0以外の値が代入されるため、

        if p == 0: color = "white"
        if p == 0: color = "#404040"
        if p == 0: color = "red"
        if p == 0: color = "blue"


のどの行も実行されず、その結果、colorが初期化されないままfill=colorが実行されてエラーになるのだと思います。

p == 0の部分をどうにかするとうまくいくのではないでしょうか。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/02/10 10:39 編集

    p ==の値を順に0,1,2,3へ変化させたら
    タイトルが迷路で
    黒色の行が一行のみのページが出てきました。
    全て出現させるためにはどうすれば良いのでしょうか。

    キャンセル

同じタグがついた質問を見る

  • Python 3.x

    9841questions

    Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。