-2 フロクラき作 3 ための環境き整えよっ ' 1 ^ hap 「 1 く保存〉をクリック ・催 P487. 望 ( u 、 t511 にめ n ( いび ea れー p hon -16.1 想 e ( 四 .0 (B) について行う作を選んでください . 場所 : p hon. 併 9 ・催 P 7. m 可部 ( u 、れに n 可 ( ね ( a れー せ -3.6.1. e のタウンロードが終了しました . lnstall Pyth ( い n Now Python 朝物 f 純に“れⅵ・ 0 「朝 00 “ ( u om にを端 b ・ 5 信 NO 物 0 名前を付けて保存 キャンセル 保存 く実行〉をクリック タウンロ - ドの表示 フォルタ - を開く 実行 らい・叩 く Customize installation 〉 をクリック - う C 511im in 、い a 転 51 python windows 団駅誂 unch 調リ ( 「“ on 町 0 d ) ロ Add 12n 3. い。 PATH ら曲い・叩 すべてオンになっていることを 確認 0 tional Features 物・・物 on dccumen いむ on 和を . 、虧 p•p. wh1Ch 30 download and tns Ⅱ 0 物 Python pa ( k ~ 0 ・ 5 い tkinter and the IDLE development Ⅵ「 onm 0 :. thon : ”い・ 5 い物を 5 nd d ーわ「 3 ッ 5 : 5 し色 物げせ都 u 費” ( 「 eq Ⅷ”・地 v ・ n ) 、 the Ob ・ py ・朝し nct 「 make it e35 に′に 5 い rt PythOn. python windows く Next 〉をクリック Advanced Options ロ 5 い u A55 。。載を物ー朝 h 12n ( 駅・ 0 代 cu ⅱ n ~ 曰 d hon にⅥ ronm ぎ ロき“ 0 。 tp ” 0 第館 ~ Ⅳ ロ d 」 99 ′当 m ロⅸ n 鼾ー ( 「し ir VS 2015 ( し om 辷・ jn め : 池 n ( し。 hts リⅥ ppD 駅叭 L 。へ P 「内「 3E5 、物。 n 、ら 36 ・ 。 w pgthon windows ・い 5 : らまい・叩 く Add Python tO environment variables 〉をオン ぐ nstall 〉をクリック
さくいん ・・ 1 1 乙 1 / 6 ・・ 205 float 型 float 関数 f 〇「文 F 「 ame() pack 関数 Photolmage() place 関数 p 「 int 関数 Python Python 3. x ドキュメント Python のインストール つんっ 0 1 ーっ 0 0 4 7 ′ つん・ 0 ′ 0 CO っ 0 1 ー get 関数 global 文 GUI ・・ 159. 180. 259 ・・ 52 if 文 import 文 lndentationE 「「〇「・ input 関数 inse 「 t 関数 int 型 int 関数 「 andint 関数 「 andom 関数 「 andom モジュ ール 「 and 「 ange 関数 「 ange 関数 「 eadline 関数 「 emove 関妛攵 「 eplace 関数 ・・ 2 1 9 ・・ 219 ・・ 219 ・・ 219 ・ 248 ・ 256 ・・ 152. 166 ・・ 86 ・・ 55. 204 ・ 44 ・・ 39 Label() lambda len 関数 List オプジェクト ・・ 68 ・・ 26 / ・・ 1 3 3 ・・ 251 self sleep 関数 so 「 t 関数 state st 「 ip 関数 st 「型 super 関数 SyntaxE 「「〇「・ ・・ 19 / ・・ 148 ・・ 25 / ・・ 256 ・・ 39. 256 ・・ 38 ・ 224 mainloop 関数 minsize 関委攵 ・・ 56 ・・ 58 NameE 「「〇「・ not ・・ 3 1 . 1 53 ・・ 102. 105 time モジュール title 関数 0 ・ 8 6 open 関数 option-add 関数 ・ 248 ・・ 69 ・ 1 02 2 / /
ルできるよっにす 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
2 つの条件を 1 つの if 文で書いてみよう 5 , OOO ゴールド未満でも 100 , 000 ゴールド以上でも勇者は志願してくれないという ことは、勇者が志願する条件は 5 , OOO ゴールド以上、 IOO,OOO ゴールド未満です。先 ほどの例では 3 つの分岐を作りましたが、これが勇者が志願するか志願しないかだけの ロジカルオペレータ 2 分岐であれば、たとえ条件が 2 つあっても論理演算子 (LogicaI Operator) を使って 1 つの if 文にまとめることができます。論理演算子は演算子を挟んで左右にある数値や式 の真、偽の状態をチェックして真または偽の状態を返す演算子です。 ☆論理演算子 演算子 and not 0 「 別名 論理積 論理和 論理否定 ー左右両方が真であれば真になる。それ以外は偽。 左右どちらかが真であれば真になる。両方とも偽のときは偽。 真を偽にする。偽は真にする。 オア and 演算子は日本語にすると「かっ」という意味で、 0 「演算子は日本語で「または」と ☆ not 演算子の働き ☆ 0 「演算子の働き *and 演算子の働き 図にすると次のようになります。 いう意味です。 not 演算子は否定なので「 ~ ではない」となります。それぞれの働きを ノット 0 「 not を . 102 not ′ニ
COLUMN 演算子の優先順位に注意 ! こまで比較演算子や論理演算子など、いくつかの種類の演篁子が出てきましたが、 れらには優先順位が決められています。たとえば「 num = x ☆ 7 + Y ☆ 3 」という式を書 いた場合、ます「 x ☆ 7 」と「 Y ☆ 3 」が先に計され、その結果が足され、最後に変数 num に 結果が代人されます。それは演篁子の優先順位が「☆」「 + 」の順番になっているからです。 優先順位が同し場合、たいていは左にあるものが優先して処理されます。 n u m 3 演算子の優先順位に したがって計算される く 2 の」といった具合に先に計算させたいものをカッコで囲んでください。 比較演篁子や論理演篁子の優先順位は下のほうなので、必要に応して「 ( x > 5 ) and (x 3 4 1 2 5 6 7 : x[index] 式結合またはタブル リスト 辞書、集合 添字指定 x[index:index] スライス操作 」 x(a 「 guments... ) 呼び出し x. attribute await X 属性参照 Await 式 べき乗 : 正数 〕負数 ビット単位 NOT 乗算 一行列の乗算 除算 除算 ( 切り捨て ) 剰余 加算 ー減算 8 9 1 3 1 4 1 6 1 7 < く lln ー not in ー iS not ー not X and 第一 else (lambda シフト演算 シフト演算 ビット単位 AND ビット単位 X 〇 R ビット単位〇 R 帰属検査演算子 帰属検査演算子 N 〇 T 同一性比較演算子 同一性比較演算子 N 〇 T 比較演算子 ( 小さい ) 比較演算子 ( 以下 ) 比較演算子 ( 大きい ) 1 比較演算子 ( 以上 ) 比較演算子 ( 等しくない ) 比較演算子 ( 等しい ) 論理演算 NOT 論理演算 AND 論理演算 OR 条件式 フ
4 - 2 もっと複雑な条件分岐に挑戦しよう COLUMN not 演算子とド・モル月ンの法則 先ほどの例は not 演算子を使うともっと簡単に書くことができます。 not 演算子は「 ~ の否定」という意味ですが、簡単にいい換えると「逆」「反対」という 意味です。「 5 , OOO ゴールド以上かっ IOO , OOO ゴールド未満」という条件の否定、つまり 「 5 , 000 ゴールド以上かっ IOO , OOO ゴールド未満の逆」です。 not 演篁子を使うと先ほど の例は次のように書き換えることができます。 de f bt n ( 1 i ( k ( ) : gold float(entry . get()) if not(gold > = 5000 and gold く 10000 の : text["text"] = ”志願者は誰も来ませんでした。 5 e r i h u ^ hap 「 4 e 15 e : . d e 1 e t e ( ” i 11 u s t " ) ( a n V a 5 . create_image(32@, 220 , image=img2, \ ( a n V a 5 tag="illust") text["text"] = " 勇者「よーし、私に任せなさい ! 」・ 5 e 「 i h u 「 5 , 000 ゴールド以上かっ 100 , OOO ゴールド未満」をカッコで囲み not 演篇子を先頭に 付けることで「 5 , OOO ゴールド以上かっ 100 , OOO ゴールド未満の逆」を表現できます。 れは「 5 , OOO ゴールド未満または IOO , OOO ゴールド以上」と同し意味になります。同様 、「 5 , 000 ゴールド未満または 100,000 ゴールド以上の逆」も「 5 , 000 ゴールド以上かっ 100 , 000 ゴールド未満」ということができます。図にすると次のような感しです。 not ( 5,000 ゴールド以上かっ IOO,OOO ゴールド未満 ) 5 , 000 ゴールド未満または 100 , 000 ゴールド以上 and 演篁子や or 演篁子を使った条件式に not 演鱆子を使うと、 and 演鱆子は or 演篁子に、 0 「演篁子は and 演算子に変わります。これを数学の世界ではド・モルガンの法則と呼ん でいます。プログラミングでも使える知識なので、覚えておいて損はないでしよう。 105
本番の戦闘画面き作成しよう一 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
6 章で鍵を拾ったときのことを思い出してください。マップデータを書き替えても d 「 aw ー map 関数を呼び出さないとマップの表示は更新されないのです ( P. 187 日召 ) 仕方がないので、 check ー move 関数で移動するたびにマップ全体を描き替えるよう変 更しましよう。 chap7. py @ 1 7 # 移動先のチェック @ 18 def check_move(), y): @19 global brave x, brave_y, flag_key if X>=@ and x く MAX WIDTH and y>=@ and y く MAX_HEIGHT: @2 1 map—data[y][x] P @2 2 @2 3 r e t u r n @2 4 e 1 i f p @2 5 flag_key = True @2 6 map—data[y][x] @2 7 ( a n v a s . d e 1 e t e ( " a 11 " ) @2 8 draw_map() @2 9 eli f p if flag_key @31 e nd i n g ( ) @3 2 @3 3 @ 3 4 @ 3 5 @3 6 @ 3 7 @ 3 8 @ 3 9 True.• e 1 5 e : r e t u r n el i f p > = 5 : fightmanager . fight_start(map_data, x , Y ) b r a V e X brave_y draw_map() # C a n V a 5 . ( 00 「 d 5 ( " b r a V e ” b 「 a v e x * 6 2 + 3 1 , brave y * 62 + 31 ) 00 00 0 モンスターが消えた 214 Chapter 0
論理演算子を使えば、比較演算子を使った複数の式をまとめて 1 つの式にすることが できます。 たとえば、すべての条件式の結果が真になったときだけ処理を実行させたい場合は次 のようになります。 ☆すべての条件式の結果が真の場合に処理を実行する if 条件式 1 and 条件式 2 and 条件式 3 実行する処理 また、条件式のどれか 1 つでも真になったときに処理を実行させたい場合は次のよう もっと複雑な条件分岐に挑戦しよう 4 - 2 Chap 帚「 4 に書きます。 ☆条件式の結果がどれか 1 つでも真の場合に処理を実行する if 条件式 1 0 「条件式 2 or 条件式 3 実行する処理 それでは今回のプログラムで使ってみましよう。褒美が「 5 , 000 ゴールド以上かっ 100 , 000 ゴールド未満」のときは勇者が志願する、それ以外は誰も来ないというプログ ラムは次のように書くことができます。 # ボタンクリックイベント関数 de f b tn ( 1 i ck ( ) : float(entry . get()) gold if gold > = 5000 and gold く IOOOOO: ( a n v a 5 . d e 1 e t e (" i 11 u 5 t ” ) canvas. create_image(320, 220 , image=img2' tag="illust") serihu text["text"] = " 勇者「よーし、私に任せなさい ! 」 serihu text["text"] = " 志願者は誰も来ませんでした。 sys_text . destroy() b u t t 0 n [ ” s t a t e " ] e n t r y [ " 5 t a t e " ] chap4-2. py @3 6 @3 7 @3 8 @3 9 041 @4 2 043 044 @4 5 @4 6 @4 7 else: ” d i 5 a b 1 e d " " d i 5 a b 1 e d " 103
動先をチェックする check ー move 関数を書き替えればよさそうですね。マップデータ が 5 以上のときに、あとで追加する fight ー sta 「 t 関数を呼び出すようにします。この関数 にはマップデータと座標を渡します。 chap7. py @ 1 7 # 移動先のチェック @ 18 def check_move(), y): @ 19 @21 @ 2 2 @2 3 @2 4 @2 5 @2 6 @2 7 @2 8 @ 2 9 @31 @3 2 @3 3 @3 4 @3 5 @3 6 @3 7 @ 3 8 global brave x, brave_y, flag_key if X>=@ and x く MAX WIDTH and Y>=@ and y く MAX_HEIGHT: map—data[y][x] P r e t u 「 n e 1 i f p flag_key True map—data[y][x] c a n v a 5 . d e 1 e t e ( " a 11 " ) el i f p > = 5 : r e t u 「 n e 1 5 e : e n d i n g ( ) if flag_key eli f p draw_map() ( a n V a S . C 00 「 d 5 ( ” b 「 a V e brave x * 62 + 31 , brave y * 62 + 31 ) brave_y b 「 a V e X fightmanager . fight_start(map_data, x, y) chap7fight. py に切り替えて fight-start 関数を追加しましよう。 p [ ace 関数を使って dialog を再表示します。 chap7fight . py @@ 1 210 Chapter import tkinter class FightManager: # コンストラクタ def ( 5 e 1 f ) : self . dialog . place(x=l@, y=l@) self . dialog tkinter . Frame(width=82@, height=434) C a n V a 5 height=434) tkinter.Canvas(seIf . dialog, width=82@,