2ntブログ

コンピュータゲームにおける乱数

コンピュータゲームの多くは、乱数を使っています。
乱数とは、「規則性が無く全ての数字が同じ割合で出現する」ものです。
簡単に言うと、サイコロですね。

コンピュータはどのような環境化であっても、必ず同じ答えが正確に出るの計算が売りなので、毎回違う結果が出るような処理は苦手です。
1+1は必ず2でなければならないわけで、これが場所や時間が違えば3になったり0になったりしたら困るわけです。

昔のコンピュータゲーム機は、今と比べてCPUの処理スピードも遅かったので、乱数を計算処理で出していませんでした。
乱数表」と呼ばれる、予め高性能なコンピュータ等を使って出した不規則かつ偏りのない数字の羅列をデータとして持ち、それらを使っていました。
ただこの「乱数表」には欠点がありました。
ゲーム開始時から毎回同じ操作をすると、毎回同じ展開になってしまうというものです。
ファミコン時代にはよくありました。
例えばボス戦の直前にセーブしたとします。
あとちょっとの所でボスにクリティカルヒットを食らって死んでしまいました。
するとロードしてやり直しても、必ずクリティカルヒット食らって死んでしまうみたいな事です。
もっともこういう事態を防ぐ為に、「乱数表」を複数持っていて、セーブやロードのタイミングでこれらを変える処理を行うものもありました。

PC9801というWindowsはおろか、その前身であるDOSですらまだ浸透していなかった時代のパソコンゲームに、「天下統一Ⅱ」という名作戦国シミュレーションゲームがありました。
光栄ではなくシステムソフトという、大戦略などを世に送り出して有名になったメーカーのものです。
このゲーム、ある年齢以上になった武将は能力値がどんどん下がる仕様になっていました。
老化というリアルさを出すためだったんでしょう。
これの救済策として、「隠居」というコマンドがありました。
高齢(といっても戦国時代の話なので45歳以上でしたがw)の武将を強制的に隠居させて、代わりに架空の若い跡継ぎを出現させるものです。
架空なので毎回初期能力値が違う者が登場します。
より初期値の高い、優秀な跡継ぎを出したいので、「隠居」を実行する直前にセーブするわけですが、それで凡人以下の能力の跡継ぎしか出なかった時に、ロードしてやり直してもまた同じ能力値の跡継ぎしか出なかったんですw
乱数表を使っていた為ですね。
一応、ロードした後にもう一度何もしないでセーブすると、乱数表が違うものに切り替わるので違う跡継ぎが出せるという回避策はありましたけどね。

さて、コンピュータの性能が良くなった現在は「乱数表」が使われることはありません。
きちんと計算処理で乱数を作っています。
ただやはりコンピュータなので、かなり偏りはありますね。
計算処理で乱数を出す場合、同じ入力値を使って計算したらいくら複雑な計算をしても毎回同じ結果になってしまいますので、「不確定要素」として「時間」を使っている関係でしょう。
今のコンピュータは内部に時計を持っているのが当たり前になっています。
この時計の秒数を使うんです。
何時何分何秒の「何秒」部分ですね。
乱数を出す処理が実行された時に、内部時計の秒針を見に行って、それを元に計算するみたいな事です。
毎回同じ秒数の時に攻撃するとか、そういう操作をするのは困難ですから、理論上は0~60までの毎回違った数値が得られるわけですよ。

ただこの方法も乱数表と同じく欠点はあります。
1秒も違わず操作するのは不可能でも、一定のタイミングで同じような動作をするとか、そういうのは人間できます。
なので毎回同じような結果が出ることもよくあります。
例えば前回の攻撃が時計の秒針が30秒だった時で、今回の攻撃が秒針が35秒だったとします。
乱数としては30と35なので違う数値ですが、コンピュータの乱数を使った攻撃判定って「0~10ならクリティカルヒット」「11~40までなら通常ヒット」「41~50までならちょっと急所を外れた低ダメージ」「51~60なら外れ」みたいなプログラムになってる事が多いので、30と35だと同じ結果になってしまうわけですよw

