Heim Web-Frontend js-Tutorial Reine HTML5-Produktion des Nervous Cat Game – mit Quellcode-Download_Javascript-Kenntnissen

Reine HTML5-Produktion des Nervous Cat Game – mit Quellcode-Download_Javascript-Kenntnissen

May 16, 2016 pm 03:43 PM

Die Webversion des HTML5 Surround the Nervous Cat-Spiels ist ein Spiel, das auf HTML5, jquery, Typescript und anderen Technologien basiert.

Im Anhang finden Sie die Demo und den Download des Quellcodes. Klicken Sie hier Demo ansehen Laden Sie den Quellcode herunter

Ich habe auch versucht, das Minispiel „Surround Nervous Cat“ zu spielen, das letztes Jahr bei WeChat Moments beliebt war. Das Spiel wurde mit der Egret-Engine entwickelt, und da Egret mit der Typescript-Sprache erstellt wurde, wird das Spiel hier auch mit Typescript entwickelt.

Spielregeln:

Klicken Sie auf das graue Gitter auf dem Bildschirm, um die nervöse Katze langsam zu umgeben und zu fangen. Das Spiel ist verloren, wenn die Katze den Rand des Spielfeldes erreicht.

Materialien vorbereiten

Suchen Sie im Internet nach dem Spiel „Surround the Nervous Cat“, öffnen Sie eines und öffnen Sie die Debugging-Oberfläche. Entfernen Sie die Bilder von Katzen, grauen Kreisen, orangefarbenen Kreisen usw. aus dem Netzwerk oder den Ressourcen und speichern Sie sie lokal.

Es ist zu beachten, dass sich das neue MovieCilp-Architekturdesign und der MovieClip-Datenformatstandard etwas von den früheren unterscheiden. Die JSON-Datei von MC ist nach der Änderung gemäß den neuen Daten nicht mehr anwendbar Der Formatstandard lautet wie folgt:

{"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}
 }}
Nach dem Login kopieren

Code schreiben

Fassen Sie hauptsächlich die beiden Hauptprobleme zusammen, auf die ich während des Entwicklungsprozesses gestoßen bin.

Frage 1: Wie soll eine Katze entkommen?

In diesem Spiel kann jeder Kreis drei Zustände haben

ist passierbar, grauer Kreis zeigt

an

Es gibt eine Straßensperre, die nicht durchführbar ist, angezeigt durch einen orangefarbenen Kreis

Besetzt von einer Katze, grauer Kreis mit überlagerter Katzenanimation

Immer wenn Sie auf den grauen Kreis klicken, verwandelt er sich in einen orangefarbenen Kreis, der den Straßensperrzustand darstellt. Gleichzeitig folgt die Katze dem Klick und macht einen Schritt in die Umgebung.

Laufrichtung

Der Spielbereich besteht aus 9*9 Kreisen, und die geraden Linien sind um die Breite des Kreisradius eingerückt. Diese Anordnung führt dazu, dass die Katze theoretisch 6 Laufrichtungen haben kann (nur einen Schritt). einmal), nämlich links, oben links, oben rechts, rechts, unten rechts, unten links. Wenn es sich bei den Kreisen an diesen Positionen um Straßensperren handelt, sind die entsprechenden Richtungen unpassierbar.

Wenn fünf der sechs Nachbarn in den sechs Richtungen Straßensperren sind, dann ist es natürlich einfach, eine Route zu wählen, und der verbleibende ist der einzige Ausweg, aber so einfach kann die Situation natürlich nicht sein. Die häufigere Situation, auf die wir stoßen, ist, dass sich unter den Nachbarn in den sechs Richtungen einige direkt im Straßensperrzustand befinden (diesen Schritt werden wir natürlich nie unternehmen) und andere im passierbaren Zustand sind, aber die Zugänglichkeit zu den Rändern jedes einzelnen besteht andere ist anders.

Zum Beispiel kann die Katze im Bild oben derzeit den Rand erreichen, indem sie drei Schritte in die linke Richtung macht, vier Schritte in die obere rechte und untere rechte Richtung, sie kann den Rand erreichen, indem sie einen Schritt in die Richtung macht Sie können in die obere linke und rechte Richtung gehen, stoßen jedoch auf eine Straßensperre und können den Rand erreichen, indem Sie drei Schritte in die untere linke Richtung gehen und auf eine Straßensperre stoßen. Zu diesem Zeitpunkt sollten wir natürlich die Prioritäten dieser sechs Richtungen ordnen.

Priorität

So setze ich meine Prioritäten:

Die Verkehrsrichtung> zeigt die Richtung der Straßensperre an, wie im Bild gezeigt: links, oben rechts, unten rechts> links oben, rechts, unten links

In Verkehrsrichtung gilt: Je näher am Rand, desto höher die Priorität, wie im Bild gezeigt: links > rechts, oben rechts, unten rechts

