皆さんこんにちは。プログラミングと言ったらやっぱりゲームを作りたいとずっと考えている小幡です。
私はゲームを開発しようと試みては、何度も挫折してきました。その理由は単純で、ゲーム開発を0から100まで全て自分で行うことは簡単な事ではないからです。ゲームをプレイするのは簡単な事が多いですが、それを開発する立場となると課題の多さに気が付くことでしょう。
単純なロールプレイングゲームと言っても、ストーリー、グラフィック、コントローラー、キャラクター、アイテム、数値計算など・・・。作らなければないらないことがたくさんあります。それを全て作るのには膨大な時間が必要になることは容易に想像できます。
そこで今回は、ゲーム開発を進める上でつまづきがちな面倒な作業を極力ゼロに近づけつつ、私が個人的にプログラミング初心者でも入門し易いと考えるプログラミング言語のPythonでゲームを開発していきたいと思います。
本格的なゲームをより簡単な環境で作成するためにはUnityなどのゲームエンジンを使用するのが早いかもしれませんが、今回の目的はPythonの基礎を固めるということであり、その手段として楽しくゲーム開発をしてみるといった内容になります。
Pythonの環境と知識だけで、開発と遊ぶことが可能
プログラミングの基礎を見つけることを目的としています。
Pythonの入門を一通りやってみたが、何を作ったらいいかわからない人や、ゲームを作ってみたい人向けです。
Windows10、Python3.9、でのみ動作確認をしています。他の環境(mac/Python2.x)では動作しない可能性が高いです。
コマンドラインで動くRPGとは?
ここでいう、コマンドラインで動くRPGとは、windowsではコマンドプロンプトやPowerShell、macではターミナルを開き、その画面上で動作するロールプレイングゲームです。
PythonでゲームとググるとPygameが出てきて、2Dアクションゲームが簡単に作成可能です。しかし、簡単と言ってもPygameを使用するためのいくつかの関数だったり、画面を表示するだけでも画面の幅と高さはどのくらいか?閉じるための処理はどうするのか?と言った様に、今後実務で活用されることのないであろう知識が必要となります。
そういった基礎知識とは関係のない処理を学ぶ必要がないのが「コマンドラインで動く」ということになります。
まずは、起動からゲームクリアまでを流れに沿って完成予想のゲームの紹介をします。
もしあなたが、以下で行っているの処理がパッと頭に浮かぶのならば、既にPythonの基礎はしかりと見についていると思われますので、自分がやりたいこと、仕事にしたいことの応用的技術を磨いていく方が良いと思います。
1、開く
まずはPowerShellを起動します。
コマンドプロンプトでも動作しますので、どちらでも構いません。
本ゲームが格納されている「python_rpg」のフォルダ内に移動し、pythonでmain.pyを実行します。
遊びたいソフトを選択してスタートさせるイメージです。
実行方法などは後程紹介します。
2、タイトル
実行するとタイトルが表示されます。
「Enterを押してゲームスタート」とあるように、Enterキーを押すと、次の画面に遷移します。
もっとカッコいいゲームタイトルを表示させることが出来れば、プレイヤーの期待値を上げることができるかもしれませんね。
3、マップ
マップを表示させる前にゲームのルールを説明している画面を用意していますが、変更になる恐れがあるので割愛。
プレイヤーがフィールドマップに放り出される前に王様が「勇者よ、世界を救ってくれ」的な発言をするシーンがあると親切ですね。
ということで、マップが表示されます。
プロローグ(割愛)の指示にしたがって「ゴール(G)」を目指します。
4、マップ移動
画面上部の「操作方法」に従って「プレイヤー(P)」を移動させます。
「#」は壁を表しており、移動できません。
「薬」「盾」「剣」はアイテムを表しており、プレイヤーがアイテム上に移動するとアイテムを取得できます。
まだ3種類しかアイテムを作成していませんが、もっと増やすと面白いかもしれませんね。
5、バトル
マップを移動していると、モンスターに遭遇します。
モンスターと遭遇(エンカウント)するとバトル画面に遷移します。
バトル画面でも「操作方法」は変えずに、同じ操作方法を採用することで快適度向上を目指しました。
モンスターと遭遇(エンカウント)する確率は、ゲームにとって重要なポイントかもしれませんね。
6、コマンド選択
「上」「下」「決定」を使用し、コマンドを選択します。
「こうげき」「まほう」はプレイヤーの攻撃力に合わせたダメージをモンスターに与える事ができます。
「アイテム」は入手したアイテムを確認、使用することができます。
「まほう」も種類を増やせば面白いかもしれませんね。
7、アイテム
「e」キーでアイテムの確認、使用するこができます。
マップ上では無制限にアイテムを使用できますが、戦闘中はアイテムを一度使用すると、モンスターのターンに移り攻撃されてしまいます。
今回は武器と防具は使用するとメッセージが表示されるだけで、入手時にそれぞれ攻撃力と防御力が上昇しますが、「装備」するシステムを導入すると面白いかもしれませんね。
8、強敵の配置
ゲーム終盤、ゴールに近づくにつれてモンスターはどんどん強くなっていきます。
主人公もモンスターを倒すうちにレベルアップしていき、ステータスも上昇していきますが、それでもギリギリ倒せないくらいのモンスターも登場させます。
もっとたくさんのモンスターや、モンスターの攻撃方法を作る事ができれば、面白くなるかもしれませんね。
9、終盤
アイテムを回収しつつ、モンスターに遭遇しながら、ゴールまであと一歩のところまで来ることができました。
回収されたアイテムはマップ上から消えており、モンスターは強いモンスターが登場するようになっています。
マップもたくさん用意したり、他のキャラクターやストーリーを作れば、もっと本格的なゲームになることでしょう。
10、ゲームクリア
無事にゴールにたどり着くとエンディングです。
今回はストーリーがほとんどないので、「ゲームクリア」と表示させて終了となります。
ゲームが正常に終了し、コマンドラインの入力待ちの状態に戻っていることがわかると思います。
もちろんプレイヤーのHPがゼロになった場合も「ゲームオーバー」と表示され、ゲームは終了します。
プレイしてみる
百聞は一見にしかず。ということで、まずはダウンロードしてぜひプレイしてみてください。
以下のダウンロードボタンからzipファイルをダウンロードできます。解凍後、pythonで実行できればプレイできると思います。ブログの記事ではこちらのコードの内容となっていますので、こちらのバージョンがおすすめです。(バージョン2021_08)
GitHubにファイルをアップロードしていますので、お好きな形でダウンロードできます。(最新版)こちらは、最新版なので、これから解説する内容とは差異がありますので、ブログ記事とコードを見比べたい場合は、上のバージョン2021_08版をダウンロードしてください。
プレイ後に感想やバグ報告を頂けると嬉しいです!
もしも、「zipファイルの解凍方法」がわからない場合は、ここから先の説明は少し難しく感じる可能性があります。その場合はWindowsの操作方法入門から学習を進めていく方がスムーズかもしれません。
コード概要の説明
さて、ゲーム開発を進める前に、目指すコーディングの概要を先に説明します。よくわからない方は、飛ばしてすぐに開発するパートへ進んでもらって構いません。コードの量が増えてきて、少しみずらい・・・。整理したい!と思い立った時に取り掛かると良いかもしれません。
最終的な目標はパット見た時に読みやすい(可読性が高い)コード、後から機能を追加したいと思った時に簡単に実装ができる(保守性が高い)コードです。
読みやすいコードと改修しやすいコードは、似たようなものかもしれません。
個人開発の場合は、コードの量もそれほど大きくなる可能性が低いのでクラス設計を行わずにコーディングをしていても、問題ないかもしれませんし、変数名や関数名は自分自身しか目にしないので自由に命名してしまいがちですが、極力他人にレビューをしてもらう気持ちで1つひとつしっかりとコーディングを進めて行きたいと考えて居ます。
ファイルの概要
1つのファイルに1つのクラスを意識して作成しています。
main.py | ・main関数があります。 ・main関数はコマンドラインから呼び出された時にのみ、実行されます。 ・プロローグからプレイヤー作成、マップ作成、バトル開始、エンディングまでの流れ・メインループを管理します。 |
player.py | ・プレイヤーのクラスがあります。 ・プレイヤーは名前やHP、MP、レベルなど多数のパラメータを持ちます。 ・プレイヤーがインスタンスとして生成されてから、レベルアップ、アイテム入手の処理など、プレイヤーに関する処理を行います。 |
monster.py | ・モンスターのクラスがあります。 ・モンスターは名前とHPなどのパラメータを持ちます。 ・モンスターはプレイヤーがエンカウントするたびにインスタンス生成が行われます。 |
text.py | ・テキストのクラスがあります。 ・コマンドライン上で表示されるあらゆるテキストが格納されています。 |
map.py | ・マップとマップアイテムのクラスがあります。 ・コマンドライン上にマップを表示させたり、プレイヤーがマップを移動するための処理を行います。 |
buttle.py | ・バトルのクラスがあります。 ・プレイヤーがエンカウントした場合メインループからバトルのループに入り、選択された行動に応じた処理を行います。 |
process.py | ・プロセスのクラスがあります(※要再定義) ・プレイヤーからの入力や様々な処理を行います。 ※コントローラーの入力を受け付ける処理を担当するクラスでしたが、定義が曖昧になってしまっているので、再定義する可能性ありです。 |
event.py | ・イベントのクラスがあります(※要再定義) ・エンカウントなどのイベント処理を行います。 ※イベントの定義があいまいになってしまっているので、再定義する可能性ありです。 |
いざ、ゲーム開発スタート!
今回は総合開発環境(IDE)のVisual Studio Code(VSCode)を使用します。インストールなどの事前準備がまだ出来ていない方は、インストールをお薦めします。
まずはプロジェクトを格納するフォルダを作成します。
今回は、ユーザ名のフォルダ内に、python_rpgと言う名前のフォルダを作成しました。
任意の場所、任意のフォルダ名で構いません。
Visual Studio Codeで開く
Visual Studio Code(以下VSCode)を起動します。
[ファイル]→[フォルダーを開く]で先ほど作成したフォルダーを開いてください。
フォルダーを開くと以下の様な画面になりますので、左側の[新しいファイル]をクリックしてフォルダー内に新しいファイルを作成します。
ファイル名は[main.py]とします。
すると以下の様な状況になります。
そしてmain.pyの中で以下のコードを書きこみます。
def main():
print('Hellow, Game!')
if __name__ == '__main__':
main()
コードの説明です。
1行目:main関数を定義しています。引数はありません。
# 関数定義
def 関数名(引数): # 末尾にコロン
処理内容 # 先頭にTab、或いはスペース4つ
2行目:print関数で文字列を標準出力させます。
# print関数
print(任意の文字列) # 直接入力する場合は''(クォーテーション)で囲むことを忘れずに
5行目:IF文で条件分岐させています。
# if文
if 条件: # 末尾にコロン
Trueの時の処理内容
この条件分岐は詳しく見ていくと難しいかもしれませんが、最初の__name__というのは、main.pyがインポートされたときに付与される名前です
import main
とした場合の__name__は、’main’となります。IF文で’__main__’と比較していますが、これはコマンドラインから実行された場合に付与される名前です。
つまり、コマンドラインから実行された場合にだけTrueになります。
6行目:5行目でTrueだった場合(コマンドラインから実行された場合)はmain()を処理します。
つまり、以上のコードをまとめると、コマンドラインから実行された場合はmain関数が呼び出されて、print関数によって文字列が標準出力される。ということです。
コードを書き、ファイルを保存したら、早速実行してみましょう。
尚、main関数とif文は同様に処理内容を記述する際にTabもしくは4つのスペースを入れなければなりません。これはPythonの基本原則で他のプログラミング言語と違い、先頭のTabには意味があります。Tabが無ければコードとして成立せずにエラーになりますので注意が必要です。
最初のプログラミングの実行
VSCodeでコマンドラインを開いて実行するのが簡単です。
VSCodeはコマンドラインを[コントロール+j]で開くことができます。作業画面が二つに分割され、下の段に新しいコマンドラインが表示されると思います。
この時、最初に開いたフォルダーが現在のディレクトリ(カレントディレクトリ)になっていると思います。
最初に開いたフォルダーの場所にいることを確認したら以下のコマンドを書き、実行します。
python .\main.py
[python main] と記入した状態でTabキーを押すと、コマンドが補完され、正確なファイル名に変換されます。
そしてEnterキーで実行すると以下のようになります。
Hellow, Game!
print関数内に記入した文字列が出力されていることが確認できます。
これで、初めてのゲーム開発の第一関門は突破しました!
後は、ガシガシコードを書いていくだけです。
しかし、print関数だけでは、文字が出力されるだけで面白くありませんね。
次回はプレイヤーに入力を促してみましょう!
わからないは極力なくす
第一回ゲーム開発の記事はここまでです。長時間お付き合いいただきありがとうございました。
難易度はどのくらいに感じられたでしょうか?
Pythonのインストールがまだ済んでいない。という人にとっては何をやっているのか、さっぱりわからない内容になってしまったかもしれませんし、VSCodeを始めて使う人にとっては、フォルダーを開くことやファイルの作成で手間取ってしまったかもしれません。
もしかしたら簡単すぎて早く次に進みたいと考えているかもしれませんが、全ての学習者に言えることは、わからない事は極力なくすようにしておいた方が良いということです。
「わからないけれど、コピペして動いたから次に進もう」という考えで先に進んでしまうと、結局わからないところで壁にぶつかり後戻りせざるを得ない状況になります。これはとても時間の無駄ですし、仕事ではそのような癖が無くなっている状態で作業できることが望ましいと考えています。
分からないことがあれば、コメントや未経験からエンジニア転職を目指す人を応援するコミュニティを用意していますので、気軽に質問して頂ければと考えています。
それではまた次回、お会いできることを楽しみにしております。第二回目は以下リンクよりどうぞ