このようにコンピュータの乱数処理ってのは、リアルのサイコロと違って本当の意味でのランダムな結果って出し難いんですね。
なので乱数を廃したり、極力使わないゲーム作りってのも昔から行われています。
そもそも「乱数」ってのは、「何が起こるか分からない」「毎回違う結果になる」というリアルの世界を再現する手段として用いられてきました。
例えばリアルの世界のゲームで、マージャンとかトランプとかって、始めに配られる牌とか札って毎回違うと思うんですよ、イカサマでもしないかぎり。
それがゲームの面白みでもあります。
良い牌パイや手札の時もあれば、悪い時もある。
それらをコンピュータ上で再現しようとすると、「乱数」を使うしかないんですよね。
野球なんかでも「今日は先発の○○は調子いいですねー」とかよく解説とか実況が言ったりしますよね?
この「調子」を再現するのも「乱数」を使う以外にできません。
先発ピッチャーが前日どんな行動をして、どんなものを食べて、どれだけ寝たかとか、「調子」を決定する人間でも全てを上げるのが不可能なほどのリアルの様々な要素までシミュレートできませんからねw
天候や気温・湿度などもそうでしょう。

でも対戦ゲームとかってあまり乱数は使わなくても実は良いんですよ。
相手が人間であれば、毎回違った動作をするはずです。
人間の操作という「入力値」が毎回違うので、コンピュータの計算結果も毎回それに応じた違うものになるはずだからです。
なのでこの手のゲームは昔と違って最近では攻撃力いくらの人が防御力いくらの人に攻撃をヒットさせたら、必ずいくらのダメージになるみたいな固定計算になってたりします。
「かいしんの いちげき」も「だが かわされてしまった」も無いんですw
正確にはFPS系のゲームだと敵の頭に弾を命中させると、「かいしんの いちげき」みたいなクリティカルヒットになるんですが、これも敵の頭に弾を当てられるかどうかは、自分の操作と相手の動きという毎回違った多くの可能性のある条件が揃わないと無理ですので、乱数を使う必要が無いんですね。

この方がゲームとしては、結果が乱数に左右される「運ゲー」より遥かに面白いです。
ただ「自分も相手もリアルの人間である」という条件が大前提のゲームじゃないと乱数を廃するのは困難です。
昔のコンピュータゲームではこれらを実現するのが難しかったですが、ネットの普及と高性能化によって、友達を家に呼ばなくても、ゲームセンターに行かなくても24時間365日同じ人間相手に遊べる「ネットゲーム」が出来たからこそ増えた仕組みですね。

今後この動きは更に加速するものと思われます。
ゆくゆくは、コンピュータゲームで乱数が使われる事は無くなるでしょう。
なぜなら、いまや家庭用のゲーム機でさえネットに繋がるのが当たり前になりましたから。
相手が人間でなくても、ネットと繋がっていればそこからリアルの世界に連動した不確定要素、例えば気温や湿度などの天候とか、そういうものを引っ張ってきて使えるからです。
この天候情報もいまでこそ1時間ごとの~みたいなのしかありませんが、恐らく未来では時計のように秒単位でリアルタイムに小数点以下何桁という細く変動する数値が提供されるようになるでしょうから。

まぁリアルの世界の、一見ランダム・不規則に見える事象も、人間が認知しきれない大量の条件・要素・入力値による正確な計算の結果なんですけどね。


プログラマに必要な基礎知識(5) オブジェクト指向とは?

最近はいろいろな開発言語があります。
割と新しいタイプの開発言語ってのは、ほぼ全て「オブジェクト指向」のプログラミング言語です。
超初心者がプログラムを勉強しようとすると、この「オブジェクト」ってやつが一番理解に苦しむと思います。
この「オブジェクト」は開発言語の中枢の仕組みであり、これが理解できないとプログラムが組めません。
今回はこの「オブジェクト」とか「オブジェクト指向」が何なのかを、超簡単に解説します。

続きを読む

プログラマに必要な基礎知識(4) 音のデジタル化の仕組み

今回は音の数値データ化、すなわち「デジタル信号」化の話です。

