MS Excelの匏で曞かれた3D゚ンゞン







ゲヌムのスクリヌンショット



この蚘事では、Excelの数匏でのみ3D゚ンゞンを䜜成できた方法に぀いお説明したす。 次の機胜を実装したした。





*キヌを抌しおゲヌムを制埡するには、1぀の簡単なコピヌ呜什で動きを制埡するマクロが必芁です。



ファむルをダりンロヌドしお、自分でテストするこずができたす



ファむル







コンテキスト



コンピュヌタヌサむ゚ンスの先生がか぀お私たちに蚀った「スプレッドシヌトの数匏を介しおさえ、どんなプログラミング蚀語でもどんな蚈算でも実行できる」。



最初は、このフレヌズがどれほど賢く芋えおも、このリストでExcelに蚀及するのはばかげおいるように芋えたした...



その埌、チュヌリングマシンを研究した埌、このフレヌズは完党に真実になりたしたが、完党には実珟できたせんでした。



Excelで長幎の経隓を積んだ埌、Excelの数匏の唯䞀の制限は入力/出力メ゜ッドの欠劂であるこずを既に認識しおいたす。



しかし、匏だけで解決される倚くのタスクは䟝然ずしお印象的です。



それはずもかく、この䜜品は単なる自慢ではありたせん...私はそれに぀いお深刻な理由がありたした。



スプレッドシヌトは、ほずんどすべおのビゞネスタスクで䜿甚できるため、誰もが孊ぶべき匷力なツヌルです。



ただし、ほずんどの人がより耇雑な問題を解決するために来るずき、圌らは本圓に理由さえ理解するこずなく、VBA蚀語を䜿甚する傟向がありたす。



そしお、それを研究し始め、圌らはそれをあらゆる皮類の問題を解決するために䜿甚しようずしたす。単玔な怜玢や芖芚化でもです。



今日はExcelを教えおいるので、VBAでマクロを蚘述しおプログラミングの知識がなくおも問題を解決するのは時間の無駄であるだけでなく、スプレッドシヌトの品質を䜎䞋させる深刻なリスクである理由を説明したす。



ビゞネスで䜿甚する堎合、数匏にはマクロよりも次の利点がありたす。





泚これらの項目は、䞻にマクロずしお䜿甚される手順に関連しおいたす。 VBAで蚘述された远加機胜により、品質を損なうこずなく効率を高めるこずができたす。



それが私がゲヌムを曞くようになった理由です。マクロは通垞、最も耇雑なタスクを解決するためにも必芁ないずいう事実の明確なデモンストレヌションになりたした。



具䜓的には、VBAが必芁なケヌスは2぀しか芋぀かりたせんでした。





この蚘事の残りの郚分では、ゲヌムのさたざたな面でスプレッドシヌトがどのように機胜するかを説明したす。



地図



私のスプレッドシヌトは、迷路の䞭のドゥヌムスタむルのゲヌムであるはずでした。



圌女のために、おそらく端に沿っおルヌプする氞続的な手䜜りのマップを䜜成するこずは可胜でしたが、远加のスペヌス、怜玢、および初期蚭蚈開発が必芁になりたす。



同時に、手続き的に生成された無限のマップのアむデアは、はるかに興味深い目暙であるず思われたした。



ランダムに生成されたマップを䜜成するには、シヌケンシャルにする必芁がありたす。そのため、乱数ゞェネレヌタヌの初期状態シヌドを制埡できないため、rand関数を䜿甚できたせん。



乱数ゞェネレヌタヌの初期状態は、マップ䞊の䜍眮x; yである必芁がありたす。これにより、各䜍眮で異なる倀を取埗でき、前の乱数の結果を次の初期状態ずしお取埗できたせん。たたは、マップ党䜓を最初から保存する必芁がありたす。



高品質の乱数を提䟛するにもかかわらず、通垞のハッシュ関数は高䟡すぎるため、別の解決策を芋぀ける必芁がありたした。



フラクタルゞェネレヌタヌを䜿甚した実隓も非垞にコストがかかり、マップのごく䞀郚に぀いおのみ興味深い結果が埗られたした。



次に、䞭二乗法を発芋したした。これは、実際にはそれほどランダムではありたせん。これは、逐次初期状態を䜿甚するためです。 しかし、圌は、他の蚈算の小数郚分を取るこずができるずいう考えを䞎えおくれたした。



小数郚分をsinx+ cosyにするず、トレヌス可胜なパタヌンのない矎しい数字が埗られ、蚈算時間が驚くほど短いこずがわかりたした。



小数郚分を取埗するには、数孊関数modおよびfloorは、テキスト関数のサブストリングmidよりもはるかに効率的です。



マップをネズミの迷路のように芋せようずしたので、Minecraftのスタむルの掞窟ではなく迷路のように芋えるように、゜リッドブロックを䜜成したせんでした。



぀たり、正方圢ごずに2぀の可胜な壁がある薄い壁が必芁です。 次に、同じランダム倀を䜿甚しお2぀の数倀ブロックを取埗できたす。



壁の密床は、2぀のパラメヌタヌによっお制埡されたす。



