プチコン3号入門講座

プログラムが作れるようになるためには


まずは具体的なイメージから



 プチコン3号はネット上で様々なプログラムが公開されています。それを実行して終わるのではなく自分でもプログラムを作ってみたいという人が大半だと思います。プチコン3号を購入したあなたも「ネット上で公開されているプチコン3号用のゲームを遊びたい」という理由ではなく「自分でゲームを作ってみたい」という理由で買ったのではないかと思います。もちろん、「他の人が作ったゲームを遊んでみたい」という理由で買っても何ら問題はありませんが、遊んでいくうちに自分で作りたくなってくるかもしれません。

 プログラムを作るというのは慣れたら難しいことは何もないとはいえ、最初の頃は覚えることが多くそれで挫折してしまう人も少なくありません。例えばどんな命令があるのかとプチコン3号の公式サイトにあるリファレンスマニュアル(外部リンク)を見ると非常に多いし、最初のうちはマニュアルを見てもどういう意味か分からないと思います。
 これらたくさんの命令をすべて覚えないとプログラムを作れるようになれないのかというとそんなことはありません。

 というわけで、今回はプログラムが作れるようになるため方法について書いていきます。難しい命令とかは出てきませんので気軽に読んでください。

 最初にプログラムとは何かというと「プチコン3号で具体的に何をさせたいのかの指示を羅列したもの」です。現実で目にする機会のある「プログラム」というと「運動会のプログラム」がありますね。「徒競走」のあとは「大玉転がし」を行いそして「リレー」を行うみたいな感じの流れを書いたものです。
 基本的には運動会のプログラムと同じでプチコン3号のプログラムも処理の流れを記述するだけです。しかし、プチコン3号はコンピュータであるため曖昧な指示なのに人間の意図を汲み取って実行するということはできないのです。つまり、プチコン3号が理解できる形の具体的な指示をする必要があります。それを記述したのがプチコン3号のプログラムというわけです。

 まず、プログラムを作れるようになるためには「作りたいものがある」というのが必要不可欠になります。そして、それを出来るだけ具体的にイメージできることが重要になります。何だかよく分からないものは作ることができないし、つまづいて誰かに質問する際にも自分自身で何をやっているのか分からないので回答者も困ってしまうためです。そもそも、自分が何を作りたいのかが明確に分からないとプチコン3号に「こうしなさい」と具体的な指示を出すなんて不可能です。
 そして、「作りたいものがある」ということが、プログラムを作るための原動力となるためです。人に勧められたものを作るよりも自分が作りたいものを作る方が何倍もやる気が出ることでしょう。最初のうちはよく分からないことが多いので投げ出したくなることがあるかもしれませんが、人に勧められたものであれば「これを作らなくても良い」と簡単に投げ出してしまう恐れがあります。「これでいい」ではなく「これがいい」というものを作るべきなのです。

 「初心者はどんなプログラムを作るのが良いですか?」というのは良く見かける質問ですが、上記のようなことがあるため私は「自分が作りたいものを作りなさい」と答えるようにしています。
 では、「作りたいゲームはどんなゲームですか?」と逆に質問すると恐らく「マリオみたいなゲーム」「ドラクエみたいなゲーム」「マイクラみたいなゲーム」という感じで市販のゲームを模したものを作りたいという人も多いでしょう。すでに存在するものを真似て作るということに対して抵抗がある人もいると思いますが、上達するためには真似から入ることは非常に有用です。そして、それが自分の活力になるならば何ら問題ないと私は思います。最初からオリジナリティの高い作品を作ることを求めていく必要はありません。(ある程度プログラミングのスキルが高くなると「無い物は作る」という感じで市場にないものを作ったり、「あっても作る」という感じで市場にあるものに不満を感じている場合にそれが解消できそうなものを作ることが活力になる場合もある)

 作りたいものが具体的に分かる(プチコン3号にどのような指示を出すのかが具体的に分かる)となればそのプログラムを作るのに必要な命令も限られてきます。つまり、上記のリファレンスマニュアルに書いている命令をすべて覚えようと丸暗記するということは必要な英単語が限られている状態で辞書を丸暗記しようとするくらい無意味なことが分かるでしょう。
 すべての命令をいきなり覚えようとするのではなく必要な命令を必要になったときに覚えるのが一番ということです。普通の人は今必要と分かっているものならば身に付きやすいけどいつ必要になるのか分からないものだと理解も中途半端になって時間の無駄にさえなりかねません。つまり、この講座も「今必要」と感じている部分はじっくり読んで「今必要ではない」と感じた部分は軽く流して読めば良いのです。とはいえプチコン3号で初めてプログラミングに挑戦するような人だとまずはある程度基本的な命令(表示命令、入力命令、分岐命令、繰り返し命令、条件判断命令のうちの代表的なもの)の使い方程度は知っておく必要性があるかもしれません。
 どんな複雑なプログラムであっても表示、入力、分岐、繰り返し、条件判断、計算処理の積み重ねによって出来ているのです。プチコン3号は表示だけを見てもコンソール、グラフィック、スプライト、BGなどの画面モードがありそれぞれに対しての表示命令があるし入力命令もボタン入力、スライドパッド入力、ジャイロセンサー、モーションセンサーによる入力、マイク入力など様々なものがありすべてを覚える必要はありません。必要に応じて使える命令を1つずつ増やしていくようにするのがプログラムを作れるようになるための近道になります。

 やはり、具体例を出さないと上記のものが伝わりにくいですね。
 例えば「ドラクエのようなRPGを作りたい」とします。そのために必要な要素として下記のようなものがあります。


