プログラムは小説などと同じ上達方法である、ということ

プログラムは小説などと同じ上達方法である、ということ

プログラミング学習では初めにwhileとかprintとか変数とか配列の使い方を学びますが、なんでこんなことをやるんだろう?と思う人は多いと思います。

誰か教えてくれる人がいれば違ったのかもしれませんが、私は独学でしたのでわけもわからずやって、「あ、これだけでゲーム、というかどんなプログラムも表現できる」と諒解したのはしばらく後のことです。

実際にどのように活用されるかがわからないうちに、英語のコードを打ち込んだり練習するのは辛いものでした。
でも、それが本当の意味で、コンピュータ上で何でもできるようになるパーツの一つだと知っていればもっと楽しく、早くものにできたと思います。

この記事ではまず私が初心者のころ知りたかった、教えてほしかったことである、コードを書くうえでどのように役立つか、を書いていきます。
私もまだあまり高度なことはできるわけではないので、考え方の紹介にとどめ、コードはあまり使わずに、ゲームのプログラムがどう流れているかをわかりやすく解説しようと思います。
最後に上達方法、ゲームが題材として最適な理由を書いていきます。

ゲームの流れ

まずは前提知識から。

ゲームにおけるプログラムの流れはズバリ、
{入力受付→処理→描画}のループ1
本当にこれだけです。じつに、単純です。高速で繰り返しているため動いているように見えます。

どんな複雑そうなゲームも、この流れに付け足しているに過ぎないのです。
ただあまりに付け足すことが多すぎるために、管理を簡単にしたり、制限を設けたりするためにオブジェクト指向や、数々の取り決めがあります。

ゲームだけでなく、あらゆるプログラムは、入力→処理→出力しかできないので、ゲームプログラムも同じです。ただ、高速なのです。

あまり信じられないかもしれません。少なくとも私は信じていませんでした(笑)。

例えば、ドラクエやFFなどのRPGを考えてみましょう。
マップを動いたり、戦闘をしたり、いやカーソルを動かすのだって、プログラムで習う基礎的な文章を使う場面があまり想像がつかないと思います。

教科書だけ見てもつまらないprintしかないですよね。
いかにも練習で、これしかできないという感じがしますが、その基礎だけで実際なんでもできるのです。

冒頭のループを当てはめてみましよう。

  • マップ上を移動するとは、描画の中心点―この点を中心にして、マップデータが読み込まれる―の座標を押されたボタン(入力受付)の方向に足す(処理)ことです。
    たとえば(100, 100)で上ボタンを押すと(100, 90)2になり、描画範囲がズレて動いているように見えます。
    主人公は常に中心点に描画されます。
    主人公そのものが動かず、マップが逆に動いている感じです。3
    移動するときには主人公のアイコン画像を少し違うものを交互に読み込むようにすると、より動いているように見えます。4

  • 戦闘をするとは、「たたかう」などコマンドを選択して、味方と相手のHPやMPを変更させるということです。
    自分の攻撃力、相手の防御力を処理してダメージを算出してからダメージの数字を文字で表示したり、ゲージを変化させます。

  • カーソルを動かすとは、方向キーを押すたびに数値を変化させ、その数値をもとに座標を決定し、選択中アイコンを描画するということです。
    決定ボタンを押したときは、その数値をもとに分岐し関数を実行します。

  • また、同じキー入力でも場面によって処理が異なります。
    あるときの決定ボタンは戦闘の命令を決定しますが、あるときには「話しかける」となることがあります。
    ループの最初に、ゲームモードの変数によって分岐を作り、入力に対する解釈を変化させています。

こう書くと、変数やループをどう使えばいいのか、今ならっていることがどのように役立つのか、なんとなくわかると思います。
実際はもっと複雑ですが、脇道が増えるだけで基本は同じです。まあ、その脇道の多さが難しいのですが…。

まとめ

ということで、外見は難しく見せていますが細かく見ると仕組みは単純です。
教科書を一通りやったあとは、それで簡単なゲームを作ったり、読んでみることをお薦めします。

