ひぐぺん工房トップへ おかげさまで28周年!

ひぐぺん工房(松浦健一郎・司ゆき) - HigPen Works
Follow @higpenworks
・今までの仕事 ・書籍 ・最近の業務 ・対応可能言語 ・お見積

『Pythonでつくる ゲームプログラミング入門』
Q&A

以下の回答で問題が解決しなかった場合には、 こちらから ご連絡ください。

補足


2021/01/10
Q.math.distでAttributeErrorが出る(Chapter2, p.60)
A.
エラーメッセージは「AttributeError: module 'math' has no attribute 'dist'」(属性エラー:mathモジュールには属性distがない)です。math.dist関数(p.60)はPython 3.8以降で追加された関数なので、Python 3.7以前で実行した場合には、このエラーが発生します。

解決するには、Python 3.8以降(本書ではPython 3.9を使用)をインストールし、Pygletを再度インストールしてから、プログラムを実行してみてください。インストールの手順はp.11~をご参照ください。

2021/01/21(2021/02/05加筆、2024/01/05加筆)
Q.ダウンロードファイルのダウンロード(Chapter1, p.19)
A.
ダウンロードファイル(download.zipおよびdownload_pipoya.zip)は、本サイトまたは出版社サイトからダウンロードできます(ファイルの内容は同じです)。ファイルを展開する詳細な方法については、Webで「zip 展開」などを検索してみてください。また、コマンドプロンプトやcdコマンドの詳細な使い方については、Webで「コマンドプロンプト cd」などを検索してみてください。

Windows 11/10における、ダウンロードファイルの展開とプログラムの実行について、以下に詳細な操作手順の例を記載します。本書p.19からの「プログラムの実行方法」とあわせてご覧ください。もし以下の操作手順でも上手くいかないときには、ファイルを展開する方法やコマンドプロンプトの使い方を、上記のようにWebで検索してみてください。

ダウンロードファイルの展開:
(1) エクスプローラでダウンロードファイル(download.zipまたはdownload_pipoya.zip)を開き、ファイルの中にあるフォルダ(downloadまたはdownload_pipoya)を選択した上で、Ctrl+Cキーを押してコピーします。
(2) エクスプローラでデスクトップを開き、Ctrl+Vキーを押して、フォルダ(downloadまたはdownload_pipoya)を貼り付けます。
(3) デスクトップにフォルダ(downloadまたはdownload_pipoya)ができたことを確認してください。フォルダがない場合は、(1)に戻ってやり直します。

コマンドプロンプトの起動とカレントディレクトリの変更:
(4) スタートメニューを開き、「cmd」と入力して、表示された「コマンドプロンプト」を起動します。
(5) 「C:\Users\ユーザ名>」のようなプロンプトが表示されることを確認してください。ユーザ名の部分は、お使いのユーザ名になります。表示されない場合は、(4)に戻ってやり直します。
(6) もしプロンプトの先頭が「C:」ではない場合には、「c:」とEnterキーを入力してください。プロンプトの先頭が「C:」にならない場合は、(4)に戻ってやり直します。
(7) コマンドプロンプトで「cd desktop\download」または「cd desktop\download_pipoya」とEnterキーを入力します。
(8) プロンプトの先頭が「C:\Users\ユーザ名\Desktop\download」または「C:\Users\ユーザ名\Desktop\download_pipoya」にならない場合は、「cd C:\Users\ユーザ名\Desktop\download」または「cd C:\Users\ユーザ名\Desktop\download_pipoya」とEnterキーを入力します。
(9) プロンプトの先頭が「C:\Users\ユーザ名\Desktop\download」または「C:\Users\ユーザ名\Desktop\download_pipoya」にならない場合は、(6)に戻ってやり直します。

プログラムの実行:
(10) 「python player_demo.py」とEnterキーを入力して、プログラムを実行します。プログラムが実行できない場合は、本書に沿ってPythonやPygletのインストールと動作確認を再度行ってください。

2021/02/23
Q.ステージを増やす(Chapter8, p.329)
A.
ステージを増やす改造について補足します。ステージをクリアしたときに、次のステージに進むには、以下のような処理を行います。

(1) 全てのキャラクター(自機や各種の装置など)を消去します。自機や炎などを消去する処理を参考に、全てのキャラクターについて属性lifeを0にします。
(2) 次のステージの地図を使って、キャラクターを生成し直します。変数mapに次のステージの地図を設定した上で、start関数を参考に、ステージ上のキャラクターを生成します。

Chapter9の射出ゲームでは、地図(map)は使いませんが、上記と似たようなステージクリアの処理を行っています。shot_demo.pyのstage関数(p.369)が、ステージの消去と生成の処理です。

上記は少し複雑な処理で、プログラムを切り貼りするだけでは正しく動かすことが難しく、Python言語に関する知識も多少必要になります。そこで、もう少し易しい方法を以下に紹介します。上記が上手く動かない場合は、以下の方法がおすすめです。