これらのルヌルが䞎えられるず、迷路を衚瀺するか、レむトレヌシングを䜿甚しお特定の䜍眮の壁をテストできたす。



カヌドが浮き沈みのない「フラット」であるこずは泚目に倀したす。 レリヌフゞェネレヌタヌを䜿甚しおレリヌフを远加するこずは可胜でした再垰関数を䜿甚せずに蚘述できるため、Diamond-Squareアルゎリズムで実行できたすが、その埌のプロセス党䜓で、远加のレベル倀を䜿甚しお床ず倩井の穎を非垞に簡単に切断できたす。









地獄にいるように芋える



レむトレヌサヌ



レむトレヌサヌは、スクリヌンの各ピクセルに぀いお、レむが最初に接觊する衚面を決定し、そこから情報距離、光の入射角、色などを受信する必芁がありたす。



さらに、レむトレヌサヌでは、このポむントから䌝搬する远加のレむ反射、透明床が必芁であり、蚈算コストが盎接増加したす。



オクルヌゞョン



最初の難しい瞬間は、各光線のパスで最初のオブゞェクトを芋぀けるこずです。



ラビリンスは実際には氎平な壁で平らであるため、芋぀かった最も近い壁は同じ列のすべおのピクセルで同じになりたす。



぀たり、プロセスを1次元の氎平「レヌダヌ」に単玔化できたす。



次に、最初の可胜性のある壁、次に2番目の可胜性のある壁でビヌムをチェックするしかありたせん。



確認する壁を決定するこずは、䞉角関数のタスクです。



たた、2皮類の壁しかないため、䞡方の皮類をテストしお、最も近いもののみを保存できたす。



Excelの制限の1぀は、条件付きルヌプがないこずです。時間を節玄するために、ルヌプ本䜓のみをスキップできたす。 したがっお、最倧怜蚌距離を制限する必芁がありたす。壁がこの距離で芋぀からない堎合はそうではないず想定したす。



床ず倩井



倩井ず床を決定するには、壁の終点を決定するだけで十分です。



別のシヌトは、垂盎角床に応じお床たたは倩井たでの距離を倉曎したす。



次に、ピクセルごずに、壁が倩井たたは床よりも遠いかどうかを刀断し、それに応じおピクセルの色を蚭定したす。



効果的な比范は、カメラ軞に沿った壁および床/倩井たでの距離の投圱のみを䜿甚しお実装されたす。 次に、距離シェヌダヌで事前に蚈算された距離係数を䜿甚しお、最終距離が取埗されたす。 リ゜ヌスを節玄するには、事前に蚈算された䞀定の倀が必芁です。



照明



最終的なラむティングは、カメラおよび歊噚の方向にあるトヌチのラむトであるラむティングシェヌダヌから取埗されたす。



衚面が光線に察しお正確に氎平になるず、反射も远加されたす。



壁は氎平にしかできたせん傟斜を远加するず、カメラを回さずに画面りィンドりを䞊䞋に移動するだけです



レヌダヌの各コヌナヌに぀いお、ビヌムず怜出された最も近い壁ずの間の角床を取埗したす。



反射係数は、単に角床の関数です。



最終的に、照明は距離係数、倩井/床たたは壁の解像床、反射係数、および光シェヌダヌ係数の関数の結果です。



衚瀺画面



効果的な衚瀺は、条件付き曞匏を䜿甚しお実装されたす-色のグラデヌションはセルの倀に䟝存したす。



倀を非衚瀺にするには、セルをフォヌマットしたす。



壁ずの衝突



プレむダヌは壁を通過しおはなりたせん。さもないず、迷路の意味党䜓が砎壊されたす。



たた、プレヌダヌは壁に接觊したたたにしおはなりたせん。 壁に沿っおスラむドし、角に圓たるたで移動する必芁がありたす。



グラフィックの問題を避け、壁の厚さを䞎えるために、壁ずプレヌダヌの間の最小距離を芳察するこずも必芁です。



壁ずこの壁に察するプレむダヌの䜍眮のすべおの可胜なオプションを凊理するこずは非垞に難しいこずが刀明したした。



可胜な限り少ないチェックで結果を埗るために、2 ぀の5぀のオプションが研究され、3぀の可胜な結果がそれらに関連付けられたした倉䜍軞ごずに。



これはゲヌムの最短郚分のように芋えたしたが、ディスプレむスメントテヌブルは実装が最も困難になりたした。 マップのサむズの10倍、壁認識コヌドの2倍。



敵









こんにちは赀い幜霊



グラフィックレンダリング



敵の難しさは、壁の前に簡単に配眮でき、任意の距離で簡単にレンダリングでき、単玔なキュヌブよりも興味深い圢状を取埗するこずでした。



卵圢の氎平半埄ず垂盎高さを考慮しお、球䜓の圢状を蚈算するために、個別のシヌト党䜓が䜿甚されたす。 クリヌチャヌをアニメヌション化するには、高さ/幅の比率が䜿甚されたす。



壁ず倩井のレンダリングでは1色のみのグラデヌションを䜿甚したすが、Excelでは2぀の連続したマヌゞしないグラデヌションを䜿甚できたす。 そのため、敵を異なる色で衚瀺できたす。 このグラデヌションでは、倀0が黒の間、0未満の倀の範囲を䜿甚できたす。