【 ドラクエタイプのRPGを作るために必要な要素 】

フィールドの移動
全体のフィールド移動だけではなく町やダンジョンでの移動も含む

敵との戦闘
詳しくは後述

各種イベント
町の人々との会話や敵とのエンカウントや宝箱からのアイテム入手も小さなイベントとして考える


 では、フィールドを移動するにはどうしたら良いでしょうか。十字ボタンで上下左右に動かし、背景をスクロールさせることになるでしょう。もちろん、背景には移動できる場所とできない場所があります。町や洞窟に入れば別のマップを読み込んでそれを移動することになるでしょう。
 戦闘においてはボタンによるコマンド選択を考えることでしょう。プレイヤーが攻撃すれば敵にダメージを与えることができますし、敵が攻撃すればプレイヤーはダメージを受けます。敵を倒せば経験値やゴールドの入手ができたり、場合によってはレベルアップもあるでしょう。逆に負けた場合には、ゲームオーバーになったりゴールド半減などのペナルティを受けてスタート地点に戻るということになるでしょう。
 町の人々との会話は町人に接触して「はなす」を選択すればメッセージウィンドウが出てきてから会話というのを考えることでしょう。それによって様々なフラグが立っていきそしてストーリーが進んできます。このフラグ管理に関しては「RPGツクール」で作品を作ったことがあれば分かりやすいかもしれません。

 ※フラグというのはゲーム進行上の特定の条件を満たしているか否かを記録しているもの。
  満たしていれば「フラグが立った状態」になる。

 さて、いかがでしょうか?
 「ドラクエのようなRPGを作りたい」という場合においてそれを具体的にイメージするというのがどのようなことかが分かったと思います。

 具体的にどのようなものを作るのかというのはRPGのみではなくどんなゲームやツールを作る場合にも言えることです。

 一般的なアクションゲーム(シューティングゲーム)は概ね下記のような構成で作られることが多いです。


【 ゲームの構成 】

(1) タイトル画面

(2) メイン部分

(3) ゲームオーバー画面

(4) エンディング


上記のRPGにおける例えではこの(2)のメイン部分をどうするかというのを考えたわけです。RPGではなく別のゲームを作りたい人はこのメイン部分を具体的に考えていきましょう。


