ホームページ ウェブフロントエンド jsチュートリアル Nervous Cat Game の純粋な HTML5 制作 - ソース コード download_javascript スキルを使用

Nervous Cat Game の純粋な HTML5 制作 - ソース コード download_javascript スキルを使用

May 16, 2016 pm 03:43 PM

HTML5 Surround the Nervous Cat ゲームの Web バージョンは、HTML5、jquery、Typescript およびその他のテクノロジーに基づいたゲームです。

デモとソース コードのダウンロードが添付されています。ここをクリックしてください デモを見る ソース コードをダウンロードします

昨年WeChatモーメントで流行ったミニゲーム「Surround Nervous Cat」も遊んでみました。ゲームは Egret エンジンを使用して開発されており、Egret は Typescript 言語を使用して構築されているため、ここでのゲームも Typescript を使用して開発されています。

ゲームルール:

画面上の灰色のグリッドをクリックして、緊張している猫をゆっくり囲んで捕まえます。猫がプレイエリアの端に到達すると、ゲームは失われます。

材料を準備する

インターネットで「Surround the Nervous Cat」ゲームを検索し、ゲームを開き、デバッグ インターフェイスを開きます。猫、灰色の円、オレンジ色の円などの写真をネットワークまたはリソースから削除し、ローカルに保存します。

Egret の新しい MovieCilp アーキテクチャ設計と MovieClip データ形式標準は、以前のものとは若干異なることに注意してください。新しいデータに従って修正された mc の json ファイルは適用されなくなりました。フォーマット標準は次のとおりです:

{"mc":{
 "stay":{
 "frameRate":20,
 "labels":[],
 "frames":[
   {"res":"stay0000","x":0,"y":0},
   {"res":"stay0001","x":0,"y":0},
   {"res":"stay0002","x":0,"y":0},
   {"res":"stay0003","x":0,"y":0},
   {"res":"stay0004","x":0,"y":0},
   {"res":"stay0005","x":0,"y":0},
   {"res":"stay0006","x":0,"y":0},
   {"res":"stay0007","x":0,"y":0},
   {"res":"stay0008","x":0,"y":0},
   {"res":"stay0009","x":0,"y":0},
   {"res":"stay0010","x":0,"y":0},
   {"res":"stay0011","x":0,"y":0},
   {"res":"stay0012","x":0,"y":0},
   {"res":"stay0013","x":0,"y":0},
   {"res":"stay0014","x":0,"y":0},
   {"res":"stay0015","x":0,"y":0}
 ]
 }},
 "res":{
  "stay0000": {"x":0,"y":0,"w":61,"h":93},
  "stay0001": {"x":61,"y":0,"w":61,"h":93},
  "stay0002": {"x":122,"y":0,"w":61,"h":93},
  "stay0003": {"x":183,"y":0,"w":61,"h":93},
  "stay0004": {"x":0,"y":93,"w":61,"h":93},
  "stay0005": {"x":61,"y":93,"w":61,"h":93},
  "stay0006": {"x":122,"y":93,"w":61,"h":93},
  "stay0007": {"x":183,"y":93,"w":61,"h":93},
  "stay0008": {"x":0,"y":186,"w":61,"h":93},
  "stay0009": {"x":61,"y":186,"w":61,"h":93},
  "stay0010": {"x":122,"y":186,"w":61,"h":93},
  "stay0011": {"x":183,"y":186,"w":61,"h":93},
  "stay0012": {"x":0,"y":279,"w":61,"h":93},
  "stay0013": {"x":61,"y":279,"w":61,"h":93},
  "stay0014": {"x":122,"y":279,"w":61,"h":93},
  "stay0015": {"x":183,"y":279,"w":61,"h":93}
 }}
ログイン後にコピー

コードを書く

主に、開発プロセス中に遭遇した 2 つの主な問題をまとめます。

質問 1、猫はどうやって逃げるべきですか?

このゲームでは、各円には 3 つの状態があります

は許容範囲、灰色の丸は

を示します

障害物があり、実行不可能です。オレンジ色の円で示されています

猫が占領しており、猫のアニメーションが重ねられた灰色の円

灰色の円をクリックすると、オレンジ色の円に変わり、同時に猫がクリックに従って周囲へ進みます。

歩く方向

ゲーム領域は 9*9 の円で構成され、偶数番号の線が円の半径の幅だけくぼみます。このレイアウトにより、理論的には猫は 6 つの歩行方向を持つことができます (1 歩のみ)。時間)、つまり、左、左上、右上、右、右下、左下 これらの位置の円が障害物である場合、対応する方向は通行できません。

6 つの方向の 6 つの隣り合う 5 つが障害物である場合、もちろんルートを選択するのは簡単で、残りの 1 つが唯一の脱出方法ですが、状況はそれほど単純ではないことは明らかです。私たちが遭遇するより一般的な状況は、6 つの方向の隣接するものの中に、直接通行止め状態にあるもの (当然、このステップを実行することはありません) と、通行可能な状態にあるものもありますが、それぞれの端へのアクセスが困難であるというものです。他は違います。