In der Richtung, in der Straßensperren auftauchen, gilt: Je mehr Schritte Sie unternehmen können, desto höher ist die Priorität, wie im Bild unten links > rechts, oben links gezeigt

Die Zugänglichkeit dieser Vereinbarungen wird zum Vergleich als numerischer Wert ausgedrückt. Je größer der Wert, desto höher die Priorität.

Fahrtrichtung

accessibility = 1/stepToEdge; //stepToEdge gibt an, wie viele Schritte vom Rand noch übrig sind

Die Richtung, in der die Straßensperre angezeigt wird

accessibility = (-1)/stepToBlock;//stepToBlock stellt die Entfernung von der Straßensperre dar

Überlegen Sie als nächstes, was zu tun ist, wenn der Nenner 0 ist. Im ersten Fall ist der Nenner 0, was bedeutet, dass die Katze derzeit am Rande ist, sodass keine Beurteilung der Priorität erforderlich ist und das Spiel dies getan hat fehlgeschlagen. Im zweiten Fall bedeutet ein Nenner von 0, dass Sie beim Verlassen auf eine Straßensperre stoßen. Diese Richtung ist ohne Berücksichtigung dieser absolut unerreichbar, daher ist ihre Priorität auf -1 gesetzt.

Nach dieser Berechnung sind die Zugänglichkeitswerte in den sechs Richtungen:

Links: 1/3

Oben links: -1

Oben rechts: 1/4

Rechts: -1

Unten rechts: 1/4

Unten links: -1/3

Bei diesem Vergleich sollte die Priorität links > oben rechts > unten rechts > unten links > oben links > rechts sein.

Warum sind die Werte in den Gruppen oben links und rechts, oben rechts und unten rechts eindeutig gleich, wir ordnen sie aber trotzdem in der richtigen Reihenfolge an? Nur weil unsere Berechnung von links ausgeht und sich im Uhrzeigersinn dreht. Wenn die Werte gleich sind, dann kommt es auf die Reihenfolge an, in der sie erscheinen.

In dieser Situation im Bild oben macht die Katze also einen Schritt nach links.

Frage 2: Wie erkennt man, ob eine Katze umzingelt ist?

Als ich dieses Spiel online gespielt habe, habe ich herausgefunden, dass, wenn eine Katze umzingelt ist, sie zu einer „umzingelten“ Aktion wechselt. Wie kann ich also beurteilen, dass die Katze umzingelt ist, und dann ihre Aktionsanimation ändern?

„Belagert“ ist nicht dasselbe wie „gefangen“, es geht dem Zustand „gefangen“ voraus. Wenn die Katze nirgendwo hingehen kann, wird sie „gefangen“ und das Spiel ist gewonnen. „Umzingelt“ bedeutet, dass die Katze noch einen Weg vor sich hat, aber umzingelt ist und bis zum Tod kämpft, wie im Bild unten gezeigt.

Meine Idee ist diese:

Suchen Sie die passierbaren Nachbarn in den sechs Richtungen von der aktuellen Position der Katze aus und beginnen Sie dann mit der Suche nach ihren jeweiligen passierbaren Nachbarn. Suchen Sie auf diese Weise weiter und beurteilen Sie während der Suche die bisher gefundenen. Befinden sich Nachbarn am Rand des Spielbereichs? Wenn ja, endet der Suchvorgang vorzeitig und das Urteilsergebnis lautet: Die Katze ist nicht umzingelt. Werden alle passierbaren Nachbarn gefunden und befindet sich keiner davon am Rand des Spielfeldes, so lautet das Urteilsergebnis: Die Katze ist umzingelt.
Als nächstes verwenden Sie Code, um diesen Beurteilungsprozess zu implementieren.

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

/*
判断传入的circle是否在边界上
 */
private isCircleAtEdge(circle:Circle):boolean {
 ...
}
Nach dem Login kopieren

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

private getCircleNeighbor(circle:Circle,direction:Direction):Circle{
  ...
}
Nach dem Login kopieren

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

