プログラミングが難しいと感じる初心者はゲームを作ってみよう

独学法

ゲーム作り プログラミング

こんにちは。継続の錬金術士なおキーヌです。

ブログ毎日更新は87日目になります。

日々プログラミングをしていると、様々な言語を自然と使えるようになりました。

プログラミングに関しては意識して継続はしていませんが、続けているとできるようになるみたいですね。

プログラミングを世間一般的にみると難しいという部類に入るみたいですが
大抵の人はやらずにイメージで言っているか、入門したけど何をどう組めばいいのかわからないという人じゃないでしょうか。

プログラミングというのは、「お前らのプログラミング入門の勉強方法は間違っている」でも書いたように目的を持ってから分解して再構築しなければ身につきません。

覚えられる人はパッパと覚えられるのですが、なかなかプログラミングが身につかないという人は楽しんでプログラミングをしていないのが原因です。

では、楽しんでプログラミングをする方法はというと、タイトルにもあるようにゲームを作って見てはどうでしょうか?

いきなり複雑なゲームを作るのは厳しいですが、簡単なゲームならプログラミング入門者でも簡単にできてしまいます。

実際、私がプログラミングをしっかりと覚えようとした頃はそんな感じで覚えました。

この記事の内容
ゲームプログラミングは楽しくプログラム学習が出来る
プログラミングはアルゴリズムが超重要だということ
いきなり完成品を作るのではなく部品から作って完成品を作るということ
ゲームプログラミングの基礎はPONG GAMEから学ぼう

ゲームを作るとプログラミングが簡単になる理由

プログラミングは簡単

結論から言いますと、プログラミングを楽しみながら覚えられるからです。

これには脳科学が原因してるようでして、楽しいと感じるとβエンドルフィンという脳内麻薬が出て記憶力が凄まじく良くなるそうです。

逆に楽しくないと苦痛に思ったらノルアドレナリンというマイナスの物質が放出されるらしく覚えづらくなるそうです。

私は脳科学には詳しくありませんが、言われてみると今まで簡単に覚えられたなっていうのは全部楽しいことでした。

もう少し深掘りして見ましょう。

たとえば好きなゲームなら何時間でも(体力が続く限り)やってられますよね?

逆にどうしようもなくつまらないクソゲーだとよほどのマゾじゃない限りはすぐにやめてしまいます。

以上の行動からプログラミングは楽しい!と感じなければ身につかないのだと思います。

余談として、嘘でも楽しいと自分を錯覚させることができればそれだけで脳内麻薬は宝珠映されるらしいです。

人間の脳って不思議ですね。

私はそういう自分の体感したことを話されるとすごく興味を持ってしまいます。

っと、話が脳の話に逸れてしまったので話を戻しましょう。

例えば、面白くないエクセルを切り出したかのようなプログラミングをしても仕事感があってつまらないので、
どうせなら楽しみながらプログラミングを覚えましょうということです。

ゲームのプログラムなんて、仕事に役に立つの?と思われるかもしれません。

プログラミングは基本構文を組み合わせて、処理を作って、結果何をするということが多いので
その結果の部分だけを置き換えれば様々な応用が出来ます。

ゲームプログラミングで覚えたアルゴリズムを、業務上のプログラミングに使うことも出来ますし、
その逆で業務用のアルゴリズムをゲームの機能の一部として利用することも出来ます。

RPGのアイテムのせいとんはプログラミングの基本

ゲームでRPGをやっている人は、道具がたくさん増えて来たら「せいとん」という機能を使ったことはないですか?
カテゴリ順に並べたり、名前順に並べたり、フィールドで使えるアイテムだけを上に並べたりetc…

これはソート(並べ替え)というプログラムを利用しています。

エクセルでも数字の多い順安くない順(降順・昇順)を決めて並び替えられますよね。

数字を並べ替えたのか、アイテムを並べ替えたのかの違いなだけです。

基本的な仕組みは殆どいっしょなんですよね。

このようにプログラミングはアルゴリズムさえわかっていれば色々と応用が効きます。

なので覚えるのであればつまらない業務用アプリじゃなくて、
ゲームを作って覚えていくと、楽しくプログラミング学習ができるというわけです。

便利な関数ばかり使うと成長しない理由

JavaScriptは基本的にライブラリを使って作ることが多いので
用意された便利な関数をぽんぽん配置していくだけで凄いものが作れてしまいます。

そうすると、生産性は上がるかもしれませんが自分自身は成長しません。

車輪の再発明をするなとは言いますが、その車輪に問題が出た場合は
車輪を分解してメンテナンスできるようにならないとプログラマとは言えません。

関数を組み立てるだけなのは、それこそ私が何度も言っているように
プログラミングではなくスクリプティングに部類されます。

プログラマーとして成長したいのであればライブラリが無くても同じ機能を作られるようになっておいた方が良いでしょう。

もちろん、現場レベルになってくると車輪の再発明をしていては生産性が低すぎます。