簡単なものでも完成させることで経験値を獲得できる



 上記でせっかく例を出したので再びRPGへと話を戻します。
 ドラクエIのような複数パーティ、複数の敵ではない1対1のシンプルなRPGでも上記のように考えなければならないことがたくさんあります。これを一から作るというのはプチコン3号を購入して初めてプログラミングに挑戦するような人にとっては非常にハードルが高いです。

 では、どうするのかというと難しいものは簡単なものに置き換えるということです。
 例えばRPGそのものを作るのではなくプレイヤーと敵との1対1の戦闘シーンだけを取り出して作るならば完成させるためのハードルはぐっと下がります。
 ウィンドウ方式(GUI)によるコマンド選択が難しければそれは無しにするというのも簡単にする1つの方法です。「攻撃」「防御」「魔法」「アイテム」のようにコマンドが4種類あるならばそれを1〜4に割り振ってその数字をキーボードで入力するか、ABXYボタンに割り振って入力するという方法もあります。
 難しいことに挑戦するのはいいことですが、完成できなければ無意味(他人に聞いたり調べたりして完成させようとする努力が重要)なので最初のうちは自分でもできそうなレベルまでどんどん単純化していくことが必要になることでしょう。(ある程度プログラミングに慣れてから自分で簡単にできるものしか作らないとなるとまた話は変わるけど)

 このように簡単なもので完成させておけば次はそれがベースとなるためそれよりも少し難しいことに挑戦ができます。ドラクエIにおいてレベル1の装備無しの状態で竜王に戦いを挑もうとするようなのは無謀であり、少しずつ経験値を積んでレベルアップして装備を調えてから挑戦をするのがベターというのは分かると思いますが、プログラミングにおいてもそれと同じことが言えるわけです。

 したがって、作ろうと思っているものを「完成させる」ということはすごく重要なことです。RPGを作ってみたいという場合には、最初にモンスターを考えたりアイテムや魔法を考えたり敵キャラのドット絵を描いたりするのも良いですが、それで飽きてしまったり、面倒に感じたりでやめてしまうというのであればいつまで経ってもプログラムが作れるようにはなりません。(タイトル画面に拘ってそれで終わってしまうというのもダメな典型例だけどタイトル画面を何らかのプログラムを使って表示していた場合はそのプログラムを作った経験に関してはプログラミングスキル向上において無駄にはならない)
 ドラゴンなどの強敵と戦って全滅ばかりしていたら経験値は入らず、スライムなどの自分のレベルにあった敵を少しずつ倒していく方が経験値を稼ぎやすいのです。幸いにしてプチコン3号には最初から多くのキャラや音楽、効果音などが入っていてそれを自由に使うことが可能です。そのため「自分でキャラが作れないから」とか「音楽を作れない」からということで挫折をすることはありません。これはゲーム作りにおいては大きなプラスとなるでしょう。

 上記「初心者はどんなプログラムを作るのが良いですか?」という質問に対しての続きですが、プログラミングの初心者に「数当てゲーム」など初心者でも作れそうなゲームを勧めることは「完成させることが意義がある」という点においては非常に効果的なアドバイスです。しかし、本人であるあなたが「数当てゲーム」を作ることに楽しみを感じているのならば良いですが、そうではなく「自分が作りたいのはドラクエみたいなRPGであり数当てゲームなんて作っても仕方がない」と思いながら作っている場合には決して良いアドバイスとは言えません。
 そういう場合にお勧めなのが上記のような「戦闘シーンのみのゲーム」(1対1でコマンド入力をして戦うゲーム)のように実際にRPGで使われているものを切り出してシンプルにしたようなゲームです。RPGそのものを作るよりは簡単とはいえ数当てゲームよりはハードルが高くなりますが、「RPGを作る」ということに直結しているため作る意欲は数当てゲームよりは上でしょう。

 では、数当てゲームがRPGを作ることにとってプラスにならない(役に立たない)かというとそうではありません。数当てゲームに使われている乱数は戦闘シーンでも頻繁に使われるし、正解判定は勝利、敗北の判定に活用できます。つまり、数当てゲームを作ることはRPGを作る場合にも役に立つわけです。ただし、プログラミング初心者の場合は「数当てゲームを作ることがRPGを作ることに繋がる」という認識がなく別物のゲームとして「RPGとはあまり関係ないもの」として認識していることが多いです。つまり、アドバイスする側がその初心者向けのゲームを作ると質問者が作りたいゲームを作る際にどんな役に立つのかを明確にさせるということが重要となるわけです。「これが何の役に立つのだろう」と思ってやっていることはあまり身に付かないためです。。
 この講座を読んでいるであろう初心者の人はそのアドバイスしてくれた人に「数当てゲーム」などの初心者向けゲームを作る理由(数当てゲームを紹介してくれたならば「RPGを作りたいのになぜ数当てゲームを勧めるのですか?」みたいな感じ)について尋ねてください。それが説明できる人は良い回答者といえるでしょう。またそれが説明されている講座は良い講座といえます。

 「学校で習う勉強」もゲーム作りに役立つものばかりです。数学は「役に立つ」と思っている人が多いと思いますが、その通りで処理が複雑なゲームを作る場合に非常に役に立ちます。国語は相手に質問をしたり、書いてある文章の意図を理解する場合に役に立ちます。理科(特に物理)はゲームにおいては役立つ場面が非常に多いです。もちろん、他の教科もゲーム作りにおいて役立つものが多いです。学校で習うことだけではなく「ゲームを作る」という側面においてはあらゆる知識が役に立ちます。
 これは「数当てゲームを作る」ことが「RPGを作る」という場合に役に立つというのと何ら変わりません。「複雑なもの」もすべて「単純なもの」で構成されています。単純で簡単なものを1つずつ確実に完成させていくことが複雑で難しいものを完成させることに繋がっていくわけです。その単純で簡単なものさえ作れないという状態では複雑で難しいものが作れることはないのです。
 そして、簡単なものであっても完成させることが自信へと繋がり自信はスキルを向上させるのにプラスに働きます。そういう意味でも初心者のうちは確実に完成させることを目標に頑張ってください。

 あと、プログラミングを始める初心者にぜひ覚えて欲しいのは「プログラムに正解はない」ということです。
 特に初心者の場合、思ったようにプログラムができない場合に正解を知ろうとしてしまいます。学校の勉強では基本的に正解があるのですが、プログラムにおいてはそれは単なる一例にすぎません。言い換えるならば自分が思った通り動いていればすべて正解とも言えます。  正解が無いからこそプログラミングは楽しいのです。ちゃんと思った通りに動いているかどうかは実行してみれば自分自身の手によって確かめることが可能です。
 こうやって、自分の手でプログラムを作ることがプログラミング上達のためには必要不可欠です。全く分からないならば他人のプログラムを参考にするのも上達に繋がります。「作りたい」とイメージしたものが自分自身で作れるようになる頃にはプログラミングは非常に楽しいものになりますよ。


プログラムを作るにはアルゴリズムを考えることが必要



 上記において具体的にイメージすることが必要不可欠と書いたわけですが、実際にプログラムを作るとなるとこれでは全然たりません。それは、それだけではコンピュータに具体的な指示を出すことができないためです。
 プレイヤーの攻撃に対して敵がどれくらいのダメージを受けるかを計算する命令や経験値を増やす命令なんてものはないのでそれらをさらに具体的に考える必要があります。
 これは、また「運動会」で例えるならば「徒競走」を知らない人に徒競走をやってもらうような感じです。「入場するときはどんな順番で整列するのか」「どこから入ってどこに並ぶのか」「どこがスタートでどこがゴールなのか」「走るときは何人で走るのか」「どうなったらスタートなのか」「走っていい場所はどこなのか」「ゴールしたらどうなるのか」「順位はどのようにして決まるのか」「走り終わった人はどのように並ぶのか」「退場はどこからどのように行うのか」など多くの指示が必要になるでしょう。指示を出す側は当たり前と感じていることでも「分からない人には分からない」ということです。
 プチコン3号でプログラムを作る場合もこれと全く同じようにどのような指示が必要かを考えそれを細かく具体的に考えていけば良いのです。プチコン3号はあなたが何を作りたいのかなんて分からないのですから。


【 戦闘シーンで双方が「攻撃」コマンドのみを選択した場合の流れ 】

