皆さんこんにちは。気が付いた時からテレビゲームに熱中し、人生の半分以上をゲームに費やしてきたと思う小幡です。
前回は以下の作業を行いました。
- Pythonがインストールされている
- VSCodeがインストールされている
- プロジェクトのフォルダが存在する
- VSCodeでプロジェクトのフォルダを開く
- プロジェクトに新規ファイルmain.pyを追加する
- main.pyに最初のコードを書き、実行する
何かをプログラミンで作る時は、開発環境の構築が最も退屈で難しい事だと思います。それが前回で全て完了しました。後は作りたいものを実現するために、Pythonの標準ライブラリ(最初から使える関数の集まり)を最大限駆使して開発を行っていきましょう。
この記事は第二回目の記事です。一回目の記事#1から読み進める事をお薦めします。
大まかな流れを決める
さて、準備は整ったのでこれから何をしていけば良いでしょうか?通常コードを書く前に、設計を行います。
設計と言っても手法はたくさんあり、今回はPythonのコードを書くことに注力したいのであまり深入りはしません。ですが、大まかな流れだけでも決めておいた方が、コードの進捗状況や、後は何を実装すれば良いかがわかるようになります。
前回作ったmain関数の中に、直接書いてみます。1回目に紹介したゲームの流れを、そのまま利用しています。
def main():
# タイトルを表示
print('=== Game Start! ===')
# マップを表示
print('マップが表示されました。')
# マップを移動
print('プレイヤーはマップを移動した!')
# モンスターとバトル
print('スライムがあらわれた!')
# バトルに勝利
print('スライムをたおした!')
# バトルに勝利
print('=== Game Clear! ===')
ここまで出来たら実行してみましょう。
以上の様に標準出力されたでしょうか?
このままでは一気に全て表示されてしまい、まったくゲームな感じがしませんね・・・。
そこで、メッセージの出力を1行ずつにし、さらにプレイヤーからの入力を受け付けてみましょう。
input関数
ここで登場するのがinput関数です。print関数が標準出力でinput関数が標準入力という捉え方で大丈夫です。(サンプルのコードではテスト用にEventクラスを作成したり、複雑なことをしていますが、いつか説明します。)
先ほどのコードでprint()を使用している箇所を全てinput()に置換してみましょう。
VSCodeでの置換は、[コントロール+シフト+h]で置換ウインドウが出ます。
上の行に検索文字列、下の行に置換される文字列を入力して、[すべて置換]をクリックします。(プロジェクト内の全てのファイルで置換されます)
置換できたらもう一度python_rpgを実行してみましょう。
するとどうでしょうか・・・?
一行表示されただけで、止まりましたね?
この状態でコマンドラインはキーボードからの入力を受け付けた状態になっています。
Enterキーを入力すると、次の行が表示されることがわかるかと思います。
勘が良い人は既に気が付いているかもしれませんが、今回作成するゲームはこのinput関数とprint関数で基礎が成り立っています。
このinput関数はプレイヤーからの入力を文字列型として受け取ります。この受け取った文字列型の値を変数に入れたり、関数で使用したりすることで入力に応じた様々な処理が可能になります。
プレイヤーの名前を入力して出力する
ここまでに使用したinput関数とprint関数を応用してみましょう。
input関数では、コマンドラインから入力を受け付ける事ができると同時に、受け取った文字列を変数に入れることが可能です。
# 入力された文字列を変数(player_name)に入れる
player_name = input('名前を入力してください')
ここまでを詳しく解説してみますと、input関数は先ほど紹介した通り、引数に文字列(上の例だと「名前を入力してください」)を入れる事で、コマンドラインに文字が表示されます。
「名前を入力してください」が表示された状態で、プレイヤーが文字を入力しEnterキーを押すと、その入力された文字列がplayer_nameと言う新しく作成した変数に入れられる、という流れです。
これでプレイヤーに自身の名前を入力してもらい、プレイヤー名を表示する準備ができました。それでは今まで作成したコードに新しいコードを追加していきましょう。
+演算子で文字列の結合
def main():
# タイトルを表示
input('=== Game Start! ===')
# プレイヤー名の入力
print('プレイヤー名を入力してください。')
player_name = input()
print('ようこそ、' + player_name + 'さん!') # '+'で文字列同士を結合できます
# 以下略
これでプレイヤーが入力した文字列を使い「ようこそ、〇〇さん!」の様に表示することができました。
format関数で文字列の結合
文字列は’+’で結合することができますがformat関数を使うことも多いので、こちらの例も載せておきます。
# format関数で'{}'波括弧の部分を変数で代入できます
player_name = input()
print('ようこそ、{}さん!'.format(player_name ))
# 'ようこそ、player_nameさん!' になるイメージです。
このformat関数は何が便利かと言うと、事前に'{}’波括弧を入れた文字列を別の場所で作れるということです。つまり代入される変数名がわからなくても、'{}’としておけば良いのです。
# 事前に波括弧入りのメッセージを作る
welcome_text = 'ようこそ、{}さん!
# プレイヤー名の入力
player_name = input()
# メッセージの表示
print(welcom_text.format(player_name))
以上の様に、事前に波括弧入りのメッセージを作成することができます。これで表示したいメッセージ関連の変数をたくさん用意したTextクラスを作成できるようになります。
Python3.9現在ではformat関数を使うよりも、文字列先頭に”f”を挿入して「print(f'{player_name}’)」と書く方が人気のようです。数字の丸め込みができたり、処理が速いらしいです。
同じmain.pyにメッセージ文を作成しても、動作は変わりませんし、あまりコードの量が多くない場合などはTextクラスは不要かもしれませんが、コードの見やすさと、改善させたいときに便利です。今回はPythonの基礎習得が目的ですので、クラスの作成にも慣れておきましょう。
クラスの作成は次回説明予定です。
自作関数を作る
ここまではprint関数やinput関数、format関数など、Pythonが最初から容易してくれている関数を使用して作業してきましたが、そろそろ簡単な関数を作ってみます。
関数と一言で言ってもとても奥が深いものですので、今回は次回に向けて表面をサラリとだけ説明します。
まずは下を見てください。パットみてわかる人は飛ばしてもらって構いません。
# 1,関数を定義
def show_text(text, player_name): # 引数にtext, player_name
print(text.format(player_name)) # formatしてprintする
まずmain関数でも見たように、最初にdefを付けることで、「関数を定義します」と宣言しています。ちなみに、defは、definition(定義)define(定義する)の略です。
次に関数の名前を決めます。今回はshow_textとしました。関数の場合は最初の単語に動詞を付ける方が読みやすいコードになりやすいです。パットみたときに「これは〇〇する関数だ」とわかると思います。show_text()であれば、「これは、textをshowする関数だ」とわかると思います。
引数は()の中に二つ、text, player_nameが入っています。引数の考え方は最初のうちは難しいと思うかもしれませんので、焦らずじっくりと理解していきましょう。関数を定義した時の引数は、「こういう値を入れてくださいね」と表しているにすぎず、まだ実態は挿入されていないことに注意が必要です。実態は関数を使用するときに挿入します。今はまだ宣言段階です。
そして最後に関数内での処理内容を記入します。今回は今までの復習でprint関数とformat関数を使用しています。これは先ほどまでと同じようにtextをplayer_nameでformatしてprintしているという処理になります。
ここで「textをformatしますよ」と宣言していますのでtextの実態は波括弧が入っている文字列でなければならないという制約ができました。
ここまでが、関数の定義です。
ここから関数を実際に呼び出します。
# 2、変数を定義
text = 'こんにちは、{}さん'
player_name = '村人'
# 3、上の1で定義した関数を呼び出します。
show_text(text, player_name) # 2で定義した変数を使う
コードの流れは1,2,3の順番で実行されます。
- 関数を定義
- 変数を定義
- 1の関数を呼び出す(引数に2の変数を使う)
3で関数が呼び出されることで、初めて関数の中の処理が実行されます。さらに実行される時に、3で挿入されたtext, player_nameが使用されることに注意が必要です。
これは、2で変数を定義していますが、上で例として示した文字列と全く別の文字列を定義することも可能です。
つまり、show_text()の引数には、特定の文字列を入れなければならない訳ではなく、様々な文字列を入れる事ができるのです。
簡単な関数を定義して、実際に呼び出してみて練習してみましょう。
まとめ
お疲れ様でした。第二回では文字列の標準入力から、出力、簡単な関数の定義と使用までを行いました。
input関数とprint関数は、このゲームの最初の一歩ですが、これから先何回も出番がありますので、とても重要な関数であることには違いありません。
そして簡単ではありますがinput関数で何かを入力するのは楽しいことだと思います。ゲームのコントローラーが手元のキーボードだと考えればブラウザ版のゲームではよくあるシステムだと思うので馴染みのある方も多いのではないでしょうか?
また最後に紹介した関数の定義と使用は、関数という重要の表面しか説明していません。まずは簡単ではありますが、これから難しい説明が始まるのだなぁくらいに考えて貰えればと思います。
次回はもうクラスの作成を行います。ここまでは少しスローペースに感じていた方もいるかと思いますが、一気に難しく感じることもあるかと思いますが、出来る限りわかりやすい記事を目指していきますので、次回も読んでいただき、何かのお役に立てれば幸いです。
ここまで長文をお読みいただきありがとうございました。次回に続きます。次回は以下リンクからどうぞ
以下のDiscordサーバでも質問を受け付けています。お気軽に声をかけて頂けると幸いです!