よろしくお願いします。
今日のテーマなんですけど、RPGでプログラミングがほとんど学べる説みたいなのを
じょうさんがちょっと挙げてくれてたんですけど。
今回第13回目で、今活動の中でプログラミングの教育というか、
その勉強会というか、そういったところで皆さんに教えたりしているんですけど、
その中でも僕が結構大事にしているのは、何か作りながらプログラミングを学ぶっていうのが、
結構楽しいと思っているので、そういった会をやっていて、
その中でもRPGのバトルゲームっていうのを作るのがめちゃくちゃいいんじゃないかっていうのを思っているんですよ。
RPGのバトルのゲームって、プログラミングの参考書で学ぶ項目のほとんど全てを網羅できるっていうのを僕は思っていて、
それについての話を今回したいなと思っているんですよ。
そうなんだ。RPGとプログラミングが何か一緒なんだ。
一緒。RPGバトルゲームって、何がいいかっていうと、RPGの言葉がすぐ伝わるってところなんですよ。
皆さんも、例えばすまさんとか野川さんも、RPGバトルゲームって言ったら何をイメージします?
ドラクエ。
ポケモンですかね。簡単なところで。
両方とも、ゲームで有名なものを言ったらファイナルファンタジーとか、ポケモンとか、ドラクエとか、いろいろあると思うんだけど、
だいたい細かいところで見ると違うんだけど、ざっくりは共通しているシステムになっていて、
キャラクターで言うと味方複数人と敵が複数体いて、それぞれ単性でお互い交互に戦っていって、HPがなくなったらダウンするみたいな、そこら辺って全部共通しているじゃないですか。
それぞれの機能を、いざゲームを作るときに実装しようとしたら、実はプログラミングの教科書、参考書の全体を網羅する感じになるんですよね。
RPGゲームってキャラクターがいて、敵と味方がいて、それぞれ単性になっていて、交互に戦っていく。
で、HPがゼロになったらダウンするっていうような、この機能をRPGバトルゲームって一言で伝わるのがすごく便利、まずは。
なので、作りたいもののイメージができる状態で、プログラミングを学びながら一個一個実装していって、最終的に完成するっていうようなプログラミング学習の進め方っていうのを、僕はめちゃくちゃ推しているので、今回その話をしたいっていうことなんですよ。
学習がしやすくなるってこと?これを学べば。
めっちゃしやすい、自分にとってはね。っていうのも、今回画像を添付したいなと思ってるんですけど、よくあるプログラミングの学習する項目というか目次とかって見ると、
さらっと言うと変数だったり、プログラミングの条件分岐だったり、プログラミングの流れとか繰り返しだったり、配列とか関数とか文字列、C言語とかで言うとポインター構造体、ファイル構造だったり、あとはJavascriptとかそういったものだとオブジェクトっていうのがあったり、
そう一連の処理を連絡するっていう言い方をしてそれが関数名になったりするのね。
その関数ってすごいプログラミングの学習チックに言うと入力を受け付けて出力をする機能のことを言ってるんですよ。これちょっと難しいんだけど。
誰が受け付けて誰が出してるのそれ。
関数というものは関数の定義の話なんだけど入力を受け付けて出力をする機能のことを言うんですよ。
これ何かっていうと例えば関数の例としては敵にポケモンとかであるなんかひっかくっていうコマンドあったりするじゃないですか。
ひっかくっていう関数を作るときにどうするかっていうと例としては入力は攻撃力。ひっかくキャラクターの攻撃力を入力と受けます。
その入力を攻撃力に応じてかける何倍かみたいな感じのダメージが決まるわけ。
要は攻撃力高いもの高いキャラクターだったらダメージもでかくなるし攻撃力が低いキャラクターだったら低くなるしそれに応じて。
出力するのはダメージ、敵のHPみたいな感じ。
そしたらキャラクターの攻撃力を入力してそれに応じて敵にダメージを与えますよっていう出力する機能がひっかくという関数みたいな感じなんですよね。
けっこう難しいんだけど今の話は概念チックな感じでね。
そういう風に関数は自由に作れるんですよね。
複数の処理をまとめてやるってこともできるし、何か受け付けて何か出力するみたいな、そういう作り方もいろいろあったりするし、今のは一例なんで。
ただ、そうじて言えるのはコマンドとか攻撃とかそういうところに関数っていうのは便利なんで、そういうところに実装していくときのヒントになります。
次は4つ目っていうと、プログラミングの繰り返しっていう学習項目があるんですけど、これRPGゲームで言うと自分のターンが終わったら敵のターン始まるじゃないですか。
で、敵のターンが終わったら自分のターンまた始まるじゃないですか。
こうやってどっちかがHPが0になるまで勝敗が決まるまでずっと繰り返すじゃないですかゲームって。
それって繰り返し文使ってるんですよ。が便利。
イメージしてもらえると、敵のターンが始まりますっていう処理書くじゃないですか。
で、終わったら自分のターンが始まりますっていう処理書くじゃないですか。
その後また敵のターンを書くって、永遠と書くのって不可能というかめちゃくちゃ大変じゃないですか。
そうすると繰り返し文っていうものを使えば、敵のターンが終わって自分のターンが始まる。
それを繰り返してくださいっていうことを書くだけで終わるんですよ。3行ぐらいで終わるみたいなイメージ。
なるほど。ABCがあってCのところにCまで行ったらAに行きましょうっていうところを置いとくだけでそれが勝手に何回も繰り返されるような。
で、どちらかのHPが0になったら終わりですよというループを抜けるって言ったりするんだけど、その繰り返しをやめるよっていうような。
そういう感じで作れるので、繰り返し文、if文って言ったりとか、while文っていうのを使ったりするんですけど、そういったものは何かしら学べるっていうところ。
ここは分かりやすいですね、すごくね。
なるほど。ドラクエでルーラみたいな感じなのかな。ひゃーって飛んでいくみたいな、ここまでのワンセットで。
ドラクエってなんて言うんだろうね。
ドラクエってなんでしょうね。単純に相手の攻撃、こっちの攻撃みたいな感じの繰り返しってところですよね。
そう、ターンの繰り返し。
相手ターン、こっちターン。
ターンバトルみたいな感じ。
そう、終わりがない、なんなら。
追おうと押してずっと戦ってるみたいな感じ。
そんな感じかもしれないですね。繰り返すっていうのは、すごい厳密に言うと、敵と自分のターンを交互に自分が攻撃しました。
そしたら敵のターンになって敵が攻撃しました。それを一連としてずっと繰り返すじゃないですか、それを。
もしかしたら終わりがないかもしれないし、どっかで終わりが来るかもしれないけど、それを繰り返すっていうことになる。
ルーラっていうのはなんて言えばいいんだろう、ルーラはなんか飛ぶと、そこで一連が終わるイメージなのかな。
ルーラ、ポケモンで言うと穴抜けの紐ですかね。ダンジョウに入って戻りたい、それを使うとダンジョウの入り口まで戻ると。
ただ入り口まで戻ったらもうそこで終わりで、またもう一度そこの同じ繁盛に入って迷うところまで行ってまた戻るみたいな繰り返しはしないですから、
これは繰り返しには当てはまらないみたいな感じですかね、ルーラの場合は。
そうだね。ごめん、うまく説明できないから。
オートターンバトルみたいな感じ。
そんな感じ。繰り返しをするよって。他に例はないかなと思って。
相手のターンと自分のターンがどっちもHPが無限だったとしたら、延々に繰り返されるっていうふうなことですよね。
そう。ごめんねちょっと説明不足してたんだけど、例えば回数制限の繰り返しもできたりするんですよ。
そうなんだ。
5回繰り返すとかもできたりして、例えば毒状態になったら、だから5ターンは毒状態だから自分のターンになったらHPがちょっとずつ減るよみたいなシステムあったりするじゃないですか。
その時は繰り返し分とかも使えるかもしれない。
なるほどなるほど。
毒状態だからダメージを食らうっていうのを5回繰り返すみたいな。
ターン制っていうところには繰り返しっていうところの紐付けがあるよっていうところが4つ目ですね。
5つ目の話とかで言うと配列とかも学習項目とかにあったりするんですけど、
RPGのバトルって1対1の戦いもあれば複数対複数もあったりするじゃないですか。
キャラクターで言うと4人ぐらい味方がいて、敵も仕事はいたりとか、そういった時に便利なのが配列っていうのを使うことなんですよ。
キャラクターを1個作って、例えば味方のキャラクター1人作って、それをコピーして似たようなキャラクターをコピーする時に便利なのが配列っていうようなイメージなんですよね。
プレイヤー1を作れば2,3,4も配列で作れるし。
敵のキャラクターも1キャラクター作れば2,3,4の敵も作りやすいっていうような。
そういったところで配列はすごい便利になってくる。
だから同じ似たようなものを複数作る時に配列が便利だよっていうようなことです。
他の例で言うと、例えばフィールドのマス目ってあるじゃないですか。
あれ1個作れば大体配列でもう展開できるんですよ。
そういうこと?
いっぱい作れるみたいな。
配列って並列でコピーしていくイメージなんだ。
そんな感じ。
イメージ1つのフィールドのマス目を作りました。
それを配列でどんどん作っていって、それを繰り返しで作っていくみたいな感じなんだけど。
それで1つの大きなフィールドができるっていうような。
そんな感じのことがプログラミングで学べるというか、勝手にできるようになってるって感じ。
そういうイメージかな。
あとは例えば、ちょっと違うゲームにはなっちゃうんだけど、カードゲームで言うとデッキとかね。
1枚のカードを作ってあげて、それを例えばデッキで50枚ですとかだったら、
40個の配列を用意してあげれば1つのカードに対して。
そうやったらもうそれでデッキができるとか。
なるほど。
手札もそう。手札も5枚が手札ですってなったら、カード5枚の配列みたいな感じで。
結構配列ってすごいいろんなところで便利です。
なるほど。結構ゲームの根幹みたいなところがあるね、カードゲームだったら。
そうそう。
そうそう。っていうのがありますね。
次、6個目かな。
6個目とかね、ちょっとここからC言語独特の話になるんだけど、ポインタとか構造体とかってあったりするんですよ。
これ結構難易度の高いものというか挫折しやすいところの章ではあるんだけど、
構造体って便利なのはキャラクターの所持品とか、キャラクターっていった時にステータスHPMPだけじゃなくて、
装備品だったり所持アイテムとかあったりするじゃないですか。
そういったところにデータを紐付けてあげるときに構造体っていうのは便利だったりするんですよ。
データの紐付け?
そう。構造体もいろんな作り方があったりするんだけど、
例えばキャラクターの、一人勇者のキャラクターがいます。
その勇者が持っているアイテムは薬草です。
あとは装備しているものは剣です。
なった時に構造体っていうものを使ってあげると、変数って見た時に、例えば変数さっきで言うと勇者っていう変数があって、
装備品の変数とかいろいろあったりするけど、それを一括りで勇者が持ってますよっていうリンク付けをしてあげる時に構造体が便利なんですよ。
イメージで言うと薬草っていうのが例えばあるとするじゃないですか。
薬草っていうのは変数として定義してあげるけど、もっと分かりやすいのって勇者が持っている薬草って言った方が分かりやすいじゃないですか。
具体的になるじゃないですか。その時に構造体を使うんですよ。
勇者の薬草っていう変数を使えば勇者が持ってるっていう風に認識できる、
そういう言葉の定義の仕方がより具体的になるよっていうのが構造体のイメージ。
何々の何々みたいな。
そうそう。紐付けてあげる感じ、データをね。
オブジェクト思考の言語っていうのもあったりするんだけど、それもそういうイメージなんですよ。
オブジェクトっていうのはC言語ではないんだけど、例えばJavascriptとかCシャープとかだったらクラスっていうものがあったり概念があったりするんですよ。
そのクラスも人が持ってるこれみたいなイメージでデータの紐付けをしてあげることができる書き方という考え方になるんですよね。
なので構造体は所持品とかそういったところでは学べますよねっていう話です。
ポインターっていうところは正直RPGと直接的ではないんだけど、
ポインターっていうものは何かっていうとパソコンのメモリって分かりますかね。
メモリっていう記憶領域があるんですけど、メモリに直接アクセスしたりするのに便利なもので、
一方で言うと処理が早くなったりするっていう良さはあるんだけど、
僕はそれをポインターをうまくRPGバトルゲームで活用するときに使ってるのは、
コマンドで敵に全体攻撃をするときにポインターって役に立つんですよ。
全体攻撃はポイントなんだ。
ポインターを使える。
さっき関数の話したじゃないですか。
例えばひっかくというコマンドを関数に見立てて、
敵1にダメージ与えるよっていう関数の特徴としては一つの出力しかできないんですよ。
何が言いたいかというと、1個しか変えれないんですよ。
だから1個っていうと敵のHPにダメージ与えるってなったときに1人しかダメージ与えれないんですよ。
だけどポインターを使うと複数の出力ができるようになるので、
全体攻撃ができるようになるんですよ。
敵1のHP減らしたり、敵2のHPも減らしたりみたいな。
だから必殺技の搭載のときにポインターとか使えたりするんですよね。
そういったことを勉強会のプログラムの中では紐付けて学ぶ感じでやってますね。
あとは最後にセーブとロード。
そういったところはファイルの処理を扱うっていうプログラミングの学習項目でいうと、
ファイル処理っていうのがあるんですけど、
それはプログラムがあって1つの外部データ、外部ファイルですね。
セーブデータをインポートしてロードしたりとか。
そういったことをするのに役に立つというか。
そういったところが学べるっていうの。
ということで、結構長々とお話したんだけど、
全体としてRPGのバトルの中のそれぞれの機能って
プログラミングのこういった学習項目を学べるよねっていう話になります。
全部で今6つぐらいって言った?
ちょっと待って、おさらいさせて。
1個目が変数。
変数。
2個目が条件分野。
3個目が関数。
1つの家ができたりとか。
なるほど。
そう。
それを分解しているような形にはなるんだけど、
基本的なものでどんなものもだいたい作れるから。
もっと上級者になってくると、
処理時間を早めたりするために工夫した書き方したりとか、
もっと上手い使い方したりとか、
少ない行動量でたくさんのことできるとか、
そういうこともあったりするけど、
まずはそういう基本的なところから作れるものを作って、
自信持ってやるっていうのが、
それぞれこんなイメージで作れるよっていうのを実感してもらう。
それぞれこんなイメージで作れるよっていうのを実感してもらいながら、
学ぶっていうのが個人的には楽しくていいんじゃないかなって思った、
こういう紹介をしています。
なるほど。
あとすごい思ったのは、
基本的な構造、プログラミングって何っていう構造を理解してから、
作ると作り方も変わりそうだから、
配列とはこういうものみたいな概念をまず理解しておくっていうだけで、
ゲーム作りもすごくシンプルに
頭の中で組み立てて作れるようになりそう。
プログラミング学習も、
こういうコマンドを覚えるとかじゃなくて、
概念を覚えるっていうのが大事なのかなっていうのはちょっと。
そうだね。そこら辺のふわっとした理解、
結構大事だなって思ったのが、
例えば、てか以前も聞かれたんですけど、
プログラミング、とりあえず独学でちょろっとできるようになったけど、
これが仕事に活かせるかどうかとか、
必要的なレベルなのかどうかって不安な人結構いたりするんですけど、
そういった時によく話してるのは、
僕もそういった仕事をしたりはするんですけど、
例えばお客さんというかクライアントというか依頼主から、
こういうことしたいんだけど、
こういうアプリケーション作りたいんだけど、
これできるのかなとかっていうところから始まるじゃないですか、相談とか。
そういった時に、例えばやりたいこととかそういうもの、
例えばこういうRPGゲーム作りたいんだけど、みたいなこと言われたら、
イメージできるじゃないですか。
例えばそれぞれの単元で、
この機能、例えばこういう敵を用意したいとか、
こういうバトルシステムにしたいって言ったときに、
プログラムで言うと大体こういう配列とか使えば実装できるなとか、
そういうふわっとしたイメージで、
技術的に可能ですとか、できないので別の方法を探しましょうとか、
仕様変えていきましょうとか、そういう話ができるようになるじゃないですか。
だからふわっと全体理解っていうのも結構そういうところでは役に立つ。
仕事とかそういったところでは、
最初の技術的なに可能かどうかの話をするときとかに、
すごい便利だったりするんで。
なるほどね。上流の概念の話をして作っていくところですごい役立つ。
そうですね。っていうところもあるので、
イメージから入っても全然いいんじゃないですかね。
なるほどね。
むしろそこが結構重要になってきますよね。
この文字タゲ見せられても、やっぱりちょっと難しいなってイメージができないので、
ふわっとした概念的だからこそ、
他のものに置き換えて考えることができるっていうのを今思って、
さっき家って言いましたけども、