プレイヤーの攻撃
   ↓
プレイヤーのコマンド選択
   ↓
「攻撃」を選択をした場合
   ↓
プレイヤーの攻撃力と敵の防御力を元に与えられるダメージを計算
   ↓
双方のすばやさを元にその攻撃が当たるかどうかを判定 → 攻撃が当たらない場合はミスの表示して敵の攻撃に移る
   ↓攻撃が当たる場合
ダメージ量の表示をして敵のHPをダメージ分減らす
   ↓
敵のHPが1以上残っているか → HPが0以下の場合はプレイヤー勝利の表示をして戦闘終了
   ↓HP1以上ある場合はゲーム継続
敵の攻撃
   ↓
敵のコマンド選択
   ↓
「攻撃」を選択をした場合
   ↓
敵の攻撃力とプレイヤーの防御力を元に受けるダメージを計算
   ↓
双方のすばやさを元にその攻撃が当たるかどうかを判定 → 攻撃が当たらない場合は「ミス」と表示してプレイヤーのコマンド選択に移る
   ↓攻撃が当たる場合
ダメージ量の表示をしてプレイヤーのHPをダメージ分減らす
   ↓
プレイヤーのHPが1以上残っているか → HPが0以下の場合はプレイヤー敗北の表示をして戦闘終了
   ↓HP1以上ある場合はゲーム継続
プレイヤーの攻撃
   ↓
 (以下同じ流れ)

※「プレイヤーの攻撃」から始まっているけど敵の方がすばやければ敵の攻撃から始まる可能性がある

 コマンドが「攻撃」のみを選んだ戦闘シーンでもこれだけの流れになります。これを具体的な命令や計算式に置き換えればプログラムが完成します。
 もちろん、この流れは戦闘シーンのみを抽出したものなので具体的な能力値の設定などはこの処理の前に行っておく必要があります。そのような最初に行う設定のことを初期設定といいます。

 戦闘シーンはシンプルにしてもこれだけ多くのことが必要になりますが、「プログラムを入力してみよう」で入力した「数当てゲーム」ならばかなり簡単になります。


【 数当てゲームの流れ 】

タイトル表示
   ↓
1〜9の数字を乱数で決める
   ↓
その数字を予想して入力する → 一致しない場合は「ざんねん」と表示して入力を繰り返す
   ↓入力した数字が一致した場合
「せいかい♥」と表示して終了


 これくらいならば簡単に分かるのではないかと思います。

 プログラムを作るというのは命令を覚えることが重要なのではなくこの流れ(手順)を考えることが重要になってくるわけです。この手順のことをアルゴリズムといいます。つまり、作りたいゲームがある場合は具体的にどのようにしたいかを考えてそれをどのようなアルゴリズムで作るかということを考えることでようやくプログラムが作れる状態になるわけです。アルゴリズムを命令に置き換えて実際にプログラムを入力する作業のことをコーディングと言います。
 つまり、しっかりとしたアルゴリズムさえ用意できていればコーディングは命令に置き換えるだけの極めて単純な作業であることが分かります。もちろん、どんな命令に置き換えたらいいのかとかその命令をどのように使ったらいいのかとかはリファレンスマニュアルで調べたりしなくてはならないため最初のうちはそれなりに時間がかかるでしょう。

 アルゴリズムをゼロの状態から考え出すというのはかなり難しいため他の人が作ったプログラムを読むことも非常に勉強になります。読んですぐに理解できない部分も少し改造しながら構造を把握していけば理解が可能になります。例えば変数に入っている数字を変えるだけでも最初のうちは良いと思います。プログラムをいくら弄っても3DSやプチコンが壊れることはありません。どんどん改造していきましょう。とはいえ、改造したものを上書き保存してしまうとオリジナル(無改造)のプログラムが消えてしまうので改造したプログラムを保存するときさえ気を付けたら良いです。

 他の人が作ったプログラムで最も身近にあるのはプチコン3号に最初から入っているサンプルプログラムです。プチコン3号にはあらかじめ多くのサンプルプログラムが入っています。これはTOP MENUから「サンプルを見る」を選ぶことで実行することができ「プログラムを作る」を選ぶとその実行されたサンプルのプログラムリストを見ることができます。「まず最初に何から始めたらいいの?」で書いたように「プログラムを作る」からサンプルプログラムのリストをロードすることも可能です。また、ネット上で公開されている他のユーザーが作った作品をダウンロードするのも良いでしょう。(私も多くのプログラムを公開していますが、私が作っている作品はサイズが小さいものばかりとはいえ無理なリスト短縮等をしていてプログラムの構造が分かりづらくなっているので初心者の学習用には余り適してないですが、中には初心者向けのものもあるため良かったら参考にしてみてください。→ Miiverseのおちゃめの投稿作品へのリンク(外部リンク))

 プログラムは実際に書くこと(自力で作ること)が非常に重要ですが、他の人が作ったプログラムも読めば読むほど勉強になります。とはいえ、あまり大きなサイズのものだと読むのも大変だし、初心者には理解が難しい高度な処理をしているプログラムも中にはあるためサイズの小さいものが最初はオススメです。出来るならば自分が作りたいジャンルに近い方が興味が強くなる分だけ身に付きやすいでしょう。
 分からない部分があっても自分がやりたいことが具体的に分かっていれば今はネットを活用して調べることはいくらでもできるし(例えばプチコンでポリゴン表示の仕方を調べたいならば「プチコン ポリゴン」のように「プチコン」+調べたいものをセットにしてGoogleなどの検索サイトで調べれば概ね目的に近い情報は得られる)、分からない部分が具体化していればtwitterやMiiverseで質問すればそれに答えてくれる人もいるでしょう。分からないことがあるのは当たり前なのでそれを少しずつ解決していけばいいのです。
 このためプログラミングのスキル向上には「自分で調べる力」が高い方が有利に働きます。脱初心者を果たすためにはこれは必須の力と言っても過言ではありません。中級者以上であってもすべてのことを分かっているなんてことは絶対にないので分からない部分を調べることができないとスキル向上が困難になってきます。(初心者ならば行き当たりばったりのコードを書いて理由は分からないけどこうすれば何となくそれっぽく動くという状況でも良いけど中級者がやるべきことではない)

 自分である程度プログラムを作ってから自分の力では作れな部分、上手く動作しない部分があるという場合にはその未完成のプログラムを公開キー付きでMiiverseやtwitterなどで出せば親切な方が答えてくれるでしょう。義務ではありませんが、質問に答えて頂いたら感謝の意味を込めてお礼の言葉を出すか、疑問が解決した場合はその旨も伝えるようにしましょう。(回答する側としてはその回答によって疑問が解決したのかが一番気になるのでお礼よりもそちらを書いて欲しいと私は感じている)

 他人に聞くことは恥ずかしいことではありませんし、他人のプログラムを真似て作るのも同様です。重要なのは他人任せにせず自分で考えるということです。分からないから全部他の人に作ってもらおうとするのではなくちゃんと考えて分からない部分だけ手助けしてもらうことが重要です。他人任せにしてしまうと「自分で考える」ということをあまりしなくなるためせっかく完成してもそれがちゃんと身に付いておらず似たようなプログラムを作る際にまた同じような質問を繰り返すことになります。
 自分で考えたり、悩んだりという経験は決して無駄にはなりません。例え多くの部分が他人の助言によって完成したとしてもそれによって身につけた知識や技術を次に作る自分のプログラムにフィードバックすることで自然にプログラムが作れるようになってきます。(私もベーマガなどの雑誌に掲載のプログラムをたくさん読んだり改造をしたりして自分で作れるようになった)


