プログラムをまなっ場合、まず、開発言語を学ぶ必要が
あるのですが、その理解が深まり、学んでいく工程において、
ゲームプログラミングをするとプログラミングにおいての能力
が向上すると言われています。
これは、要素が複数詰まっているカラもあるのですが、ゲ
ームと言う特性故に発生するものが、複雑な処理を求める
ためです。
ゲームは一人で行う作業ではなく相手がいる
これはどんなゲームでも同じなんですが、この条件は変わり
ません。その対象が、1対自然なのか、人同士なのか、もしくは、
人とコンピューターなのかの差です。
ゲームの内容が、人の遊ぶもので考えると、人と自然の競争
での勝敗条件というのはないですし、どんなバーバリアンなゲー
ムなんだ?と言う話になるので除外して、通常ゲームというと、
人同士、もしくは、人とコンピューターになります。
とりあえず、この条件では、1対1の条件と言う内容にしてお
きます。
つまり、この場合ですが、両者に共通するのは、
【 人同士にしてもコンピューターとの対戦であってもそこに
思考と行動が存在する 】
ことです。つまり、この条件は一人で作業してる場合の単一の
個人だけの思考と行動で完結しない条件であるとも言えます。
例えばオセロゲームをっした場合、両者の施行は存在し、そ
のうち手なども局面で変わります。これがゲームシステムが複
雑になるほどその譜面汚点会は多くなりますし、将棋のような
システムだと版の広さだけで条件が変わるゲームとは異なる選
択数が生まれてきます。
つまり、この選択数と言いうのは、処理の複雑さと一致します。
その為、そうしたモノを作る場合には、コンピューターもそうした
思考が行える状態でないと、そのゲームに参加が出来ないレベ
ルのおかしな振る舞いをしてしまいます。
つまり、それに応じた状態にすることを考えるとそれを実装し、
その勝負における打ち手がゲームに勝つレベルの振る舞いでな
ければならないわけです。
この条件で、一対一でもゲームが複雑になるほどに処理が難し
くなる条件が発生するわけですが、当然のように局面の変化が激
しくなるプレイヤー数の増加や外的要因の発生などを包含した場
合、コンピューターの行う処理はさらに複雑なモノを用意する事に
なります。
つまり、こう考えると、ゲームの中においてどういうジャンルでど
ういう構造物としてそれが存在するのか?にもよりますが、ゲーム
の構造物のひとつの敵キャラの振る舞いから、ボードゲームの対
戦相手似たるまで存在するそれを当たり前に作らないと、ゲームと
して成立しないので、ゲームプログラムは簡素ではなく、複合的要
素のモノであり、単純ではなく、処理で考えると複雑なモノになって
いるわけです。
アルゴリズム
基本的に、ソフトウェアにおいてコンピューターが何の処理を
しなければ、プログラムでも何でもないのですが、そうした場合
に、その振る舞いを考える必要があります。
まず、オセロのような条件で考えると、コマの認知はブール
値でいいとしても、将棋やチェスの駒はどう認識させるのか?
と言う話が出てきます。
とりあえず、これは検知ではなく、設定レベルの話なので、
アルゴリズムでも何でもないのですが、こうした場合、簡素な
データベース参照をさせれば済む話になります。
っつまり、主キーの番号でそれを認知させれば、コマの
違いをコンピューターは理解できます。
しかし、ゲームに名ルールが存在し、そのコマには個別
の振る舞いが存在します。
つまり、そのインデックスに対してコマの名前を振り当て
人間が解りやすい状態で管理したとしましょう。そうすれば
コマの認知は即座に解りますが、問題は、
【 コマの移動範囲とその特性をどう理解させるか 】
になります。これがアルゴリズムです。
例えば、歩の場合、コンピューター将棋だと、コンピュー
ターは画面上部(Y座標でいうと数値が少ないほう)から
攻める事になりますから、移動距離をaとすると
【 y=y-a 】
の移動が可能になります。とりあえず、この簡素なゲーム
内部の構成要素その1でモノを考える事にします。ただし、
この条件だと、
【 1コマしか進めないという条件にはならない 】
のでさらに縛りが必要になります。
まず、コマの特性として、
■ 前面に遮蔽物がる場合、進行不能
■ コマの移動数は1で超過できない
■ Y方向に増加する条件のみで移動
というものです。
この条件をプログラミングしましょうというのが歩というコマの
移動におけるアルゴリズムになります。
これとは別に将棋では、
■ 取る
■ 成る
と言う条件があります。この場合、
■ 進行方向に敵駒がある
と言う条件で取るという条件が満たされます。そして、成るという
のは座標検知ですが、これは将棋のルールからすると、成ると
ならない選択肢がある(まぁ、歩くはと金にするとは思いますが。)
ので、この条件判定処理もゲームでは実装する必要があります。
アルゴリズムと言うのは、この先に発生する敵コマの進行範
囲に自分行かないようにするための条件抽出とかになりそうで
すがそうした問題をコンピューターに解決させつための方法が
アルゴリズムになります。
つまり、そうしたモノを構築し実装する必要があります。
流石にこういうのは難しいのでもう少し簡単な処理で考えて
みましょう。
1~50の数値がある場合に、末尾が7の条件と、4の倍数
を抽出するとします。この場合、
■ 4の剰余
■ 10と1の桁に分離して10の桁を無視した末尾
での判定
をすればその条件は判定できます。これは、アナログでも同じ
なんですが、末尾の判定という事は、10以上の桁はブラインド
にしても問題がないので、桁を詰めればいいわけです。
こうした構造で抽出した条件で異なる周期を抽出できるの
ですがこしうした条件分岐や処理を考えて実装する作業は
発生します。
アルゴリズムですが、
● 再帰的アルゴリズム
● ソート
● 探索
● 文字列検索
● データ圧縮
● 暗号化アルゴリズム
● 並列・分散アルゴリズム
などがあります。一番最後のは、ネットワークコンピューティ
ングのソレですが、検索・圧縮・ソートについてはオフィース
ソフトでも実装していますが、あれも漠然としているわけで
はなくアルゴリズムが存在しています。
多分、近年で見かけるようになったのは
【 近似アルゴリズム・ヒューリスティックアルゴリズム 】
ではないかなとおもうのですが、これは、コンピュータで答え
を出す場合に、計算量が多くなって現実的な時間内に答えが
出せない場合、完全な正解でなくてもある程度正解に近い答
えを出すことが可能なこともあります。その時に使うのが、これ
です。
発見的・探索的に近似解を求めるアルゴリズムは
ヒューリスティックアルゴリズム(ヒューリスティクス)
と呼ばれており、その中には、 【 遺伝的アルゴリズム 】
と呼ばれるものがあります。
これは、生物の進化に見立てたアルゴリズムで、
【 解の候補を生成させて、より解に近いものを選択し、
交叉・突然変異などの操作を繰り返しながら解を
探索していくもの 】
となっています。
【 代表例:巡回セールスマン問題 】
都市がいくつかあり、その都市の間の距離が与えられたとき、
すべての都市を1回ずつ回って元の都市に戻る経路で最短の
ものを求める問題です。
これも元のデータとなる、都市が増えただけで計算量が莫大に増え
るのでで遺伝的アルゴリズムなど近似アルゴリズムで解く方法がよ
く用いられます。
つまり、処理をする上において、その条件でモノをクリアする場合に、
最も最良の選択をっ導く場合、条件を中スツしてその結果を出さな
ければいけないわけですが、そうしたもオンをジソスすることで当た
り前にコンピューターがモノを判断できるようになる訳です。
簡素なゲームでも、モノをどう動かすのか・などの仕組みは存在
しますから、その場合の処理においてのアルゴリズムの構築は存
在します。
思考ルーチン
アルゴリズムはmン台の解決法なんですが、当然のようにそれ
はゲームでも存在しますが、ゲームの場合には、
【 思考ルーチン 】
プレイヤーと対戦する側の行動を決定するプログラム
が存在します。つまり、相手の条件いよって振る舞いを決めて
動くコンピューターの振る舞いで、アクションゲームの敵キャラの
追尾とかボードゲームの対戦相手のAIとか、RPGの敵キャラの
振る舞いなどがそれになります。
基本的にゲームでは、将棋の駒の振る舞いやゲーム内での縛
りと言うのがあります。こうしたも尾音範囲内でそれを動かすので
当然のようにっデータ管理が発生します。思考ルーチンもアルゴリ
ズムにおける【 再帰的アルゴリズム 】が存在するため、データ
の取り合え使いが基本的な部分として登場します。
こうした分野を学ぶ場合プログラムで考える場合、アクションゲー
ムのものとボードゲームで全く異なるのですが、ボードゲームの場
合だと前述のアルゴリズム解析が必要になります。
ゲームで登場するものだと、アクションゲームなどであれば、条
件で振る舞いが変わりますが、基本的に、どういった条件で何にな
るのか?を前提に動くものと発生場所が乱数で設定されており、そ
れが任意の条件で出てくるものとは挙動が異なります。
例えば、その条件だと、振る舞いが決まっているのでゼビウスに
登場する敵キャラなどと同じなので、それは動きの法則性が見えて
きますが、条件追尾性の何かだとその理屈は通じません。
また、そのアルゴリズムだと、HPの少ないキャラに総攻撃を仕掛
けてくる敵のルーチンも説明できないので、数式+発生座標変動型
の定型の演算方式の挙動の何かと条件検知ガラ他の処理では内
容が異なります。
例えば、HPの条件とDPの条件で評点を付ける場合、戦士よりは
魔法使い系を攻撃するはずですが、HPが少ないがダメージが加え
れる可能性がない戦士とHP満タンの魔法使いの条件判定はどうい
う評点評価でその選択をするのか?などもそれです。
つまり、パーティーが複数人いてそうした特徴が異なる条件が存
在っした場合の振る舞いもルーチンでしっかり煮詰めないといけませ
ん。
基本的にこうした振る舞いですが、ゲームの構造が何かで変わっ
てきますが、三角関数を用いて自機の中心と敵キャラの距離を演算
し、それが縮まるようにXY亜座標を縮めると言うアプローチもあるの
ですが、この場合に発生するのは、
【 移動における賢い選択 】
になります。つまり、
【 障害物周囲は避けて通り、出来るだけ最短を選ぶ 】
などのアルゴリズムです。しかし、追尾型のルーチンだけでないと
いうのは、パックマンの実装ルーチンで既に確立されており、待ち
伏せするルーチンがアレにはありますかrあ、結果的に個別に振る
舞いをするものなのかの特性を持たせる必要があるわけです。
そうなると、その条件式やその評点判定のをする仕組みづくり
が必要になるので、当たり前のようにプログラムにおける技術は
高くなります。
そして、ゲームの場合、変数の化け物のような状態ですから、
アルゴリズム・AIを用いる場合にはSQLを用いないとどうしようも
ないのですが、それを用いす事の出来ない環境下だと、Arrayの
利用などになります。そうなると、複雑なデータ管理をすることに
なるので、プログラミングにおいての能力は向上するわけです。
あと、Arrayでいうと、アクションンゲームのマップ管理とかでも
使いますから、結果的に、そうしたデータ管理においての処理は
ゲーム制作では嘘のように登場し、個人がスクリプト言語の学習
においてそういうのを作るとしても使う物ですから、やはり、能力
はフツーに向上します。
とりあえず、ゲームの場合、キー入力と画像処理とオブジェクト
の移動などを行う処理に加え、条件判定やループなど、必要な
処理が入るだけでなく、ゲームシステムとは別に、ゲーム進行
上で利用するフラグなども存在するため、複雑なプログラムに
なる訳です。既存のレガシーなゲームにしても、乱数の利用や
多くの数式の利用がなされていたりしますから色々と勉強にな
るのですが、個人が時間を使って勉強するレベルでいじる10
00行未満のソースコードで動くものでも、そうとう複雑な処理が
されていますから、処理における勉強になりますし、何よりも複
数のジャンルのそれを学んでみると、その仕組みが全く違うので
(Aiや思考ルーチンだとSLGとボード系とアクション・シューティン
グで全く違うので、個別に学んでみると相当異なる物が存在し
ていることが理解できます。)勉強になると言いう訳です。
とりあえず、ゲームで遊んでる状態でゲームのプログラムが
どう動いているのか?はさすがにわからないので、それだけで
ゲームが作れるようになることもプログラミングが出来るように
なる事もまずないので、ゲームで遊んでてもそれが出来るよう
になったというヤジを飛ばす事で劣等感から逃げてるような無
能だと既に現実逃避が酷過ぎるごみなので年も年だし終わり方
が酷いので死滅が始まってる状態でしかないので相手にしても
仕方ないのですが、とりあえず、思考ルーチンお構築において
AIの利用もそうですが、その構築の段階でアルゴリズムにお
いての学習も出てくるので、当たり前のように開発言語だけ知
ってる状態からモノを漠然と行うのと比較すると多岐にわたって
モノを覚える事になりますから、当たり前のように上達するわけ
です。
その為、ゲームプログラミングをすると勉強になるし上達する
と言われているわけです。当然、ヒューリスティックな解析も組み
込もうとおぼ萌ば出来るので、結果的にそうした処理も含めて、
アルゴリズムは常に存在するし昔からそういう代物ですから、
大昔の寄稿雑誌とかのプログラムがゲームだと言うのもうなづ
けるわけです。