たとえば、上の写真では、現在、猫は左方向に 3 歩、右上と右下方向に 4 歩歩くと端に到達できますが、右方向に 1 歩歩くと端に到達できます。左上と右の方向に進みますが、障害物に遭遇し、左下方向に 3 歩歩いて障害物にぶつかると端に到達できます。このとき、当然、この6つの方向性の優先順位を付けるべきです。

優先度

これが私の優先順位の設定方法です:

交通の方向> は、図に示すように、障害物の方向を示します: 左、右上、右下> 左上、右、左下

図に示すように、交通方向において、端に近いほど優先度が高くなります: 左 > 右、右上、右下

下の図左>右、左上に示すように、障害物が現れる方向に歩数が多いほど優先度が高くなります

これらの契約のアクセシビリティを数値で表し、この値が大きいほど優先度が高くなります。

進行方向

accessibility = 1/stepToEdge; //stepToEdge はエッジから残りのステップ数を示します

障害物が現れる方向

accessibility = (-1)/stepToBlock;//stepToBlock は障害物からの距離を表します

次に、分母が 0 の場合を考えます。最初のケースでは、分母が 0 で、現在猫が有利であることを意味するため、優先順位を判断する必要はなく、ゲームは失敗した。 2 番目のケースでは、分母が 0 であることは、外に出たときに障害物に遭遇することを意味するため、この方向を考慮せずに到達することは絶対に不可能であるため、優先度は -1 に設定されます。

この計算の後、6 方向のアクセシビリティ値は次のようになります:

左: 1/3

左上: -1

右上: 1/4

右: -1

右下: 1/4

左下: -1/3

この比較では、左 > 右上 > 右下 > 左下 > 左上 > 右の順に優先します。

左上と右上、右上と右下のグループ内の値が明らかに同じであるにもかかわらず、順番に並べているのはなぜですか?これは、計算が左方向から開始され、時計回りに回転するためです。値が同じ場合、それは出現する順序によって異なります。

つまり、上の写真のこの状況では、猫は左に一歩進みます。

質問 2、猫が囲まれているかどうかを確認するにはどうすればよいですか?

このゲームをオンラインでプレイしているときに、猫が囲まれると「囲まれる」アクションに変わることがわかりました。では、猫が囲まれたことをどのように判断してアクションアニメーションを変更するのでしょうか?

「包囲された」は「捕らえられた」と同じではなく、「捕らえられた」状態に先行します。猫の行き場がなくなったら「捕まえ」てゲームに勝ちます。 「囲まれた」とは、下の写真に示すように、猫にはまだ進むべき道があるにもかかわらず、囲まれて死ぬまで苦戦していることを意味します。

私のアイデアは次のとおりです:

猫の現在位置から6方向にある通行可能な隣人を見つけ、その隣からそれぞれの通行可能な隣人を探し続け、探索しながら、これまでに見つかった隣人を判断します。遊び場の端に隣人がいますか? もしいる場合、探索プロセスは早期に終了し、猫は囲まれていないと判断されます。通行可能な隣人がすべて見つかり、それらのどれもゲームエリアの端にない場合、判定結果は「猫は囲まれている」となります。
次に、この判定プロセスをコードを使用して実装します。

首先,需要准备一个方法,判断圆圈是否已经处在圆圈边缘了,假设这个方法名及参数如下,内部实现比较简单这里就不贴了。

/*
判断传入的circle是否在边界上
 */
private isCircleAtEdge(circle:Circle):boolean {
 ...
}
ログイン後にコピー

再准备一个方法,获取某圆圈周围某方向的邻居。

private getCircleNeighbor(circle:Circle,direction:Direction):Circle{
  ...
}
ログイン後にコピー

最后,是判断的核心方法。

/*
能否在circle位置出发找到路线到达边缘
*/
private canExitAt(circle:Circle):boolean{
 var ignoreArr=[];//不用再处理的circle集合
 var toDealWithArr=[circle];//还需进行判断的circle集合
 while(true){
  if(toDealWithArr.length<1){
   return false;
  }else{
   var _first=toDealWithArr.shift();
   ignoreArr.push(_first);
   if(_first.getStatus()!==CircleStatus.Blocked&&this.isCircleAtEdge(_first)){
    return true;
   }else{
    for(var i=Direction.LEFT;i<=Direction.BOTTOM_LEFT;i++){
     var nbr=this.getCircleNeighbor(_first,i);
     if(!(ignoreArr.indexOf(nbr)>-1||toDealWithArr.indexOf(nbr)>-1))
     if(nbr.getStatus()!==CircleStatus.Available){
      ignoreArr.push(nbr);
     }else{
      toDealWithArr.push(nbr);
     }
    }
   }
  }
 }
}
ログイン後にコピー

在方法体的最开始,准备好两个数组,一个用来存储不用再处理的圆圈集合ignoreArr,另一个用来存储还需要进行判断的圆圈集合toDealWithArr。每找到一个可通行的邻居,首先要判断它是不是第一次出现(因为几个圆圈可能会有共同的邻居,所以一个圆圈可能因为它是多个圆圈的邻居而被找到多次),判断的标准就是它有没有出现在ignoreArr或toDealWithArr里,如果没有那么就是第一次出现,如果它是路障,那么塞到ignoreArr,如果不是路障,那么推入toDealWithArr尾部等待判断。