公開する前にはテストプレイを十分しないと後悔する



 プログラムを作る際に完璧なアルゴリズムを考えられる人はそれほど多くいません。タイプミスによる入力間違いをすることもあるでしょう。そうなると起こりうるのがバグ(不具合)です。
 バグと一言で言ってもエラー表示でプログラムの実行が止まるものもあれば、エラーもなく画面がおかしくなったり(「画面がバグる」と表現されることもある)、見た目は問題ないけど想定してなかった動作(RPGでいえばクリアに必要不可欠なアイテムを捨てることが出来たり)をする場合もあります。
 自分のみがプレイするゲーム(もしくは、使用するツール)ならばその都度修正すればいいのですが他の人にプレイして欲しいゲームとしてネットで公開するならばそのようなバグが多いものは考え物です。これは自分がプレイする立場になれば良く分かるでしょう。とはいえ、よほど短く単純なプログラムでない限りバグを完全に無くすのはプログラムを作り慣れている中、上級者でもなかなかできないので「バグの無いプログラムを作ろう」と言っているのではなく普通にプレイして発生するような目立つバグが無いことを事前に確認しておこうというだけのことです。
 バグを取ることをデバッグと言います。プログラムを作った後はデバッグすることが重要となるわけです。

 また、目立つバグが無ければそれで十分かというとそういうわけではなくゲームにおいては敵がやたら強かったり(弱かったり)とか、特定のアイテムがやたら強かったり(弱かったり)とかがないようにゲームバランスにも気を付けたいところです。難易度が高いゲームとして作っていて全体的に敵が強めとなっているならばそれは仕様として片づくことですが、そうではないならばこれもバグと同じく何らかの形で改善をすべきでしょう。(「バグ」か「仕様」かは制作側がその動作を認知して作っているか否かで決まるため客観的に見ると「バグ」のような動作でも制作側は「仕様」と判断する場合もあるけど客観的に見てバグと判断されそうなものは極力「仕様」で片づけないようにしたい)

 バグ取りやゲームバランス調整に関する私の考えはポケコンBASICによるゲーム制作講座 第5章 テストプレイはゲームの味見に詳しく書いています。プチコン3号用ではなくポケコン用の講座として書いたものですが、機種依存しない部分なので問題ないです。また私のプチコンmkII用の講座もゲームバランスに関して書いているのでどのように調整するのがベターかという具体例が欲しい人はそちらもご覧になってください。

 具体例の1つとしてドラクエではダメージの計算式として次のような式が使われています。

  ダメージ=(攻撃力÷2)−(防御力÷4)

 つまり、プレイヤーの攻撃力が200で敵の防御力が120ならば200÷2-120÷4=70で70程度のダメージを与えることができるわけです。(実際は70ちょうどではなく乱数で幅を持たせている)
 与えるダメージを元にすればそれに対するプレイヤーキャラや敵キャラの適切な能力値(HPなどの設定数値)や武器や防具のパラメータ(どれくらい攻撃力や防御力を上げるかの数値)を設定することが可能になります。ダメージの計算式というのはこのドラクエ方式以外にも無数にあるわけですが、バランス調整を行う場合にはこのダメージの計算式そのものが重要というわけではなくそれを元に他の部分との整合性を取るということが重要になってきます。(武器や防具のパラメータから能力値やダメージ計算式を決めるという方法を採ってもいいけどダメージ量を基準に考えるのが最も簡単な調整方法だと思う)
 ゲームバランス調整の方法としては絶対的な基準を1つ用意することが重要です。RPGならば主人公キャラがレベルいくつでクリアしてその時の能力値はどれくらいなのかを考えてそれを元にバランスと取っていくわけです。私がよく作っている100m走ゲームの場合は連射速度がそこそこ早い人(秒間10〜12回程度)で10秒台のタイムが出るようにバランス調整を行っています。このような基準がないと1つの数値を変えたら別の数値とのバランスが取れなくなっていき堂々巡りを繰り返す恐れがあります。

 バグを発見して修正(これをデバッグと言う)とかゲームバランスの調整とかを行うのに必要なのがテストプレイです。つまり、公開するプログラムはテストプレイを十分に行うことが重要となるわけです。言い換えればテストプレイをろくにせず自分のプログラムを公開することは味見をせずに他人に自分の料理を食べさせるような愚かな行為と言えるかもしれません。
 プログラムができたら完成ではなくより良いゲーム(ツール)を作るためのスタートラインに立ったにすぎないことが分かったのではないかと思います。

 せっかく公開しても「バグだらけでまともにプレイできない」とか「ゲームバランスがめちゃくちゃな糞ゲー」とか言われたら嫌ですよね。後悔したくないならば公開する前に十分なテストプレイをしましょう!
 これは「バグがあるプログラムがダメだから公開前にはバグがない状態にしよう」と言っているわけではありません。ミスというのは誰でもすることであり、自分のミスをすべて自分の力で見つけ出すのは困難です。つまり、「バグが無い状態で公開しよう」ではなく「公開時には出来るだけバグを減らそう」ということです。プログラミング能力とデバッグ能力は全くの別物です。プログラムの初心者であってもテストプレイによってバグを見つけ出すことはできるはずです。

 プチコン3号でプログラミングが初体験となる初心者ならば、作ろうとしているプログラムを完成させることが重要なのですが、それができるようになったら上記のように「普通にプレイして発生する目立ったバグが無いもの」を作れるようにして、それが出来たら「自分でこうした方が良い(面白くなる)という工夫をする」ということを心がけるようにするということです。最後までプログラムを作ることでさえ難しい人がいきなり完成度の高いゲーム(ツール)を作るなんて無理なので徐々に作れるようになれば良いと思います。
 覚えることはたくさんありますが、「プログラムを入力してみよう」で書いたように少しずつ覚えていけばいいのです。プログラムを作るという行為は楽しいことです。ぜひ、楽しみながら作っていってください!
 プログラミングが楽しくなると「プログラミングが楽しいからどんどん作る→どんどん作るからより多くの知識を得てスキルが向上する→スキルが向上するから自分が作りたいものを作れるようになる→作りたいものを作れるからプログラミングが楽しくなる」という連鎖を生み出します。「プログラミングは面倒でつまらないもの」という気持ちで作っていると「上達しないからつまらない」という負の連鎖が発生してしまいかねません。実は初心者にとってはプログラミング楽しむことこそ最も重要なことなのです。ことわざにも「好きこそものの上手なれ」とありますからね。(やっていて楽しいことならば分からなくことを調べるということさえ楽しくなる)

 さて、上記のように「公開する際にはバグ取りやバランス調整をしっかり行いなさい」ということを書くと公開することを恐れる人や面倒くさがる人もいるかもしれません。しかし、公開することで(良い反応が返るとは限りませんが)様々な人の反応を得ることができるというメリットがあるだけではなく自分が作った作品を客観的に捉えられるようになります。
 とはいえ、今度はどの段階で公開するのかということが問題になります。デバッグをいくらやっても一人でやるのには限界があり(作った本人はプログラムの内容を熟知していて決まった手順でプレイしてしまい想定外の操作をしたときに発生するバグを見つけられないことがあるため)デバッグをどれだけやってもバグが潜んでいる可能性があります。バランス調整においても「絶対」というものはありません。あくまで自分が考えた通りのものになっているか、とか、自分が想定しているプレイヤーが納得できるようなものになっているかというだけに過ぎません。つまり、どの段階まで出来たら公開するのかということを考えることが作品作りのスキルアップに繋がるわけです。(作品を作るスキルとプログラミングスキルは別物)
 つまり、とりあえず出来たもの(プログラミングが終わったもの)をすぐ公開するのではなくテストプレイを行い自分自身で「これで完成した」というラインを見つけ出すことが重要になってくるわけです。何も考えずに公開を行うのであればせっかくのレベルアップのチャンスを失うことになります。
 プチコン3号で作ったプログラムは簡単に公開ができるのですが、いくつか注意すべき点があります。それは「作ったプログラムを公開しよう」の方にまとめているので参考にしてみてください。


