brave - みる会図書館


検索対象: 12歳からはじめるゼロからのPythonゲームプログラミング教室
28件見つかりました。

1. 12歳からはじめるゼロからのPythonゲームプログラミング教室

6 - 2 ホ 9 ンき押して主人公き動す ☆ C00 「 ds 関数の使い方 キャンバス . ( 00 「 ds ( " タグ " , x 座標 , y 座標 ) 同じようにさらに 3 つの関数を追加しましよう。 1 引くのではなく 1 足すになったり変 更する変数が b 「 ave ー x のほうになったりしますが、基本的な内容は同じなので、コピー & ペーストで書くと便利です。 chap6. py # 上ボタンが押された @ 14 def click_button_up() : @ 1 5 global brave_y @ 1 6 brave_y brave_y @ 1 7 @ 18 # 下ボタンが押された @ 19 def click button down() : global brave_y @21 @2 2 canvas . coords("brave ” @ 2 3 # 左ボタンが押された @ 2 4 def click_button left() : @2 5 global brave_x @ 2 6 brave X brave X @2 7 canvas . coords("brave" @2 8 # 右ボタンが押された () 2 9 def click_button_right() : global brave_x @31 brave X 十 1 brave X @3 2 canvas . coords("brave ” @3 3 @ 3 4 # ウインドウ作成 @3 5 「ボタン変数名 [ " c 〇 mmand " ] 」を使って関数をボタンに関連付けます。 1 brave y * 62 + 31 ) b 「 a v e x * 6 2 + 3 1 , ^ hap 帚「 6 b 「 ave ー y ☆ 62 + 31 ) brave x ☆ 62 + 31 , 1 b 「 ave ー y ☆ 62 + 31 ) brave x ☆ 62 + 31 , b 「 ave ー y ☆ 62 + 31 ) brave x ☆ 62 + 31 , chap6. py # ボタン配置 044 t k i n t e 「 . B u t t 0 n ( t e x t = @4 5 b u t t 0 n _up . place(x=72@, y = 15 の @4 6 b u t t 0 n up["command"l click_button_up button 047 t k i n t e r . B u t t 0 n ( t e x t = 048 b u t t 0 n down down . place(x=72@, y = 21 の e49 b u t t 0 n

2. 12歳からはじめるゼロからのPythonゲームプログラミング教室

click-button-up-vclick-button_right 関数を、 check_move 関数を使う形に書き 替えます。 b 「 ave_x と b 「 ave ー y の書き換えや表示位置の変更も check ー m 〇 ve 関数にま とめてしまったので、こちらはとてもシンプルになります。 chap6. py @ 2 1 022 @2 3 @2 4 @2 5 @ 2 6 @2 7 @2 8 @2 9 @31 @3 2 # 上ボタンが押された def click_button_up(): check move(brave x, brave_y-l) # 下ボタンが押された def click_button down() : check move(brave x, brave_y + 1) # 左ボタンが押された def click button left(): check move(brave_x-l, brave_y) # 右ボタンが押された d e f ( 1 i ( k bu t to n_r i gh t ( ) : check move(brave x + 1 , brave_y) マップの範囲内からはみ出さなくなったことを確認してください。うまくいったら今 度は岩の上に乗れないようにしてみましよう。 chap6. py @ 14 # 移動先のチェック @15 def check move(), y): @ 1 6 @17 @18 @ 1 9 @ 2 1 @2 2 @ 2 3 global brave x, brave_y if X>=@ and x く MAX WIDTH and Y>=@ and y く MAX_HEIGHT: map—data[y] [x] 「 e t u 「 n b 「 a V e X brave_y ( a n V a S . C 00 「 d S ( ” b r a V e ” brave x * 62 + 31 , brave y * 62 + 31 ) マップデータは map_data リストに記録されているので、移動先の位置の要素を取り 出します。その内容が 1 なら岩なので、「 etu 「 n 文で関数から脱出します。脱出すると その後の b 「 ave ー x と b 「 ave ー y を書き替える処理などが実行されないので、主人公は移動 しなくなります。

3. 12歳からはじめるゼロからのPythonゲームプログラミング教室

′タンジョン & バイソン 0000000000 0 0 四 0 を 0 00 000 0 0 0 4 つのホタンを配置 ロ よく見ると ちょっと違っつて、 まきらわしいですわね 0 ボタンから呼び出すイベント関数を作成します。ボタンが 4 つあるので関数も 4 つ書 きますがまずは 1 つ目の click_button_up 関数からです。 chap6. py @ 1 @ @ 11 @ 12 @ 1 3 @ 14 @ 1 5 @ 16 @ 1 7 @ 18 # 主人公表示 canvas . create image(brave x * 62 + 31 , image=images[4], tag="brave") # 上ボタンか押された def click button_up() : global brave_y brave—y = brave_y - 1 brave_y*62 + 31, canvas . (00「d5(“b 「 ave ” brave x ☆ 62 + 31 , b 「 ave ー y ☆ 62 + 31 ) 上に移動するということは、主人公の y 座標を記録している変数 b 「 ave ー y から 1 引く ということです。 b 「 ave ー y はグローバル変数なので、関数内で書き替えるために globa [ 文で使用を宣言しておきます。 キャンバス内に描画済みの画像を動かしたい場合は、 ( 00 「 ds 関数を利用します。主 人公の画像を表示するときに「 b 「 ave 」というタグを付けておいたので、それを第 1 引数 に指定し、第 2 、第 3 引数には x 座標と y 座標を指定します。 ズ 1 80

4. 12歳からはじめるゼロからのPythonゲームプログラミング教室

6-2 ホ 9 ンき押して主人公き動なす 移動範囲を制限する 主人公をいろいろと移動させてみると、大きな問題があることに気がつくと思います。 1 つは岩があってもそのまま進めてしまうこと、もう 1 つは画面の外に飛び出せてしま うことです。 ′タンジョン & バイソン 0 0 0 ーー今 0 今 0 00 00 00 ′タンジョン & バイソン ′タンジョン & バイソン 0 く←〉ボタンをクリック して左に移動すると岩に 乗ってしまい、さらに左 へ移動すると画面の外に 飛ひ出してしまう 移動するだけで移動先に何があるかチェックしていませんから当たり前ですね。主人 公の移動範囲を横は 0 ~ 9 の間、縦は O ~ 6 の間に制限し、移動先が壁なら移動をやめ させなければいけません。そのためには、主人公の座標である b 「 ave x 、 brave-y を書 き替える前に移動先をチェックし、問題なければ移動するようにします。チェック処理 を関数 4 つ分書くのも面倒なので、 1 つの check ー move 関数にまとめましよう。 《 hap 帚「 6 chap6. py # 主人公表示 brave_y*62 + 31, canvas . create_image(brave x * 62 + 31 , tag="brave") image=images[4], @ 1 @ @ 11 @12 @ 1 3 # 移動先のチェック @ 14 def check move(), y) : @ 1 5 global brave x, brave__y @ 16 if X>=O and x く MAX WIDTH and Y>=O and y く MAX—HEIGHT: @ 1 7 brave X @ 18 @ 19 canvas . (00「dS( ” brave" # 上ボタンが押された @2 1 この関数では移動先の x と y の座標を受け取り、それがマップの範囲内かを if 文で チェックします。範囲内なら b 「 ave-x と b 「 ave ー y に代入し、主人公の表示位置を変更し ます。 brave x ☆ 62 + 31 , b 「 ave ー y ☆ 62 + 31 ) 1 83

5. 12歳からはじめるゼロからのPythonゲームプログラミング教室

ルできるよっにす 3 ー 6 - 3 鍵き拾ってコー chap6. py # 主人公の位置 @ 7 8 b 「 a V e X 1 @ 7 9 brave_y = 0 # 鍵取得フラグ flag_key @81 @ 8 2 @8 3 e84 False draw_map() 「 00t . mainloop ( ) check ー move 関数に e ⅱ f 文を追加して、移動先が鍵 ( 3 ) だったら flag-key に T 「 ue を 代入します。 f [ ag ー key はグローバル変数なので、関数冒頭の globa [ 文で使用宣言してお きましよう。 ^ hap 言「 6 chap6. py @ 14 # 移動先のチェック 1 5 def check_move(), y): global brave x, brave_y, flag_key @16 and Y>=@ and y く MAX HEIGHT: @ 17 if X>=@ and x く MAX WIDTH @ 18 map—data[y][x] P @ 1 9 「 e t u 「 n @21 3 : flag_key @2 2 True @2 3 b 「 a V e X @ 2 4 brave_y @2 5 brave x * 62 + 31 , brave_y*62 + 31) これでフラグの設定はできましたが、重なっても鍵が消えないので拾った感じがしま せんね。マップ上から鍵を消すようにしましよう。鍵を描画するときにタグを付けてお いて消すという方法もいいのですが、今回は map_data を書き替えてから draw_map 関数を呼び出すという方法で鍵を消します。 chap6. py @ 14 # 移動先のチェック @ 1 5 def check_move(), y) : @ 16 global brave x, brave_y, flag_key if x>=@ and x く MAX WIDTH and Y>=@ and y く MAX HEIGHT: @ 17 1 87

6. 12歳からはじめるゼロからのPythonゲームプログラミング教室

本番の戦闘画面き作成しよう一 7 - 4 ( h ~ p7. - python ・Ⅵ Stu&•oCode ヘルプ ( H ) ファイル ( F ) 集 ( E ) 選択 ( 5 ) 表示 (V) 移動向 デバッグ py' 0 匚・ chap7. py X chap7fight .py image-images[4], tag-•・ brave") 15 16 17 物移動先のチェック MAX WIDTH: 19 def check move(), y): 18 global brave x, brave_y, flag_key 19 HAX HEIGHT: 7 if X>=e and x く MAX WIDTH and Y>=e and Y<MAX_HEIGHT: 29 map_data: [ [ 1 , ø, 1 , 1... p = map-data[y][x] 21 flag_key: True if p 第 1 : ト ( a れ as : <tkinter . Canva— retu rn draw map: <function d 「 .- elif p 24 ending: <function endi— fl ag_key 第 T rue 》 fightmanager: <chap7fi.- map-data[y][xl = 6 26 canvas. delete( " a11 つ 27 brave: く ( ト ap7fight.8 「 & - draw_map( ) 28 brave メ : 5 elif p = 29 if flag key = 第 True: 39 ・ウォッチ式 ending() 31 3 3 34 コールスタック 5 種 0 で一嚀に 3 5 ( lick button left 37 ( a11 38 imt_. py -12 〃ー 39 ma in 100P 40 ( h ョ p7. 物 24 ( mod リ le 〉 6 月◇〇 elif p 〉 = 5 : fightmanager. fight_start(map_data, x, め brave) brave X = X brave—y 第 y draw_map( ) # canvas . coords("brave" 上ホタンが押された brave x ・ 62 + 31 , brave_y*62 + 31 《 hap 市「 7 カンのいい人はここで気付いたかもしれませんね。 ending 関数を呼び出したあと、少 し先で d 「 aw ー map 関数が呼び出されています。つまり、エンディング画面を描画したあ と、それが更新される前にマップ画面を描画しているのです。そういえば P. 214 でここ に d 「 aw ー map 関数の呼び出しを追加したのでした。すっかり忘れていましたね。 ending 関数の呼び出し後に d 「 aw ー map 関数が呼び出されないようにするために、直 後に「 etu 「 n 文を追加してみましよう。 chap7. py eli f p if flag_key ending() 「 e t u 「 n @2 9 @ 3 @ @31 @3 2 @3 3 @ 3 4 T 「 u e : e 1 S e : 「 e t u 「 n もう一回プログラムを試してみると、今度はエンディング画面を見ることができまし 241

7. 12歳からはじめるゼロからのPythonゲームプログラミング教室

PS ( : \Users\ohtsu\Documents\python> python chap7. py Traceback (most recent ( a11 last) : line 115 , in く module> Fi1e "chap7. py" print(brave. get_atk( ) ) Fi1e " ( :\Users\0htsu\Documents\python\chap7fight. py" self . rsv r ・ Brave' object has no attribute ・ rsv ・ AttributeError : PS ( : \Users\ohtsu\Documents\python> 0 工ラーが出てしまった line 55 , in get_atk 「 Att 「 ibuteE 「「 0 「 : 'B 「 ave' object has no attribute ' 「 sv' ( 属性工ラー : B 「 ave オプジェ を呼び出したときに「属性がない」というエラーが出てしまったのです。 ん。 B 「 ave ワラスのコンストラクタでは「 sv 属性を追加していないので、 get-atk 関数 実は子クラスに同じ名前の関数を書いた場合、親クラスの同名関数は呼び出されませ のコンストラクタで追加したものが反映されていないということですね。 クトは「 sv 属性を持っていない ) 」というエラーが出てしまいました。 Cha 「 acte 「クラス chap7. py print(brave. get_atk()) brave chap7fight . Brave() chap7fight . py ( 1 a s s C h a 「 a ( t e 「 : def i n i t 5 e 1 f . 「 5 v 呼び出され (self) : 1 class Brave(Character): init_(self): def self . name = " 勇者ハル” この場合の基本的な解決策は、親クラスにアクセスできる supe 「関数を使って子ク ラスから親クラスの同名関数を呼び出すというものです。コンストラクタの場合は 「 supe 「 (). —init—(self) 」と書きます。 chap7. py brave chap7fight . Brave() print(b 「 ave . get_atk()) 224 chap7fight . py ( 1 a 5 5 C h a 「 a ( t e 「 : 自分で 呼び出す def i n i t 5 e 1 f . 「 5 v (self) : 1 ( 1a55 Brave(Character): init_(self): def init (self) super() . self . name = " 勇者ハル "

8. 12歳からはじめるゼロからのPythonゲームプログラミング教室

6 - 3 鍵き拾ってコールできるよっにする 阯コールに到着したときにフラクを判定する 次はゴールに到着したときに、鍵を持っているかどうかを判定して、持っていたらエン ディングを表示するようにします。工ンディング画面を表示する ending 関数はあとで 作ることにして、まずはゴールのチェックをしましよう。 check ー m 〇 ve 関数にまた e [ if 文を追加して、移動先がゴール ( 2 ) だったら、 flag_key が T 「 ue かどうかをチェックします。 T 「 ue だったら ending 関数を呼び出し、そうでな い場合は移動させないので「 etu 「 n 文で関数から脱出します。 chap6. py €) 14 # 移動先のチェック def check move(), y): @ 1 5 @ 1 6 global brave x, brave_y, flag_key i f x > =@ a n d x く MAX W I DT H @ 1 7 and Y>=@ and y く MAX H E I G H T : @ 18 map—data[y][x] @ 19 @ 2 @ 「 e t u 「 n @21 e 1 i f p @2 2 flag_key T r u e @2 3 map_data[y][x] @2 4 c a n v a 5 . d e 1 e t e ( " a 11 " ) @2 5 draw_map() eli f p @2 6 if flag_key @2 7 ending() @2 8 @2 9 @31 @3 2 @ 3 3 ^ hapter 6 e 15 e : 「 e t u 「 n b 「 a V e X brave_y brave x * 62 + 31 , brave y * 62 + 31 ) ending 関数を作成します。キャンバス全体を消去して黒い長方形を描き、その上に白 い文字でメッセージを表示します。 chap6. py 043 # 右ボタンが押された @4 4 def click_button_right(): 045 check move(brave x + 1 , brave_y) 046 1 89

9. 12歳からはじめるゼロからのPythonゲームプログラミング教室

本番の戦闘画面き作成しよう一 7 - 4 5 e 1 f . b 「 a V e X self . brave_y = Y self . brave b 「 ave @2 6 @2 7 @2 8 chap7. py @ 1 7 # 移動先のチェック def check_move(), y): @ 1 8 global brave x, brave_y, flag_key @ 1 9 if X>=@ and x く MAX WIDTH and y>=@ and y く MAX_HEIGHT: @21 map—data[y][x] @2 2 @2 3 r e t u 「 n eli f p @2 4 @2 5 flag_key = True map—data[y][x] @2 6 ( a n v a 5 . d e 1 e t e ( " a 11 " ) @2 7 draw_map() @2 8 e 1 i f p @2 9 if flag_key @31 ending() @ 3 2 @3 3 @3 4 @3 5 @3 6 @3 7 @3 8 Chapte 「 7 e 15 e : r e u r n e 1 i f p > = 5 : fightmanager . fight_start(map_data, brave) b r a V e X brave_y draw_map() 阯画面を作り替える FightManager9 ラスのコンストラクタに書いておいたテスト用の戦闘画面を大幅に 変更します。 chap7fight . py ( 1a55 FightManager: # コンストラクタ def init_(self): self . dialog @@ 5 @@ 7 t k i n t e 「 . F 「 a m e ( w i d t h = 82@ , height=434) 229

10. 12歳からはじめるゼロからのPythonゲームプログラミング教室

canvas . create image(brave x ☆ 62 + 31 , b 「 ave ー y ☆ 62 + 31 , @ 1 1 image=images[4] , tag="brave") @13 # ウインドウ作成 @ 14 b 「 ave-x と b 「 ave ー y にそれぞれ 1 と O を代入します。 chap6. py [ 1 , 1 , 1 , 1 , 1 , # 主人公の位置 041 brave X 042 1 043 044 045 046 draw_map() 「 00t . mainloop ( ) ′タンジョン & バイソン 0000000000 0 0 0 を 0 00 000 0 0 0 0 000000 0 0 0 0000000000 0 主人公が表示された 0 ウイントウ作成や画像の読み込みが ややこしいけど、要するにルーフで 規則正しく並べれはいいんだ。 われはカン 9 ン ! グ 0 ◆ ◆ 1 / 8