とはいっても「音」ってなんぞや?という基本が分かってないと理解不能になるので、「音」の仕組みをまず述べます。
次に「音」を電気信号に変える、あるいは電気信号化された「音」を人間の耳に聞こえる形に戻す最も簡単で古い方法である「アナログ」信号について。
最後に「アナログ」信号を元に「デジタル」信号にする仕組みを述べます。

続きを読む

プログラムは欧米的思考で作る

日本人プログラマのレベルが欧米に比べて低いのは、コンピュータが欧米で開発されたもので、開発言語なども全て英語が元になっている・・・からではありません。
日本人の思考がプログラムに向いていないからです。

例えば1980円の買い物をした時に2000円出せば2000-1980でお釣りは20円だなって日本人は考えます。
しかし欧米人は1980円に20円足したら2000円になるからお釣りは20円だなって考えるらしいです。

この引き算的考え方が、日本人のプログラム作りを難しくさせている一番の大きな要因です。
つまり過程を思い描くのが下手なんですよ。

「空を自由に飛びたいな」→「はい、タケコプター」これが欧米人
「はい、タケコプター」→「あれ?なんかこれ頭に付けたら空飛べるんだけどwww」これが日本人です、本来は。
日本の文化が欧米でクールと言われるのも、この考え方の違いがあるからですね。
つまり結果ありきで過程を考える欧米人が、思いも付かない結果をなんかやってたら出たってのが日本だからです。

プログラムってのはゲームだろうがビジネスソフトだろうがツールやドライバやOSだろうが、作ろうと思った時にはっきりしているのは「結果」だけです。
何をどういう順番でどうすればその「結果」が出せるかを考えるのが、プログラマの主な仕事と言っても過言ではありません。
お釣りの計算のように、「結果」から「素材」を引けばすぐ答えが出るわけじゃないんですよ。

そもそもCPU自体がそういう風に作られています。

CPUって実は足し算と引き算しかできないって知ってますか?
CPUが直接理解できる命令=マシン語には、A+Bの「+」って命令はありますが、A×Bの「×」は存在しません。
じゃあ掛け算や割り算はどうやっているかっていうと、足し算や引き算を何回も繰り返して実現してるんですよ。
A×BならA+A+A+A+・・・っていう処理をB回繰り返しているんです。

よくプログラマは「数学が得意じゃないとできない」と言われたりしますが、正確には「数学の証明問題が得意じゃないとできない」です。
難しい公式を沢山知っている人より、単純な計算でその結果を出せる方法を考えられる人の方が、プログラマとしては優秀って事になります。
実際、わたし高校の数学の卒業テストは赤点でしたからw

つまり算数、それも小学校低学年レベルの、日常生活に困らない程度の足し算と引き算だけできりゃプログラムは組めるんです。

話がそれましたが、プログラマになりたいなら、小難しい開発言語の本とか買って読んで命令語を覚えるより、学びたい開発言語で作られた、誰かのプログラムを解析した方がいいです。
ExcelでVBA使って普通じゃできないような事ができるようになりたいなら、VBAの解説書やホームページを読むのではなく、「こういう事がしたい」ってので検索して出てきたサンプルプログラムを解析して、「なるほど、だからこうなるのか、こういう風にしているのか!」ってのを学んだ方が遥かに早く使いこなせるようになります。

普段から「何をどうすればそうなるか?」って過程を考える、理屈っぽい人間の方が成功しますって事です。

プログラマに必要な基礎知識 コンピュータグラフィクスの基礎

3Dの計算式だとか画像圧縮の仕組みだとか、そういう難しい上級な話ではありません。
てゆーかそんなもん私も知りませんw
今回はコンピュータで画像を表示する仕組みの基礎を述べます。
具体的には映像をどうやって数値化データにしているのかと、数値化された映像データをどうやって画面に表示しているのかです。

続きを読む

カウンタ
プロフィール

ウホッ!いい男

Author:ウホッ!いい男
異世界転生を待ち続ける中高年のおっさん

最新記事
最新コメント
最新トラックバック
月別アーカイブ
カテゴリ
検索フォーム
RSSリンクの表示
リンク
ブロとも申請フォーム

この人とブロともになる

QRコード
QR