誰もが「中級者」になることができどんなプログラムも作れるようになる



 趣味でやっていることならば「やっていて楽しいかどうか」が最優先されるべきだと私は思いますが、趣味であっても上達したいと思う人が大半だと思います。プログラミングにおいて「自分が作りたいものが自在に作れる状態」と「いつまで経っても初歩レベルのものも満足に作れない状態」だと前者の方が良いと思うことでしょう。
 やっていて楽しいことは上達しやすいのは確かですが、楽しければ必ずグングン上達するかというとそういうわけでもないので難しいところです。

 ここで、問題は上達の速度は人それぞれということです。上達の早い人は数ヶ月でかなり高度なこともできるようになるかもしれないですが、数ヶ月程度だとさっぱりという人もも多いでしょう。それは、年齢による問題も若干はある(論理的な思考力の問題があるので小学低学年以下だと厳しい)ものの小学高学年以上であればそれほど大きな問題はありません。難しい計算式を使うプログラムの場合は中学、高校の数学の式(場合によっては大学レベルの式)が出てくることもありますが大抵の場合は公式に当てはめるだけとか既存のアルゴリズムにほぼそのまま当てはめるだけで作れるためこれもそれほど大きな問題はありません。
 上達のための大きな要素になるのは知識を貪欲に吸収して少しでもたくさんのプログラムを読み実際に自分の力で書くということです。書いた分だけ上達します。プログラミングスキルの高い人はそれに応じた量だけプログラムを書いているというわけです。
 それでも、何事も個人差があるため同じようなプログラムを同じようなだけ書いても同じように上達するという保証はできません。(プログラミングに限らず慢心は上達の妨げになるので楽しければいいですませず探求心を持って積極的にいろいろなことにチャレンジすることが上達に繋がる)

 話は変わりますが、この講座は「入門講座」となっているしスマイルブームの公式サイトで書かれている「初心者講座」もあります。そして良く聞く言葉に「初級」「中級」「上級」というものがあります。「初級者」より「中級者」の方がスキルが高いというのは感覚的に分かると思いますが、「初心者」と「入門者」と「初級者」ではどういう順番でスキルが高いのかというのは恐らく普通の人には分からないと思います。これらは、辞書的な意味では上下関係がないので当然です。あと、「初級者」と「中級者」では中級者の方がスキルが高いといってもどのような違いがあるのかというとこれもまた人によって意見が分かれるため難しいと思います。
 そこで私の解釈で順番や違いを書いてみました。これらは私の解釈であり一般論とは異なる部分がありあくまで通用するのは当サイトにおいてのみということに注意してください。(私は20年くらい前からこの分類を提唱し続けている)