(1) 地図(map)を変更し、床で区切ったり、間隔を空けるなどして、一つの地図の中に複数のステージを作ります。最初はステージのスタート地点近くにゴールを配置しておくと、ステージクリアのテストがしやすいのでおすすめです。
(2) ステージをクリアしたら、自機の座標を変更して、次のステージのスタート地点に移動させます。これはplayer関数の中で、ゴールに到着したときに、自機の座標(xとy)に新しい値を代入するだけです。自機を消去したり生成し直したりする必要はありません。ここまで改造したら、ステージクリア時に自機が正しく移動するかどうか、確認してください。
(2の補足) 次のステージのスタート地点の座標を知るには、例えば地図上のスタート地点に、表示しないゴール(g)を配置しておきます。そして、start関数における「表示しない方のゴールの処理」の箇所で、このゴールの座標(m.x, m.y)をprint関数で画面に表示します。表示された座標をメモしておいて、(2)で自機の移動先として使います。
(3) ゴールの有効と無効を切り替える処理をやめます。地図では有効なゴール(G)だけを使い、player関数におけるゴールの有効と無効を切り替える処理は削除します。

上記の方法では、非常に広いステージを作ったり、数多くのステージを作った場合に、処理が遅くなる可能性はあります。速度を確認しながら、少しずつステージを広げてみてください。

より難しい改造に挑戦する場合には、Python言語を体系的に学ぶこともおすすめです。例えば、Python言語の入門書で気に入ったものを見つけて、読んでみてください。ひぐぺん工房の著作としては、以下のPython言語入門書があります。

2021/04/02
Q.コマンド入力(Chapter5, p.193)
A.
ゲームの難易度を上げるために、複数のキー(ボタン)を順番どおりに、しかも制限時間内に入力しないと技が出ないようにしてあります。

回答 入力のコツ

コマンドの例

格闘ゲームのコマンドはレバーで入力しやすいように書くことがあり、キーボードで入力する場合には少し分かりにくいかもしれません。このコマンド例では、以下の入力を順に行います。
  1. ↓キー
  2. ↓キーと→キーを同時押し
  3. →キー
ただし、サンプルプログラムではコマンドが暴発して出てしまうのを防ぐために、キー入力がまるでない状態が途中で生じると技が出ないようになっています。以下のように入力して頂くと、技が出やすくなります。
  1. ↓キーを押す。
  2. ↓キーを押したまま離さずに、→キーも押す。
  3. ↓キーを離す。→キーだけを押している。

質問 コマンドを入力しようとしても、敵の攻撃にやられてしまう…。

サンプルプログラム(input3.py)中、以下の数値(0.02)を小さくすると、敵の攻撃がまばらになります。例えば0.02を0.002などに書き換えると、コマンド入力の練習がしやすくなります。
変更前:
  def enemy(e):
    if random.random()<0.02:
変更後:
  def enemy(e):
    if random.random()<0.002:

対戦型ゲームのサンプルプログラム(input_demo.py)についても同様に、以下の数値(0.02と0.0002)を小さくすると、敵の攻撃がまばらになります。
変更前:
  def enemy(e):
    if random.random()<0.02+0.0002*score():
変更後:
  def enemy(e):
    if random.random()<0.002+0.00002*score():

質問 やっぱり、コマンドを入力しても技が出ない!

コマンド入力中に、制限時間を超えてしまっているかもしれません。サンプルプログラム(input3.py)の以下の数値(20)を、例えば60などに書き変えて、制限時間を長くしてみてください。
変更前:
  def start():
    add(player, image_player, 0.2, -0.7, 0, sy=0.3, input='0'*20)
変更後:
  def start():
    add(player, image_player, 0.2, -0.7, 0, sy=0.3, input='0'*60)

対戦型ゲームのサンプルプログラム(input_demo.py)についても同様に、以下の数値(20)を大きくすると、制限時間を長くできます。
変更前:
  def start():
    score()
    add(player, image_player, 0.2, -0.7, 0, sy=0.3, input='0'*20)
変更後:
  def start():
    score()
    add(player, image_player, 0.2, -0.7, 0, sy=0.3, input='0'*60)

キャンセル技入力の制限時間は、サンプルプログラム(input3.py、input_demo.py)の以下の部分で変更できます。数値(30)を、例えば60などに書き換えて、制限時間を長くしてみてください。
変更前:
  if p.state == 0 or p.state == 1 and p.time < 30:
変更後:
  if p.state == 0 or p.state == 1 and p.time < 60:

質問 コマンド技って何?

例えば以下の「Daigo the BeasTV」による動画では、開始後40分頃から、実際の格闘ゲームでコマンド技が出ているシーンが見られます。画面右端に並んでいるの矢印が、空手着のキャラクター(RYU)に対する入力です。上方の矢印ほど、新しく入力されたキーやレバーを表しています。例のコマンドが入力されると、青い火の玉(波動拳)が飛び出すのが見られます。このゲームでは、入力の左右を反転しても(→を←に置き換えるなど)、技が出ます。

YouTube:Daigo the BeasTV 9/9/2020 初心者講座 番外編 「トレーニングモード解説」


最終更新 2024/01/05
トップページへ
©ひぐぺん工房 禁無断転載
最新刊『Java[完全]入門』 
このサイトはリンクフリーです。
このサイトはChromeで動作検証しています。ブラウザにかかわらず表示に乱れがありましたらどうぞお知らせ下さい。メールを送る