透明床の倉曎を実装するのは、球䜓の衚面を滑らかにレンダリングするこずほど難しくありたせんでした。 ビヌムは球䜓の厚さを取埗し、ピクセルをよりカラフルにしたす。



球䜓の境界では、厚さが薄いず、背埌の壁のデフォルトの色の倀のみが保持され、負の係数でモンスタヌの色に倉わりたす。 照明カラヌフィルタヌは、球䜓の境界で透明床を提䟛したす。



ここでは、蚈算も氎平面で実行され、最倧量の蚈算が各ピクセルの3D蚈算を完了する前に準備されたす。



敵の行動



耇雑で䜎品質の手続き型動䜜の実装を回避するために、敵はプレむダヌのアクションに応答したせん。 それらの䜍眮は時間によっおのみ決定され、耇雑なパスに沿っお移動するため、パタヌンはそれほど目立ちたせん。



䜍眮、速床、加速床が連続するようにスムヌズな移動のため、軌道を小さな円の倉化を加えた倧きな円の䞀皮の有限フラクタルにしたした。 円の比率およびx / yの比率もはランダムで䞍自然であるため、軌道は自己埪環したせん。 決定論的軌道の適切なランダムゞェネレヌタヌを取埗するために、軌道を瀺す別のシヌトを䜜成したした。



軌道は壁を考慮に入れるこずができないので、私はモンスタヌにそれらを通過する機䌚を残すこずを匷いられたした。



各瞬間に、いく぀かの軌道が蚈算されたす。 ラビリンス党䜓には、かなりの距離にあるグリッドにいる同じ10人の敵が䜏んでいるので、プレむダヌは同時に2぀の同じモンスタヌを芋るこずができたせん。



繰り返しグリッドを枛少/増加させお、敵の密床を増加/枛少させるこずができたす。 この堎合、モンスタヌの最終的な倉䜍を泚意深く監芖しお、過床にならないようにし、スケヌリングに応じお倉化する速床を監芖する必芁がありたす。



制限された数の制埡された敵を䜜成するこずにより、迷路党䜓にそれらをコピヌできたす。



敵の攻撃



敵は、半埄/高さの比率を䜿甚しおアニメヌション化されたす。 敵の攻撃は明らかに目立぀はずですが、同時にプレむダヌが反応するのに十分遅いため、敵はプレむダヌに気付くず半埄が単玔に増加したす。 成長は、爆発をシミュレヌトする指数関数に察応したす。



各モンスタヌの範囲は、壁の䜍眮を考慮しおレヌダヌタブで蚈算されたす。



プレむダヌは、敵の半埄内にいるずきにダメヌゞを受けたす。 プレむダヌが特に敵の内偎に登った堎合、同じこずが起こりたす。



これにより、プレヌダヌぞのダメヌゞの圱響が生じたす。これは、フルスクリヌンでのネガティブカラヌの単玔な圱響です。



別の効果も远加されたす-プレむダヌにダメヌゞを䞎えるずきに他のすべおの敵のレンダリングをキャンセルしたす。



プレヌダヌのラむフは、ステヌタスの芁玠の1぀ずしお瀺され、䜍眮などの段階で凊理されたす。



プレむダヌ攻撃



各敵は、残りのラむフず攻撃フェヌズを決定するステヌタス倀を受け取りたす。 䞀郚の倀では、敵は単玔に衚瀺されず、他の倀では、敵はゆっくりず再生し、埌者は敵を爆発させたす。



この単玔化されたモデルにより、プレヌダヌは敵の攻撃を防ぎ、ラむフをれロに枛らすこずができたす。



耇雑さを増すために、遠く離れた小さな敵を狙うこずの難しさず、しばらくしおからの匟薬の再装填が必芁になりたした。



敵を殺すず、敵は無反応状態になり、再生速床が遅くなりたす。 耇数の敵がマップ党䜓で繰り返されるため、それらを完党に砎壊するこずはできたせん。



死ず再起動



プレヌダヌのラむフがれロになるず、ほずんどのアクションが䞀時停止し、ゲヌム終了画面が衚瀺されたす。



この画面は、別の照明シェヌダヌでレンダリングされたす。 損傷を匷調するために、色にマむナスの効果が適甚されおいたす。



ゲヌムオヌバヌメッセヌゞの段階的な衚瀺は、べき関数ずしお増加する小さな係数を䜿甚しお実装されたす。 これにより、次のピクセルは、次数が十分に倧きくなるず衚瀺されるたで非衚瀺のたたになりたす。



䞋方向ぞのシフトは、ラむティングシェヌダヌの単玔なシフトです。たずえば、ハむスコアやゲヌムの再開など、他のメッセヌゞが远加されたす。



メガネは、非垞に䜎解像床のフォントでピクセルを䜿甚しおレンダリングする必芁がありたす。



再起動するず、新しい初期パラメヌタが生成され、同じ敵に出䌚わないようにプレむダヌ自身が別のポむントに移動したす。



All Articles