《 プログラミング「入門者」「初心者」「初級者」「中級者」「上級者」の違い 》
ランク 1
入門者
ほぼ未経験者。
基本的な命令の使い方は分かっても自分でプログラミングは満足に行えない人
ランク 1
初心者
当サイトでは「入門者」とほぼ同じ扱い。
経験はそれなりにあってもスキルが低い人も含む
ランク 2
初級者
簡単なプログラムが作れる。
ある程度のプログラムならば自力で作れる人
ランク 3
中級者
論理的にプログラムが作れる。
自分のプログラムの仕組みやそのように作っている理由を客観的に説明できる人
ランク 4
上級者
客観的に考え最適なプログラムが作れる。
第三者の仕様を汲み取りそれに最適なコードを書くことができる人

 分かりにくい部分があるので補足しておくと初級者ならば「単に動けばいい」が許されるけど中級者はそれが許されないということです。常にきっちり作る必要はなくラフに作る場合は適当でいいけどちゃんと作ればちゃんとしたプログラムが作れてこそ中級者ということです。
 あと初心者と初級者はランクを分けていますが、明確な線引きは特に無く「初級者にはプログラミングの経験が全く無いという人を含んでいない」という程度の違いしかありません。したがって入門者、初心者がスキルアップして初級者になるというわけではなくあくまでその上位にあるのは中級者となっています。

 中級者になるためにはちゃんとしたコードが書けるような知識や経験を積む必要があります。他者の作ったプログラムを積極的に読んで勉強しましょう。論理的にプログラムが作れれば規模が大きいものも難なく作れるようになります。(初心者でも無意味なIF文の羅列などによって規模自体が大きいものを作ることは可能なので○○KB以上のプログラムが作れれば中級者という基準を設けることはできない)
 論理的にプログラムを作るためには上記のように作りたいプログラムの手順をしっかり把握してその処理1つ1つの意味を理解することが必要不可欠となります。
 「客観的に説明する」というのは実際に説明することが重要なのではなく言語化することに意味があります。言語化することで自分が何を分かって何を分かってないかが把握できるようになるためです。プログラムは絵や音楽と違って感覚で作るような部分は全く無いのです。したがって、このような論理的な思考は極めて重要になるわけです。(ゲームバランスの調整などは感覚的な要素が入ってくるけどそれはプログラムが作れるかどうかとは別の問題)

 上級者になると客観的、論理的に説明できるのは当たり前で中級者よりもさらに深い知識が必要になります。例えば中級者ならソートプログラムを作る場合に「ヒープソート」「クイックソート」「マージソート」「バケツソート」などのうちから1つを即興で作れれば問題ないですが、上級者ならば要素数や項目の値の範囲やバラツキ状態などを考慮して最適なアルゴリズムが選択できるということが求められてきます。要するに上級者になるためには同じプログラムを作るためにもいくつもの方法を知っておく必要があり中級者よりも多くの知識や経験が求められます。
 より高度なことができるというのも上級者の条件の1つになるわけですが、高度なことというのも線引きがなかなか難しいです。ワイヤーフレームやポリゴンといった(立体視のことではない)3D表示も初心者からしてみると高度に見えますが、実際はほとんどが公式やすでにポピュラーとなっている3D表示のための計算式に当てはめるだけで作れるためさほど難しくなく中級者の人でも十分作れます。しかし、より速度を求めるならばそれだけ公式にはない知識が求められるため上級レベルといっても良いかもしれません。

 同じランク内であっても当然上下差はあるので「初級者に近い中級者」もいれば「中級者に近い初級者」もいることでしょう。上記の分類の説明はこれくらいができればこれくらいができればこのレベルを名乗ってもいいかなと感じているものです。(「初心者」や「入門者」ならば下限がないため誰が名乗っても良いのですが、明らかに「中級者」以上の人が「初心者」を名乗ると相手には嫌味と感じられる場合があるため注意が必要)

 もちろん、すべてのジャンルのプログラミングにおいてすごい知識や経験を得るなんてことは無理であり、人によって得手不得手もあるためアクションゲームプログラムならば上級レベルだけど戦略シミュレーションならば中級レベルという人もいるでしょう。あと「3D系は苦手だけど普通の2D系(スプライト)ゲームならば任せておけ!」という人もいるでしょう。そもそも、他のプログラミング言語はすでにある程度の経験がありプチコン3号でBASICを初めて勉強するという人もいるでしょう。したがって、上記のスキルの分類も万全なものではないということです。
 それでも、中級者になるためには「単に動けばいい」で終わらせないようにするというのが重要であり、これはジャンルに関係なく共通の部分です。(つまり、(自称)中級者は割とすぐになることができ自分が作りたいジャンルのプログラムの知識を得ていけば良いだけ)
 念のためもう一度書きますがこれらの分類基準は当サイトのみ有効なものです。人によって基準が大幅に異なる部分なので他所でこれを書くと「いやそうではない」「これが正しい」とか言い争いになるのが必至です。(「プチコン3号プログラミング検定中級試験」とかが公式で実施されない限りは正解そのものが存在しないためこの分類方法が間違っているわけでもない)

 上級者になるためには第三者の受注がないと無理なのかというとそうではなく第三者の視点に立って「これはこういう観点で最適化している」「これは同様の動作をする別のアルゴリズムで作ったものよりもこういう面で優れている」などのことを考えて作れば問題ないと思います。いかに客観的な立場に立てるかが重要になってきます。
 趣味で作るならば、そこまでのものが要求されることはないとほとんどないので中級者レベルで困ることはないと思います。特定ゲームにおける処理方法などはネット上でいくらでも調べられるし書籍を読んで調べるという方法もあるため分からないことを自分自身で調べることができれば中級者であればどんなプログラムも作ることが(理論上)可能になるためです。(初級者でも他人が作ったプログラムを参考にして様々なジャンルのプログラムを作ることは可能だけど自分のオリジナルのプログラムを作るのは難しい。これは絵を描くことに例えると目の前にある物体や模写はそこそこ上手くても目の前にないものを描く場合に大きな落差がある状態となる。)

 こんなことを考えずとも普通に作っていればいずれ上達するのですが、上級者と中級者は経験の差しかないものの初級者と中級者には明確な差があります。その差は簡単に埋まる人もいればそうでない人もいることでしょう。
 講座として書く場合には作っていればいずれ上達するので問題ないというわけにはいきません。ネット上で見かけるプチコン用の初心者講座、入門講座は初心者や入門者が初級者になれるように書かれているものばかりでその先の中級者になるように書かれているものはほとんどありません。つまり、命令の基本的な使い方は分かったけど自分でプログラムが作れるようにはなってない状態ということです。「私は初心者だな」と思っている人ならばこれがどのようなものかがよく分かると思います。
 「中級者になるための講座」というのは「中級者」というのがどのようなものかを自分の中でイメージすることでそれに近づけるためにはどうするのかという方法が決まってきます。それが、当サイトで書いている講座となるわけです。つまり、この講座というのは中級者になるためのレールというわけです。

 ということで、当サイトの講座を読んで(当サイト基準で)中級者を目指しましょう!
 自分で考えたゲームやツールが思い通りに作れるようになればプログラミングは非常に楽しいですよ!
 スキル向上によって市販ゲームの移植作品や模倣作品を作るのもいいけど「無いものは作る」の原則によってどこにも存在しないオリジナルの自分だけのゲーム(ツール)を作るのは何よりの喜びになることでしょう。


 《 補足 》

 「どんなプログラムも作れる」ならば「面白いゲームが作れる」かというとそういうわけではなく面白いゲームを作るためにはプログラミングスキルとは別にそのようなゲームを作るためのスキル(技術)が必要になってきます。したがって、ゲーム制作の初心者とプログラミング初心者というのは全く別のものになります。
 この入門講座ではプログラミングスキルを向上させるために必要となる様々な事柄について書いていますが、ゲームを作るためのスキルは別途実戦的な初級講座(ゲーム制作講座)で書く予定です。こちらの方ではプログラムの実戦的な作り方以外にもゲームバランスの調整方法などのゲームを面白くするための手法についても書く予定です。(私がプチコンmkII用に書いた講座のようにゲーム制作に主点を置いた講座のみにするとプログラミングスキル向上のための記述が中途半端になるためそれを分離して入門講座とした)


RETURN (プチコン3号講座のページにもどる) RETURN *MAIN (トップページにもどる)

inserted by FC2 system