読むときは、このゲームの基本の流れを頭に入れたうえでまずはデバッガーを使って流れをおさえるとよいと思います。デバッガー超便利です。

色々作ってみて本当にこれだけの言葉の組み合わせでゲームやプログラムになるんだ、とわかると上達は早いと思います。私はそこまでが長かったですが…。
おそらくですが、小説やシナリオ、美術、作曲や演奏も似たような上達過程をたどると思います。

つまり、実際に作っていくなかで上達していく種類のものです。
どういうわけか、それらは何か自分で作ってみる過程を必要としているように思います。
小説の書き方や作曲方法を学んでも、うまくできません。そもそも完成しない可能性すら高いです。

ということで、教科書を何冊やっても「小説を書くために文法を学ぶ」、「作曲するために楽譜を学ぶ」ようなもので、必要ではありますが生み出せるようになれるわけではないのです。
基礎知識は点のようなもので、それらをつなぐ線をまなぶことが必要、みたいなことも言えるかもしれません。

とにかく。それを使って、何を作るかを考えましょう。
どうしてこう、しつこいかと言うと私がそうだったからです(笑)。

「プログラミングできるようになりたい」と漠然と言っているうちはダメです。「~を作っている、やってるうちにいつのまにかプログラムできるようになってた」じゃないと。
「教科書→プログラムできる→何か作れる」じゃなくて「何か作る→プログラムできる」なんですよ!

とはいえ今はいいソフトウェアにあふれていて自家製ツールを使うような機会、必要性はないので、自ら手ごろな目標を作りだすことが必要です。
今ごろブラウザやメーラーを作りたいと考えてあまりワクワクもしないと思います。あまりに地味すぎる。
テキストエディターを作るのは最高そうですが、難易度は超高そうです。

そう考えると、ゲームはいい目標になると思います。手ごろで、ワクワク感もある。手近に慣れ親しんだお手本がある。
何か目標とするゲームを思い浮かべて、それを再現してみましょう。
それがなんであろうと、プログラムである以上は再現できるのです!ショボくなるとは思いますが!
つまったら、Githubでいろんなゲームのソースを覗いたり、教科書を利用しましょう。
あ、Git5の使い方は別で学んでおきましょう。心置きなくいじれるようになりますよ。

じつははここまで偉そうに書いた私も…再現している段階です。初心者は脱したと思いますが、まだまだ中の下です。追い越されそう。
それでは、健闘を祈ります。

サブ技術まとめ

学習=開発なので実際に開発で使われる技術を利用すると学習も捗ります。

  • Git

  • デバッガー
    pythonについてくるpdbとかありますが、なんかよくわかりませんでした。あまりに文字文字しい。
    統合開発環境のPyCharmには当然デバッガーもついているのですが、すごく使いやすかったです。行をポチポチ押せばブレークポイントを設定できます。コードを汚さない。
    特に設定なしで使えました。デバッガーというか開発環境のおすすめでした。

おすすめ書籍

  • ゲームプログラムの基本

  • オブジェクト指向
    途中にゲームの例(RPGのマップ)があって一石二鳥で参考になります。

脚注

  1. 1秒間に60回ループするというのが標準です。60fpsとか聞いたことあるのではないでしょうか。人間の目が判別できる限界で、これ以上細かくしてもあまり意味がないと言われています。
  2. プログラムの座標は、画面の右上が原点。
  3. 駅で電車に乗っていて、向こうで停車している電車が動いているのに自分の乗っている電車が動いているように感じる現象と同じ
  4. ファミコン『スーパーマリオブラザーズ』の容量節約の話は有名ですね。歩いているように見えますが、実際は画像を左右反転させているだけらしいです。別画像ですらないという、涙ぐましい努力。。
  5. バージョン管理システム。動かなくなってもいつでも元の状態に戻せるようになる心強い味方。多人数での開発専用だとなぜか思っていたが、一人でも普通に使いますよ!


貴島 大悟
WEB開発者