ゲームのアルゴリズム

ゲームのプログラムを作るには、技術計算や事務計算とは違った
アルゴリズム(定形の方法)がある
ここではアルゴリズムの考え方だけを書く、この文章に興味を持つような人は
既にプログラムを組んだ事があると思うからである
 ・テレビ画面にゲームを表示するのは基本的に座標の考え方が必要になる
  中学校で習った障子や窓ガラスに蠅が止まっていて、動き出すのをX軸と
  Y軸で表現するやり方である
  今現在の位置をX1,Y1とし、移動した結果をX2,Y2として一回の動作が
  終わるとX2、Y2をX1、Y1に代入してまた最初に戻り、同じロジックを
  繰り返すのが基本的なプログラムの構造になる
 ・ テニスゲームでボールやラケットを左右や上下に動かす方法
  現在のボールの位置を覚えておき、次に動かす方向を現在の進行方向と
  ラケットの位置、壁の位置から計算する
  例えば、現在の進行方向が上で、そのまま進むなら、次はX増分が0で、
  Y増分が+1である
  また、今までが斜めしたに降りているなら、X増分は+1、Yはー1、それが
  ラケットではねかえるなら、X増分はそのまま+1、Y増分は反転するから
  +1になる
  こうして得た次の座標で新しいボールを表示し、前の座標のボールを空白
  にする、これでボールが進行しているように見える
 ・得点表示
  テニスゲームではミスしたら相手に得点が入る、ほとんどコンピュータと人間
  の戦いだろうから、中央上段に表示し、右が人間で、左がコンピュータといった
  具合にする、比較的多いのが上がコンピュータ、下が人間の方法である
  自分の側といった感じが出るからと思う、左右だと観戦する気分か
  テニスは得点が単なる1点単位でなく、15点、30点、40点、50点となる
  ただし40点で同点の場合はジュースといって、続けて2回得点しないとその
  ゲームは勝ちにならない、こんな事でもこだわるとそれっぽくなってくる
  当然だがコンピュータの方が強いと面白くない
  だんだん強くなるのを自分もレベルアップしながら倒していくのが良いのである
  従ってどうやってミスをさせるかが一つのテクニックになる
 ・ミスや偶然を表現するために、乱数が使われる、BASIC等ではRND関数が標準
  でついていたが無い場合はどうするか
  簡単なのは例えば2桁の奇数同士の掛け算を行い、結果の下2桁を乱数とする
  方法である、これを擬似乱数という、出来るだけ同じ数が出現する割合が少ない
  方がいいので素数が使われる
  つまり、乱数=(素数X一回前の乱数)の下2桁とする
  下2桁の求め方は、乱数を整数で定義し、100で割ってからまた100倍する
  つまり、乱数=(素数X1回前の乱数)ー(素数X1回前の乱数)X100/100
  とするともとめられる
  素数は事前に簡単なプログラムを作り、乱数を次々に計算して画面いっぱいに
  表示し、周期性などを確認すると良い
  こうして得られた乱数で、例えばミスを30%起こしたければ、30以下の乱数が
  出たらミスとするというように設定すれば良い
 ・臨場感のある表示方法
  テニスコートを真上から見て表示し、ボールの位置を表示するのは、計算が
  簡単だし、すぐ出来そうだがより本物に近づけるためには、テレビで映る様に
  3Dで表示できないかと考える
  この場合はボールの大きさも目線からの距離を計算して変化させる
  更に、前後左右だけでなく、上下も計算しなければならない
  新しい障害物として、ネットも加わる
  また地面に落下したボールは反射係数でまた浮かんでこなければならない
  つまりスピードの概念が必要になる、これには単純な一定スピードでなく、
  強く打ったらスピードが上がったり、空気抵抗で徐々に遅くなったり、地面に
  反射すると遅くなったり、重力で落下したりといった計算が必要になる
  全て中学校で習った程度の数学や物理なのだが、いざ実践するとなると、
  結構難しい
 ・ラケットを自分の思うように動かすには、所詮キーボードでは何かのキーを
  押したらその分だけ動かすといったロジックになる
  そのためにはキーが押された事を認識するプログラムの命令形が必要になる
  この命令はゲームを意識したコンピュータではあらかじめ準備されている
  逆に準備されていないと反射型ゲームは作れないと思った方がいい
  一般的には GETKEY のような名前になっている
 ・コンピュータは非常に早く動く、単純にボールやラケットを表示し、動かすと
  目にも止まらぬスピードになる
  そこでわざと遅く計算させる必要が出てくる、実現方法として、上記GETKEY
  命令を書いてある場所を何回かループさせる
  ループの回数で動作が遅くなる度合いを調整する
  ゲームの難易度をスピードで調整するのは最も初歩的な方法である
 ・対戦型ゲームでは自分の番が終わったらコンピュータの番になり、また自分の
  番になるという様に交互に全く同じロジックで手順を繰り返すタイプのゲーム
  がある
  例えば将棋やオセロ、チェスなどがある
  自分が先手番の場合と後手番の場合のどちらでもゲーム出来るようにしてお
  くのが普通だが、思考部分は先手でも後手でも一緒である場合が多い
  だから思考部分のプログラムを別にしパラメータをセットしてそのプログラムを
  実行し、結果を受け取るようにすることでプログラムが半分になる理屈である
  問題なのは思考部分事態も自分自身を再度実行する場合がある事だ
  これを再帰呼び出しという
  例えば先手が先の手を読むのに、後手の指す手を想定しその場合は先手は
  どう指せば有利になるか思考部分を(つまり自分自身を)実行して結果判定
  するといった具合である
 ・表示する場合は全部を空白にしてから再度全体を表示するのは簡単だが
  プログラムが遅くなる危険性がある
  なぜならコンピュータは思考するのは早いが、表示は遅いからである
  そこでラケットやボールが移動した時の方法を使い、画面の中で変化した部分
  だけを再表示するといった方法を考える
  この場合には表示する命令はPRINT(X,Y,模様)のようなものが必要になる
  これも基本命令として予め用意されていないとやりずらい



TOP