/*
能否在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);
     }
    }
   }
  }
 }
}
Nach dem Login kopieren

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

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

Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn

Heiße KI -Werkzeuge

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Clothoff.io

Clothoff.io

KI-Kleiderentferner

Video Face Swap

Video Face Swap

Tauschen Sie Gesichter in jedem Video mühelos mit unserem völlig kostenlosen KI-Gesichtstausch-Tool aus!

Heiße Werkzeuge

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Was soll ich tun, wenn ich auf den Codendruck auf Kleidungsstücke für Front-End-Thermalpapier-Quittungen stoße? Was soll ich tun, wenn ich auf den Codendruck auf Kleidungsstücke für Front-End-Thermalpapier-Quittungen stoße? Apr 04, 2025 pm 02:42 PM

Häufig gestellte Fragen und Lösungen für das Ticket-Ticket-Ticket-Ticket in Front-End im Front-End-Entwicklungsdruck ist der Ticketdruck eine häufige Voraussetzung. Viele Entwickler implementieren jedoch ...

Wer bekommt mehr Python oder JavaScript bezahlt? Wer bekommt mehr Python oder JavaScript bezahlt? Apr 04, 2025 am 12:09 AM

Es gibt kein absolutes Gehalt für Python- und JavaScript -Entwickler, je nach Fähigkeiten und Branchenbedürfnissen. 1. Python kann mehr in Datenwissenschaft und maschinellem Lernen bezahlt werden. 2. JavaScript hat eine große Nachfrage in der Entwicklung von Front-End- und Full-Stack-Entwicklung, und sein Gehalt ist auch beträchtlich. 3. Einflussfaktoren umfassen Erfahrung, geografische Standort, Unternehmensgröße und spezifische Fähigkeiten.

Entmystifizieren JavaScript: Was es tut und warum es wichtig ist Entmystifizieren JavaScript: Was es tut und warum es wichtig ist Apr 09, 2025 am 12:07 AM

JavaScript ist der Eckpfeiler der modernen Webentwicklung. Zu den Hauptfunktionen gehören eine ereignisorientierte Programmierung, die Erzeugung der dynamischen Inhalte und die asynchrone Programmierung. 1) Ereignisgesteuerte Programmierung ermöglicht es Webseiten, sich dynamisch entsprechend den Benutzeroperationen zu ändern. 2) Die dynamische Inhaltsgenerierung ermöglicht die Anpassung der Seiteninhalte gemäß den Bedingungen. 3) Asynchrone Programmierung stellt sicher, dass die Benutzeroberfläche nicht blockiert ist. JavaScript wird häufig in der Webinteraktion, der einseitigen Anwendung und der serverseitigen Entwicklung verwendet, wodurch die Flexibilität der Benutzererfahrung und die plattformübergreifende Entwicklung erheblich verbessert wird.

Wie fusioniere ich Arrayelemente mit derselben ID mit JavaScript in ein Objekt? Wie fusioniere ich Arrayelemente mit derselben ID mit JavaScript in ein Objekt? Apr 04, 2025 pm 05:09 PM

Wie fusioniere ich Array -Elemente mit derselben ID in ein Objekt in JavaScript? Bei der Verarbeitung von Daten begegnen wir häufig die Notwendigkeit, dieselbe ID zu haben ...

Ist JavaScript schwer zu lernen? Ist JavaScript schwer zu lernen? Apr 03, 2025 am 12:20 AM

JavaScript zu lernen ist nicht schwierig, aber es ist schwierig. 1) Verstehen Sie grundlegende Konzepte wie Variablen, Datentypen, Funktionen usw. 2) Beherrschen Sie die asynchrone Programmierung und implementieren Sie sie durch Ereignisschleifen. 3) Verwenden Sie DOM -Operationen und versprechen Sie, asynchrone Anfragen zu bearbeiten. 4) Vermeiden Sie häufige Fehler und verwenden Sie Debugging -Techniken. 5) Die Leistung optimieren und Best Practices befolgen.

Wie kann man Parallax -Scrolling- und Element -Animationseffekte wie die offizielle Website von Shiseido erzielen?
oder:
Wie können wir den Animationseffekt erzielen, der von der Seite mit der Seite mit der offiziellen Website von Shiseido begleitet wird? Wie kann man Parallax -Scrolling- und Element -Animationseffekte wie die offizielle Website von Shiseido erzielen? oder: Wie können wir den Animationseffekt erzielen, der von der Seite mit der Seite mit der offiziellen Website von Shiseido begleitet wird? Apr 04, 2025 pm 05:36 PM

Diskussion über die Realisierung von Parallaxe -Scrolling- und Elementanimationseffekten in diesem Artikel wird untersuchen, wie die offizielle Website der Shiseeido -Website (https://www.shiseeido.co.jp/sb/wonderland/) ähnlich ist ...

So implementieren Sie die Funktion des Ziell- und Drop-Einstellungsfunktion, ähnlich wie bei VSCODE in der Front-End-Entwicklung? So implementieren Sie die Funktion des Ziell- und Drop-Einstellungsfunktion, ähnlich wie bei VSCODE in der Front-End-Entwicklung? Apr 04, 2025 pm 02:06 PM

Erforschen Sie die Implementierung der Funktion des Bedien- und Drop-Einstellungsfunktion der Panel ähnlich wie VSCODE im Front-End. In der Front-End-Entwicklung wird VSCODE ähnlich wie VSCODE implementiert ...

Der Unterschied in der Konsole.log -Ausgabeergebnis: Warum unterscheiden sich die beiden Anrufe? Der Unterschied in der Konsole.log -Ausgabeergebnis: Warum unterscheiden sich die beiden Anrufe? Apr 04, 2025 pm 05:12 PM

Eingehende Diskussion der Ursachen des Unterschieds in der Konsole.log-Ausgabe. In diesem Artikel wird die Unterschiede in den Ausgabeergebnissen der Konsolenfunktion in einem Code analysiert und die Gründe dafür erläutert. � ...

See all articles