Pythonでゲームイベントを実行後、元の画面への戻し方がわかりません。(place_forget関数)
Pythonの入門書で、
下記のプログラミング(①→②→③の順に実行する)
を写経中に、
②の段階で詰まってしまいました。
間違っているところがわからず、2時間経ってしまったので
どなたかコードに変なところがあればご指摘いただけると助かります。
よろしくおねがいします。
※該当書籍「12歳からはじめる ゼロからの Pythonゲームプログラミング教室」
サンプルコード(http://www.rutles.net/download/463/)
→この中の「chap7.py」と「chap7fight.py」のコードを使用します。
自分が詰まっているのはその途中過程においてですが、
サンプルには完成型のコードしかないためコード比較がしづらい状態です…
実行したいプログラミングの内容
①戦闘画面を前面に制作し、
デフォルトのマップ上でモンスターに遭遇するまでは、
戦闘画面は非表示にさせる。(これはできた)
②戦闘画面を表示して、「勝った」「負けた」のボタンのうち
「勝った」を押すと、戦闘画面を非表示にして
元のマップ上に戻る。
(この戦闘画面を非表示にすることができない)
③戦闘画面を表示して、「勝った」「負けた」のボタンのうち
「負けた」を押すとバッドエンドの別画面を表示させる。(これはできた)
※メインのコード(デフォルトのマップ画面)に、サブコード(戦闘画面)を読み込ませて制作するものです。
### 不審な挙動
②実行時、戦闘画面で「勝った」ボタンをクリックしたあとに
フリーズしてしまいます。
試しにtabキーを押してみたら
戦闘画面の横に、デフォルトMAP上の移動キーが表示され、
クリックしたらデフォルトMAPの画面に戻りました。
「勝った」ボタンのクリックだけで、デフォルトMAP画面に戻りたいです…
機能して欲しいコード
self.dialog.place_forget()
エラーメッセージ
エラーメッセージはありませんでしたが、 意図が反映されていません。
呼び出し側のソースコード(デフォルトMAP)
import tkinter import chap7fight #マップの描画 def draw_map(): for y in range(0, MAX_HEIGHT): for x in range(0, MAX_WIDTH): p = map_data[y][x] if p >= 5: p =5 canvas.create_image(x*62+31, y*62+31, image=images[p]) #主人公表示 canvas.create_image(brave_x*62+31, brave_y*62+31,image=images[4], tag="brave") #移動先のチェック def check_move(x,y): global brave_x, brave_y, flag_key if x >= 0 and x <MAX_WIDTH and y >= 0 and y < MAX_HEIGHT: p = map_data[y][x] if p == 1: return elif p == 3: flag_key = True map_data[y][x] = 0 canvas.delete("all") draw_map() elif p == 2: if flag_key == True: ending() else: return elif p >= 5: fightmanager.fight_start(map_data, x, y) brave_x = x brave_y = y draw_map() # canvas.coords("brave", brave_x*62+31, brave_y*62+31) #上ボタンが押された def click_button_up(): check_move(brave_x, brave_y-1) #下ボタンが押された def click_button_down(): check_move(brave_x, brave_y+1) #左ボタンが押された def click_button_left(): check_move(brave_x-1, brave_y) #右ボタンが押された def click_button_right(): check_move(brave_x+1, brave_y) #エンディング表示 def ending(): canvas.delete("all") canvas.create_rectangle(0, 0, 620, 434, fill="black") canvas.create_text(300, 200, fill="white", font=("MS ゴシック", 15), text=""" ゴールおめでとう。 だが、君の戦いはまだ始まったばかりだ。 ……つづく?""") #ボタンを無効化 button_up["state"] = "disabled" button_down["state"] = "disabled" button_left["state"] = "disabled" button_right["state"] = "disabled" #ウインドウ作成 root = tkinter.Tk() root.title("ダンジョン&パイソン") root.minsize(840, 454) root.option_add("*font",["メイリオ", 14]) #キャンバス作成 canvas = tkinter.Canvas(width=620, height="434") canvas.place(x =10, y =10) canvas.create_rectangle(0, 0, 620, 434, fill="gray") #ボタンを配置 button_up = tkinter.Button(text="↑") button_up.place(x=720, y=150) button_up["command"] = click_button_up button_down = tkinter.Button(text="↓") button_down.place(x=720, y=210) button_down["command"] = click_button_down button_left = tkinter.Button(text="←") button_left.place(x=660, y=180) button_left["command"] = click_button_left button_right = tkinter.Button(text="→") button_right.place(x=780, y=180) button_right["command"] = click_button_right #画像データを読み込み images = [tkinter.PhotoImage(file="12saipython/img6/chap6-mapfield.png"), tkinter.PhotoImage(file="12saipython/img6/chap6-mapwall.png"), tkinter.PhotoImage(file="12saipython/img6/chap6-mapgoal.png"), tkinter.PhotoImage(file="12saipython/img6/chap6-mapkey.png"), tkinter.PhotoImage(file="12saipython/img6/chap6-mapman.png"), tkinter.PhotoImage(file="12saipython/img6/chap7-mapmonster.png")] #マップデータ MAX_WIDTH = 10 MAX_HEIGHT = 7 map_data = [[1, 0, 1, 1, 1, 1, 1, 1, 1, 1], [1, 0, 0, 1, 2, 0, 6, 1, 3, 1], [1, 1, 0, 1, 1, 1, 0, 1, 0, 1], [1, 0, 0, 5, 0, 0, 0, 1, 0, 1], [1, 0, 1, 1, 1, 1, 1, 1, 6, 1], [1, 0, 6, 0, 0, 0, 0, 0, 0, 1], [1, 1, 1, 1, 1, 1, 1, 1, 1, 1]] #主人公の位置 brave_x = 1 brave_y = 0 #鍵取得フラグ flag_key = False #戦闘画面の準備 fightmanager = chap7fight.FightManager() draw_map() root.mainloop()
サブのソースコード(戦闘画面)
import
1 2class FightManager: 3 #戦闘画面 4 def __init__(self): 5 self.dialog = tkinter.Frame(width=820, height=434) 6 self.dialog.place(x=10, y=10) 7 canvas = tkinter.Canvas(self.dialog, width=820, height=434) 8 canvas.place(x=0, y=0) 9 canvas.create_rectangle(0, 0, 620, 434, fill="black") 10 #ボタン作成 11 winbutton = tkinter.Button(self.dialog, text="勝った") 12 winbutton.place(x=180, y=340) 13 #このコマンド↓がうまく作動してくれません。 14 winbutton["command"] = self.fight_win 15 losebutton = tkinter.Button(self.dialog, text="負けた") 16 losebutton.place(x=320, y=340) 17 losebutton["command"] = self.fight_lose 18 #モンスターに遭遇するまでは非表示にする 19 self.dialog.place_forget() 20 21 #モンスターと遭遇、戦闘画面を表示 22 def fight_start(self, map_data, x, y): 23 self.dialog.place(x=10, y=10) 24 self.map_data = map_data 25 self.brave_x = x 26 self.brave_y = y 27 28 #「勝った」を選択 29 def fight_win(self): 30 self.map_data[self.brave_y][self.brave_x] = 0 31 #このコマンド↓がうまく作動してくれません。 32 self.dialog.place_forget() 33 34 #「負けた」を選択 35 def fight_lose(self): 36 canvas = tkinter.Canvas(self.dialog, width=820, height=434) 37 canvas.place(x=0, y=0) 38 canvas.create_rectangle(0, 0, 620, 434, fill="red") 39 canvas.create_text(300, 200, fill="white", font=("MS ゴシック", 15), 40 text="""勇者は負けてしまった。 41 もう一度出直そう。""") 42
使用ツールなど
環境:Mac OSX
エディタ:Visual Studio Code
Python3.6.5
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/06/18 00:32
2020/06/18 07:30 編集
2020/06/18 10:17
2020/06/18 10:29