get - みる会図書館


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

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

get-atk 関数と get-dfs 関数を追加しましよう。今回の目的には「 andint 関数が向い ているようです。最小値は 1 か 0 、最大値は atk 属性か dfs 属性を使います。 ( 1 a 5 5 C h a r a ( t e 「 : 042 041 # キャラクターの親クラス chap7fight . py 043 @4 4 045 046 @4 7 048 # 攻撃力を求める def get_atk(self) : retu 「 n random. randint(l, # 防御力を求める def get_dfs(self) : return random. randint(O, self . atk) s e 1 f . d f 5 ) さらに残りの HP ( 体力 ) を計算する関数も追加します。この関数は相手の攻撃力と自 分の防御力を受け取ってその差を hp 属性から引いて返します。 hp 属性が O になったら chap7fight . py 勝負が決まったことになります。 046 @4 7 048 049 @ 5 2 @ 5 4 @5 5 @5 6 @5 7 @5 8 @5 9 # 防御力を求める def get_dfs(self): 「 e t u r n 「 a n d om . r a n d i n t (@ , # 体力計算 def culc_hp(self, atk, dfs) : 5 e 1 f . d f 5 ) dmg = atk # ダメージなし return self . hp # 体力を減らす self . hp self. hp i f 5e1 f . hp く 1 : self . hp 「 eturn self . hp 0 dmg これで Cha 「 acte 「クラスは完成です。テストしないままいろいろと追加したので、 のあたりで一回実行してエラーが出ないことを確認しておきましよう。 220

2. 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 = " 勇者ハル "

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

ボタンき押すと結果表示され 3 ようにしよっを 3 - 4 @3 9 # メインループ @41 root . mainloop() 1 番目の「テキストボックスに入力された文字を取り出す処理」は、テキストボックス オプジェクトの ent 「 y 変数に get 関数を使うことで取得できます 27 行目では get 関数 でテキストボックスの文字列を取り出し、変数 va [ に代入しています。 2 番目と 3 番目の処理は、 2 章で学んだコードと同じですね。 28 行目では変数 va [ の 文字列を、 float 関数を使って小数点を含む数値に変換しています。そして次の 29 行目 で、分を時間に換算しています。 この換算した数値を 3 つ目の吹き出しに書き込んでいるのが、 30 行目の命令です。 変数 answe 「には、 3 つ目の吹き出しに文字を置くラベルのオプジェクトが入っていま す。この変数 answe 「を操作することで、ラベルに表示する文字を変更することができ ます。ラベルの文字を変更するには、次のコードを追加します。 ☆ラベルの文字を変更する ラベルのオプジェクト [ " text ” ] = 文字列 「 = 」の右側では、変換した時間を st 「関数で文字列化し、「時間だね ! 」と結合すること で「〇〇時間だね ! 」という文字列を作っています。 本章で作るプログラムは、以上で完成です。プログラムを実行して、正しく動作するか 確認してみましよう。 ( hap 「 3

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

@7 9 081 self . hp 5 e 1 f . a t k = self . dfs これでキャラクターの準備は完了です。 chap7. py のほうで勇者のオプジェクトを 作ってみましよう。テストのために get ー atk 関数を呼び出しておきます。 chap7. py 111 116 1 1 7 118 119 12@ # 主人公の位置 b r a V e X 1 brave_y = @ brave = chap7fight . Brave() print(brave . get_atk()) # 鍵取得フラグ flag_key # 戦闘画面の準備 fightmanager chap7fight . FightManager() F a 1 s e 実行するたびに勇者の攻撃力が表示されます。乱数を使っているのでプログラムを実 行するたびに表示される攻撃力が変化するはずです。いつも同じ値が出る場合は、あな 222 0 勇者の攻撃力が表示される 1 PS C: \Users\ohtsu\Documents\python> python chap7. py 9 PS ( : \Users\0htsu\Documents\python> python chap7. py 19 PS ( : \Users\ohtsu\Documents\python> python chap7. py 2 PS ( : \Users\ohtsu\Documents\python> python chap7. py たはとてつもなくラッキーか、プログラムが間違っています。

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

マップ上にモンスターを配置し、それと重なると戦闘画面が表示されるようにしてみ ましよう。マップデータにはモンスターの位置の情報はなく、 O ~ 3 までが地面の情 報のために使われています。また 4 は主人公用です。そこで、モンスター用に 5 と 6 を 使うことにします。モンスター用の画像はく img6 〉フォルダーの中に用意しているので ( P. 171 参照 ) 、それを読み込むようにします。 にできません。 テストのために p [ ace 」 0 「 get 関数はコメントアウトしておきましよう。 [tkinter . PhotoImage(fi1e="img6/chap6-mapfield . png"), tkinter . PhotoImage(fi1e="img6/chap6-mapwall . png"), tkinter . PhotoImage(fi1e="img6/chap6-mapgoa1. png"), tkinter . PhotoImage(file="img6/chap6-mapkey . png"), tkinter . PhotoImage(fi1e="img6/chap6-mapman . png"), chap7fight . py 確認したら p [ ace ー fo 「 get 関数のコメントを外してフレームを非表示にします。 ロロ ′タンジョン & イソン 配置された 0 キャンバスとホタンが ロ X @ 1 6 @ 1 7 # 非表示 self . dialog. place_forget() マッフにモンスターを配置する chap7. py 088 # 画像データを読み込み @8 9 lmages @ 9 1 @9 2 @9 3 @9 4 png")l 208 Chapter tkinter . PhotoImage(file="img6/chap7 -mapmonster .

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

chap7fight . py @6 2 @6 3 @6 4 @6 5 @6 6 @ 6 7 @ 6 8 @6 9 @ 7 1 @7 2 @7 3 @7 4 @7 5 @ 7 6 @7 8 @ 7 9 @81 @8 2 @8 3 @8 4 @8 5 @8 6 @8 7 @ 8 8 # 戦闘処理 d e f d 0 t u 「 n ( 5 e 1 f , # 主人公のターン monster dfs brave_atk): self. monster. get_dfs() 0 i f b 「 ave a t k く 0 : labeltext = “勇者は力をためた” labeltext = " 勇者は攻撃した” self . label["text ” ] labeltext self . dialog . update() # 主人公の攻撃の結果表示 time . sleep(2) # 2 秒待ち b 「 ave atk monster dfs else: self . monster . culc hp(brave atk, monster dfs) labeltext labeltext + labeltext labeltext + " のダメージを与えた " # ラベル更新、残り体力表示 self . label["text"l self . dialog. update() time . sleep(2) # 2 秒待ち labeltext labeltext + \ else: labeltext ハ n 防がれた” ” \ n モンスターの残り体力は " + 5t「(5e1f . monster . hp) self . dialog . update() labeltext self . label["text"] ①モンスターの防御力を求める まず M 〇 nste 「クラスの get ー dfs 関数を呼び出してモンスターの防御力を求め、ローカ ル変数 m 〇 nste 「一 dfs に記録しておきます。 ②力をためる場合 引数 b 「 ave-atk が O 未満 ( 負の値 ) だったら、 labeltext に代入します。 「勇者は力をためた」というテキストを 234 ~ ′モンス 9 ー こ戦闘しよっ

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

本番の戦闘画面き作成しようを 7 - 4 阯戦闘の処理を作 3 う click_fight 関数と click- 「 ese 「 ve 関数の中身を書いていきます。戦闘処理のメインを 書く d 〇一 turn 関数も追加しておきましよう。 chap7fight . pys # 攻撃ホタン def click_fight(self): ” disabled" self . fbutton["state"l "disabled" self . rbutton["state"] self . do turn(self . brave . get_atk()) # 力をためるボタン def click_reserve(self): self . fbutton["state"l self . rbutton["state"l self . brave . reserve() 5 e 1 f . d 0 t u 「 n ( - 1 ) # 戦闘処理 def do turn(self, brave atk) : paSS click ー fight 関数では 2 つのボタンを無効化したら、 B 「 aveO ラスの get-atk 関数を呼 び出して主人公の攻撃力を求めます。 do ー tu 「 n 関数を呼び出すときは攻撃力を渡します。 click ー「 ese 「 ve 関数ではボタンの無効化後に B 「 ave クラスの「 ese 「 ve 関数を呼び出し て力をためます。 d 〇一 tu 「 n 関数を呼び出すときは、攻撃をスキップすることを伝えるた めに - 1 を渡します。 @ 5 1 @ 5 2 @ 5 3 @5 4 @ 5 5 @5 6 @ 5 7 @ 5 8 @ 5 9 @61 @ 6 2 @6 3 064 ” disabled" ” disabled" Chap 「 7 同しオフジェクトの 関数を呼ひ出すとせは 「 self. 」き忘れるなよ d 〇一 tu 「 n 関数では主人公のターンの処理から書いていきます。ラベルに表示するメッ セージはローカル変数 [ abe [ text に記憶し、戦闘が進むにつれて少しずつ追加されるよ うにします。 233

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

6 - 1 RPG のマッフき表示す 3 簡題出力デバッグコンソール著キ Fi1e "c:\Users\ohtsu\Documents\python\chap6. py", line 15 , in く module 》 images = [ImageTk. PhotoImage(fi1e-"img3\chap6-mapfie1d. png"), 、 Fi1e ・て : \Users\ohtsu\AppData\Loca1\Programs\Python\Python36-32\1ib\site-packages\PIL\ImageTk py", line 94 , in init _get_image_from kw(kw) Fi1e " ( : \Users\ohtsu\AppData\Loca1\Programs\Python\Python36-32\1ib\site-packages\PIL\ImageTk line 64 , in _get_image from kw return lmage. open(source) Fi1e "C:\Users\ohtsu\AppData\Loca1\Programs\Python\Python36-32\1ib\site-packages\PIL\Image. p y ・・ , line 2312 , in open = builtins. open(filename, ・・ rb") Fi1eNotFoundError: [Errno 2 ] No such file or directory: ・ img3\\chap6-mapfieId. png ・ 行 1 、列 1 スペース : 4 UTF-8 CRLF 物。 n ・ 0 ファイル名を間違えると F ⅱ eNotFoundE 0 「が表示される 阯マップデータを用意す 3 マップデータは map ー data という変数に記録します。横に IO 個、縦に 7 個並べるので、 それぞれ MAX WIDTH と MAX H 日 GHT という定数も用意しておきます。リストの定 義が長くなるので、内側のリストのあとのカンマのところで折り返しておきましよう。 ( hap 「 6 chap6. py マ X X 「 00t . mainloop ( )

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

「 7 - 3 主人公とモンスターのオフラエクトき作 3 う 阯力をためる機能を追加する このゲームでは「攻撃」と「力をためる」の 2 つの選択肢を用意し、「力をためる」を選 んだ場合は一回攻撃をスキップする代わりに、次の回の戦闘力が数倍にはね上がるよう にします。 1 回ためたら通常の攻撃力の 2 倍、 2 回ためたら 3 倍の攻撃力が出る可能性 があるわけです。 攻撃 力をためる 0 最終的に作る戦闘画面 そのための「 ese 「 ve 関数を Cha 「 acte 「クラスに追加します。力をためた回数を記録 する属性もほしいですね。全キャラクター共通ですから Cha 「 acte 「クラスにコンスト ラクタを定義して「 sv 属性を追加しましよう。 Chap 「 7 # キャラクターの親クラス 041 042 ( 1 a 5 5 C h a r a ( t e 「 : # コンストラクタ 043 def init_(self) : 044 self . 「 sv 045 1 # 力をためる @4 6 def reserve(self) : 047 se 1 f . 「 5 v = 5 e 1 f . 「 sv + 1 048 # 攻撃力を求める 049 @ 5 @ def get_atk(self): self . 「 sv @ 5 1 S e 1 f . 「 S V = 1 return random. randint(l, 5 e 1 f . a t k ☆「 ) # 防御力を求める @5 4 「 sv 属性の初期値は 1 にし、「 ese 「 ve 関数が呼び出されるたびに 1 増やします。 get ー atk 関数が呼び出されたときに「 sv 属性の値をローカル変数に取り出しておき、そ のときの攻撃力の最大値に掛けてクリティカルヒットが出るようにします。攻撃力を求 める際に「 sv 属性は 1 に戻すので、一回攻撃値を求めたら次は通常に戻ります。 試してみましよう。 223

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

@31 @3 2 @3 3 @3 4 @ 3 5 @ 3 6 @ 3 7 @3 8 @3 9 @4 G) @41 @4 2 043 044 045 046 @4 7 @4 8 @4 9 gold_text . place(x=33@, y = 42 の float(entry . get()) gold d e f b t n ( 1 i ( k ( ) : # ボタンクリックイベント関数 button . pIace(x=42@, y = 420 ) t k i n t e 「 . B u t t 0 n ( t e x t = b u t t 0 n # ボタン配置 " 決定 " ) if gold > = ( a nv a S ( a n V a 5 5 e 「 i h u 5 e 「 i h u else: 5000 : text["text"] = ”志願者は誰も来ませんでした。 text["text"] = " 勇者「よーし、私に任せなさい ! 」” . create_image(320, 220 , image=img2, tag="illust") . d e 1 e t e (" i 11 u 5 t つ # ボタンクリックイベントと関数の関連付け button["command"] b t n ( い ( k 「 00t . mainloop ( ) まずはイベント関数として btn_click 関数を作成します。イベント関数の中では、 「 ent 「 y. get() 」で入力ボックスから数値を取得して変数 go [ d に格納しておきます。この 変数 go [ d を使って条件分岐を作成していきます。 変数 go [ d の内容が、 5,000 ゴールド以上の場合は if 文のプロックの処理を実行し、そ れ以外の場合は e [ se 文のプロックの処理を実行します。 if 文のプロックの中の「 canvas. delete("illust") 」で画像を削除し、その次の行で勇者の画像を新たに表示しています。 e [ se 文のプロックではセリフ用文章を切り替える処理を実行しています。そして、最後 に button と button_click 関数を関連付けます。これを実行してみましよう。 ☆ de [ ete 関数の書き方 キャンバス . delete ( " タグ " ) 96