なので勉強できる時間は車輪の再発明も経験しておいていざという時に対処できるようになっておくと良いです。

と、偉そうなことを言っている私も未だにスクリプター感が抜けないので戒めを込めています(笑)

ミニゲーム等、本編の一部だけを切り取って作ってみる

pong game

ゲームそのものを作ることはすごく難しいです。

プログラミングだけではなく、絵や音楽、シナリオ構成等々をが必要になります。

ですが面白いゲームの機能の一部(先ほどのアイテムソート等)を作るとか、
プログラミングだけで完成する簡単なゲームを作るとなると一気にハードルが下がります。

PONG GAMEは1度は作ってみるべき

最近のゲームセンターにまだ残っているのかわからないのですが、エアホッケーというゲームをご存知でしょうか?

平べったい丸い玉をパドル(手に持つ丸いラケット)でボールをはじいて相手のゴールにシュートするゲームです。

これをプログラミングで作ると、ゲームの基本的なことを一通り学べます。

球を跳ね返すだけのゲームなので綺麗な絵も素晴らしい音楽も濃厚なシナリオが無くても
プログラミングだけで作れてしまいます。

アメリカのゲーム企業「ATARI」が生み出したPONGというゲーム。
名前を聞いただけだと若い世代ではあんまり想像は尽きませんが、ゲーム画面を見るとすぐに理解できると思います。

PONG GAMEの作り方

コードを書くと長くなるので、言葉で簡単にPONG GAMEの作り方の説明をします。

必要な処理を箇条書きしてみましょう。

  • 打ち返す球の用意
  • 打ち返すためのパドル(ラケット)を2つ用意
  • お互いのゴールを用意
  • 球を動かす処理
  • 球がパドルや上下の壁にぶつかったときの処理
  • ゲーム開始時・ゲーム終了時の処理
  • 球がゴールに入ったときの処理
  • 点数の加算処理
  • 点数の表示処理
  • 一定の点数になったらゲーム終了に移行する処理

球を打ち返すだけの単純なゲームなのにこれだけの処理が必要になります。

うへぇ……って思うかもしれませんが1つ1つ見ていけば難しいことは特にしていません。

プログラミングは木を見て森を見ず精神がとても大切になります。

完成系は果てしなく先でも、チェーンソーで木1本切り倒すだけなら何ということはありません。

1つずつ何をすればいいか簡単に見ていきましょう。

打ち返す球の用意

プログラムで図形を書くことは容易です。

白い丸を画面に表示するだけ。
これで球が出来上がりました。

簡単ですね?

打ち返すためのパドル(ラケット)を2つ用意

丸い玉が作れたら、今度はそれを打ち返すラケットを作ります。

ぶつかってくれればいいので、単純に白い矩形(四角の図形)を2つ左右に描写するだけです。

これも簡単ですね。

お互いのゴールを用意

ゴールを小さくしてもいいのですが、面倒くさいので画面の一番左と一番右に
ボールが到達してしまったら相手の点数が1入るようにすればゴールの見た目は作らなくても大丈夫です。

ボールが一番左か一番右にきたら相手に点数が入るという処理を作るだけですね。

球を動かす処理

ゲームは1秒間に60回処理をループさせています。
1ループごとに座標を加算すれば、球が移動しているように見えます。

球がパドルや上下の壁にぶつかったときの処理

パドルに当たって跳ね返した時に、逆の符号にして座標に加算してあげると、反対に進んでいきます。

お互いのパドルに当たるたびに、進む方向を変更すると撃ち合いしているようになります。

ゲーム開始時・ゲーム終了時の処理

いきなりゲームが始まったり終わって強制終了されてしまっては困惑するので、
ゲーム開始の合図やタイトル画面、ゲームオーバーの表示を作ります。

球がゴールに入ったときの処理

球の座標が一定の位置に来た時にゴール判定を行います。
これは条件式を使えば簡単ですね。

点数の加算処理

ゴールに入った時の条件がこれですね。

球の座標が0より小さければポイントを加算する。

とう感じです。

点数の表示処理

点数を変数に格納しておけば、その変数を画面に表示させれば
点数が入るたびに変数が書き変わるので、画面に表示されている数字も変わります。

一定の点数になったらゲーム終了に移行する処理

これも条件式ですね。

点数を保持している変数を点数が入った時に監視しておきます。
一定の値以上になったら、どっちが勝ったかの文字を大きく表示すればゲームっぽくなります。

細かいソースコードは、何のライブラリを使うのかで変わってくるので
なにをやったらこのゲームを作られるかということだけを書きました。

単純なゲームであれば、こうやって1つ1つ処理を切り分けていき
1つ1つ実装していけばそのゲームになります。

そのあとに、こんな機能があったら面白いなっていう要素を足していけば
オリジナルゲームに早変わりです。

──まずは簡単なゲームから作ってみましょう。

そしてどんどん機能を付け加えてみましょう。
その際に使ったことのないライブラリや構文を使うとより成長できますよ。

それでは。