每次循环开始时,我们会从toDealWithArr头部弹出一个圆圈对象,对它是否在边缘做判断,如果是,那么返回true跳出循环,猫没有被围住,它可以通过某条路线到达边缘。如果toDealWithArr全部判断完了都不在边缘,那么返回false,猫被围住了,它的直接邻居及众多间接邻居中没有一个是在边缘的。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

フロントエンドのサーマルペーパーレシートのために文字化けしたコード印刷に遭遇した場合はどうすればよいですか? フロントエンドのサーマルペーパーレシートのために文字化けしたコード印刷に遭遇した場合はどうすればよいですか? Apr 04, 2025 pm 02:42 PM

フロントエンドのサーマルペーパーチケット印刷のためのよくある質問とソリューションフロントエンド開発におけるチケット印刷は、一般的な要件です。しかし、多くの開発者が実装しています...

誰がより多くのPythonまたはJavaScriptを支払われますか? 誰がより多くのPythonまたはJavaScriptを支払われますか? Apr 04, 2025 am 12:09 AM

スキルや業界のニーズに応じて、PythonおよびJavaScript開発者には絶対的な給与はありません。 1. Pythonは、データサイエンスと機械学習でさらに支払われる場合があります。 2。JavaScriptは、フロントエンドとフルスタックの開発に大きな需要があり、その給与もかなりです。 3。影響要因には、経験、地理的位置、会社の規模、特定のスキルが含まれます。

javascriptの分解:それが何をするのか、なぜそれが重要なのか javascriptの分解:それが何をするのか、なぜそれが重要なのか Apr 09, 2025 am 12:07 AM

JavaScriptは現代のWeb開発の基礎であり、その主な機能には、イベント駆動型のプログラミング、動的コンテンツ生成、非同期プログラミングが含まれます。 1)イベント駆動型プログラミングにより、Webページはユーザー操作に応じて動的に変更できます。 2)動的コンテンツ生成により、条件に応じてページコンテンツを調整できます。 3)非同期プログラミングにより、ユーザーインターフェイスがブロックされないようにします。 JavaScriptは、Webインタラクション、シングルページアプリケーション、サーバー側の開発で広く使用されており、ユーザーエクスペリエンスとクロスプラットフォーム開発の柔軟性を大幅に改善しています。

JavaScriptを使用して、同じIDを持つArray要素を1つのオブジェクトにマージする方法は? JavaScriptを使用して、同じIDを持つArray要素を1つのオブジェクトにマージする方法は? Apr 04, 2025 pm 05:09 PM

同じIDを持つ配列要素をJavaScriptの1つのオブジェクトにマージする方法は?データを処理するとき、私たちはしばしば同じIDを持つ必要性に遭遇します...

Shiseidoの公式Webサイトのように、視差スクロールと要素のアニメーション効果を実現する方法は?
または:
Shiseidoの公式Webサイトのようにスクロールするページを伴うアニメーション効果をどのように実現できますか? Shiseidoの公式Webサイトのように、視差スクロールと要素のアニメーション効果を実現する方法は? または: Shiseidoの公式Webサイトのようにスクロールするページを伴うアニメーション効果をどのように実現できますか? Apr 04, 2025 pm 05:36 PM

この記事の視差スクロールと要素のアニメーション効果の実現に関する議論では、Shiseidoの公式ウェブサイト(https://www.shisido.co.co.jp/sb/wonderland/)と同様の達成方法について説明します。

JavaScriptは学ぶのが難しいですか? JavaScriptは学ぶのが難しいですか? Apr 03, 2025 am 12:20 AM

JavaScriptを学ぶことは難しくありませんが、挑戦的です。 1)変数、データ型、関数などの基本概念を理解します。2)非同期プログラミングをマスターし、イベントループを通じて実装します。 3)DOM操作を使用し、非同期リクエストを処理することを約束します。 4)一般的な間違いを避け、デバッグテクニックを使用します。 5)パフォーマンスを最適化し、ベストプラクティスに従ってください。

Console.log出力の違い結果:なぜ2つの呼び出しが異なるのですか? Console.log出力の違い結果:なぜ2つの呼び出しが異なるのですか? Apr 04, 2025 pm 05:12 PM

Console.log出力の違いの根本原因に関する詳細な議論。この記事では、Console.log関数の出力結果の違いをコードの一部で分析し、その背後にある理由を説明します。 �...

フロントエンド開発でVSCodeと同様に、パネルドラッグアンドドロップ調整機能を実装する方法は? フロントエンド開発でVSCodeと同様に、パネルドラッグアンドドロップ調整機能を実装する方法は? Apr 04, 2025 pm 02:06 PM

フロントエンドのVSCodeと同様に、パネルドラッグアンドドロップ調整機能の実装を調べます。フロントエンド開発では、VSCODEと同様のVSCODEを実装する方法...

See all articles