Seiteneffekt: Das Snake-Spiel wird mithilfe des Mediator-Modells entwickelt. Unser Snake-Fall wird nicht wie zuvor in einer einzigen HTML-Datei geschrieben, sondern in Klassen aufgeteilt. Jede Klasse wird durch ein separates JS repräsentiert, und die Mediator-Klasse ist die Spielklasse. 1. InitialisierungsstrukturZuerst müssen wir die Seite initialisieren. Das Initialisierungslayout wird nicht direkt in das HTML-Tag geschrieben, sondern über den Spielknotenbaum initialisiert Wir haben eine Tabelle mit 20 Zeilen und 20 Spalten erstellt, wobei wir this.row zur Darstellung der Zeilen und this.col zur Darstellung der Spalten verwenden. Games.prototype.init = Funktion () { this.dom = Dokument.createElement('Tabelle'); var tr, td; //Durchlaufe den Zeilen- und Spaltenbaum für (var i = 0; i < this.row; i++) { // Durchlaufe die Zeilen und erstelle einen Baum auf dem Knoten tr = document.createElement('tr'); für (var j = 0; j < this.col; j++) { // Spalte durchlaufen und einen Baum auf dem Knoten erstellen td = document.createElement('td'); // Den Knoten an den Baum anhängen tr.appendChild(td); // Den Knoten an den Baum anhängen this.dom.appendChild(tr); } } // Baum in der Tabelle document.getElementById('app').appendChild(this.dom); } Ergebnis: 2. Die Farbe der Schlange darstellenLogik zum Rendern von Schlangen: Die Schlangenklasse ruft die Methode setColor der Game-Klasse auf, da es im Wesentlichen darum geht, die Farbe der Tabelle zu rendern. Die Tabelle wird beim Initialisieren der Game-Klasse erstellt, daher ist es sinnvoll, Game die Methode zum Rendern der Farbe festlegen zu lassen. // Methode zum Einstellen der Farbe Games.prototype.setColor = function (row, col, color) { // Legen Sie die Farbe der Zeile und Spalte der Tabelle fest this.dom.getElementsByTagName('tr')[row].getElementsByTagName('td')[col].style.backgroundColor = color; } An diesem Punkt lassen wir die Snake-Klasse die setColor-Methode des Spiels aufrufen Snake.prototype.render = Funktion () { // Rendering der Schlange game.setColor(this.body[0].row, this.body[0].col, 'pink'); // Schlangenkörper für (var i = 1; i < this.body.length; i++) { Spiel.setColor(dieser.Körper[i].Zeile, dieser.Körper[i].col, 'himmelblau'); } } An diesem Punkt stellt sich die Frage: Wer wird Snakes Render aufrufen? Wir können game nicht abrufen, indem wir es im Konstruktor unseres Snake aufrufen, da die vier Schritte der Game-Klasse noch nicht ausgeführt wurden und es daher jetzt undefiniert ist. Die Lösung besteht darin, den Timer aufzurufen, da der Timer asynchron ist und daher die Ausführung der vier Schritte der Spielklasse nicht verhindert. dieser.Timer = setzeIntervall(Funktion () { // Der Kern des Timers ist die Essenz des Spiel-Renderings: Bildschirm löschen – aktualisieren – rendern // Snake rendern game.snake.render(); }, 20); Ergebnis: 3. SchlangenbewegungDie Bewegung der Schlange stellt eigentlich eine Aktualisierung des Körperarrays dar. Im Wesentlichen wird der Schwanz des Körperarrays gelöscht und der Kopf hinzugefügt, damit die Schlange den neuen Zustand rendert. Snake.prototype.update = Funktion () { // Die aktuelle Richtung erhält willdirection diese.Richtung = diese.wirdRichtung; Schalter (diese.Richtung) { Fall 'R': this.body.unshift({ 'row': this.body[0].row, 'col': this.body[0].col + 1 }); brechen; Fall 'D': this.body.unshift({ 'Zeile': this.body[0].Zeile + 1, 'Spalte': this.body[0].col }); brechen; Fall 'L': this.body.unshift({ 'Zeile': this.body[0].Zeile, 'Spalte': this.body[0].col - 1 }); brechen; Fall 'T': this.body.unshift({ 'Zeile': this.body[0].Zeile - 1, 'Spalte': this.body[0].col }); brechen; } An diesem Punkt werden Sie feststellen, dass die Schlange immer länger wird Da wir der Schlange gerade gesagt haben, wie sie die Farbe rendern soll, müssen wir das vorherige Rendering löschen Wir haben eine Methode zum Löschen des Bildschirms für Spiele festgelegt // Bildschirm löschen Games.prototype.clear = function () { für (var i = 0; i < diese.Zeile; i++) { für (var j = 0; j < this.col; j++) { this.dom.getElementsByTagName('tr')[i].getElementsByTagName('td')[j].style.backgroundColor = '#fff'; this.dom.getElementsByTagName('tr')[i].getElementsByTagName('td')[j].innerHTML = ''; } } } Als nächstes führen wir die drei Schritte des Spiels im Timer aus: Bildschirm löschen-Update und Rendern // Bildschirm löschen game.clear(); //Schlangenbewegung/-aktualisierung //Aktualisierungsgeschwindigkeit der Schlange Wenn die Schlangenseite länger ist, erhöht sich die Geschwindigkeit var während = game.snake.body.length < 30 ? 30 - game.snake.body.length : 1; // Snake-Update game.f % während == 0 und game.snake.update(); // Rendere die Schlange game.snake.render(); Die Schlange bewegt sich in verschiedene Richtungen. Sie können ein BindEvent-Ereignis für Game festlegen, um Tastaturereignisse zu überwachen, verschiedene Richtungen zu ändern und festzulegen, dass die Aufwärtstaste nicht gedrückt werden kann, wenn sich der Schlangenkopf nach unten bewegt. Games.prototype.bindEvent = Funktion () { var selbst = dies; //Tastaturereignis document.onkeydown = function (even) { Schalter (gerade.Schlüsselcode) { Fall 37: // Beurteilen Sie zunächst, ob die aktuelle Richtung nach rechts geht. Wir können zu diesem Zeitpunkt nicht die linke Taste drücken, wenn (self.snake.direction == 'R') return; selbst.snake.changeDirection('L'); brechen; Fall 38: // Beurteilen Sie zunächst, ob die aktuelle Richtung nach unten geht. Wir können zu diesem Zeitpunkt nicht die Aufwärtstaste drücken, wenn (self.snake.direction == 'D') return; self.snake.changeDirection('T'); brechen; Fall 39: // Beurteilen Sie zunächst, ob die aktuelle Richtung nach links geht. Wir können zu diesem Zeitpunkt nicht die rechte Taste drücken, wenn (self.snake.direction == 'L') return; selbst.snake.changeDirection('R'); brechen; Fall 40: // Beurteilen Sie zunächst, ob die aktuelle Richtung nach oben geht. Wir können die Taste derzeit nicht drücken, wenn (self.snake.direction == 'T') return; selbst.snake.changeDirection('D'); brechen; } } } Zu diesem Zeitpunkt muss die Snake-Klasse auch eine entsprechende Richtungsübereinstimmung haben. Wir setzen this.direction='R' beim Initialisieren von Snake. Snake.prototype.update = Funktion () { // Die aktuelle Richtung erhält willdirection diese.Richtung = diese.wirdRichtung; Schalter (diese.Richtung) { Fall 'R': this.body.unshift({ 'row': this.body[0].row, 'col': this.body[0].col + 1 }); brechen; Fall 'D': this.body.unshift({ 'row': this.body[0].row + 1, 'col': this.body[0].col }); brechen; Fall 'L': this.body.unshift({ 'Zeile': this.body[0].Zeile, 'Spalte': this.body[0].col - 1 }); brechen; Fall 'T': this.body.unshift({ 'Zeile': this.body[0].Zeile - 1, 'Spalte': this.body[0].col }); brechen; } 4. So stellen Sie den Tod einer Schlange fest Es gibt zwei Möglichkeiten, den Tod einer Schlange festzustellenDas erste ist, dass die Schlange selbst den Tischteil überschreitet // Der Teil, der über den Rand der Tabelle hinausragt, wenn (this.body[0].col > game.col - 1 || this.body[0].row > game.row - 1 || this.body[0].col < 0 || this.body[0].row < 0) { alert('Spiel vorbei, Ihr aktueller Punktestand ist ' + game.score); clearInterval(spiel.timer); dies.body.shift(); clearInterval(spiel.timer); } Der zweite Grund besteht darin, dass sich die Schlange selbst mit einem Teil ihres Körpers überlappt. // treffe dich selbst für (var i = 1; i < this.body.length; i++) { wenn (dieser.body[0].col == dieser.body[i].col && dieser.body[0].row == dieser.body[i].row) { alert('Spiel vorbei, Ihr aktueller Punktestand ist ' + game.score); dies.body.shift(); clearInterval(spiel.timer); } } 5. Herstellung von LebensmittelnAn diesem Punkt erstellen wir eine Food-Klasse, um Lebensmittel zu produzieren, instanziieren sie im Spiel und rendern sie in einem Timer Wenn wir die Reihe und Spalte mit dem Futter zufällig generieren, prüfen wir zunächst, ob es sich auf der Schlange befindet. Funktion Essen(SpielSchlange) { var selbst = dies; // Standort des Futters // Die do-while-Schleifenanweisung erstellt zuerst eine Zeile und eine Spalte und ermittelt dann, ob sich die Zeile und die Spalte auf der Schlange befinden. do { diese.Zeile = parseInt(Math.random() * gameSnake.Zeile); this.col = parseInt(Math.random() * gameSnake.col); } während ((Funktion () { // Durchlaufe die Zeile und Spalte der Schlange und vergleiche sie dann mit der neu zufällig generierten Zeile und Spalte von Food, um zu sehen, ob sie sich überschneiden für (var i = 0; i < gameSnake.snake.body.length; i++) { wenn (gameSnake.snake.body[i].row == self.row und gameSnake.snake.body[i].col == self.col) { gibt true zurück; } } gibt false zurück; })()) console.log(diese.Zeile, diese.Spalte); } Lebensmittel.prototype.render = Funktion () { Spiel.setHTML(diese.Zeile, diese.Spalte, '♥'); } 6. Die Länge der Nahrung, die Schlangen fressenWenn sich die Schlange bewegt, fügt sie dem Kopf des Array-Körpers ein Element hinzu und löscht ein Element am Schwanz. Nachdem der Schlangenkopf das Futter berührt hat, müssen wir daher nur den Schwanz intakt halten. wenn (dieser.body[0].row == spiel.food.row und dieser.body[0].col == spiel.food.col) { // Neues Essen erstellen game.food = neues Essen(Spiel); //Setze die Frame-Nummer auf 0 zurück // Punktzahl hinzufügen game.score++; spiel.f = 0; } anders { dies.body.pop(); } Schlangen fressen Nahrung schneller Wir legen eine Frame-Nummer fest, die hochzählt, bis sie auf Futter trifft, und lassen die Schlange dann schneller aktualisieren, während ihre Länge zunimmt. dies.f = 0; spiel.f++; // Geschwindigkeit der Schlange aktualisieren. Wenn die Seite der Schlange länger ist, erhöht sich die Geschwindigkeit var während = game.snake.body.length < 30 ? 30 - game.snake.body.length : 1; // Snake-Update game.f % während == 0 und game.snake.update(); // Rendere die Schlange 7. Spielfunktion startenWir müssen lediglich einen Button in HTML schreiben und ihn durch Positionierung an die richtige Stelle setzen, ihm ein Klick-Ereignis zuweisen und erst nachdem wir auf den Start-Button geklickt haben, wird der Code im Spiel ausgeführt. <div id="app"></div> <div class="startgame"><img src="images/btn1.gif" alt=""></div> <div class="stopgame"><img src="images/btn4.png" alt=""></div> <Skript> var Spiel = null; var btnstart = document.querySelector('.startgame'); var btnstop = document.querySelector('.stopgame') btnstart.addEventListener('klicken', Funktion () { btnstart.style.display = "keine"; Spiel = neue Spiele(); // konsole.log(Tabelle); var Tabelle = Dokument.QuerySelector('Tabelle'); Tabelle.addEventListener('klicken', Funktion () { clearInterval(spiel.timer); btnstop.style.display = "Block"; }) 8. Spielfunktion pausieren/fortsetzenWir geben sowohl dem Pause-Button als auch dem Tisch ein Klick-Ereignis. Wenn wir auf den Tisch klicken, erscheint der Stopp-Button und stoppt den Timer im Spiel. Wenn wir auf den Pause-Button klicken, startet der Timer und versteckt sich wieder. btnstop.addEventListener('klicken', Funktion () { btnstop.style.display = "keine"; spiel.timer = setzeIntervall(funktion () { // Der Kern des Timers ist die Essenz der Spiel-Rendering: Bildschirm löschen – aktualisieren – Spiel rendern.f++; // document.getElementById('f').innerHTML = 'Framenummer:' + game.f; // // Punktzahl rendern // document.getElementById('score').innerHTML = 'Punktzahl:' + game.score; // Bildschirm löschen game.clear(); //Schlangenbewegung/-aktualisierung //Aktualisierungsgeschwindigkeit der Schlange Wenn die Schlangenseite länger ist, erhöht sich die Geschwindigkeit var während = game.snake.body.length < 30 ? 30 - game.snake.body.length : 1; // Snake-Update game.f % während == 0 und game.snake.update(); // Rendere die Schlange game.snake.render(); // Essen rendern game.food.render(); }, 10); }) Damit ist dieser Artikel über die Implementierung des Snake-Spiels in JS abgeschlossen. Ich hoffe, dass es für jedermanns Studium hilfreich sein wird, und ich hoffe auch, dass jeder 123WORDPRESS.COM unterstützen wird. Das könnte Sie auch interessieren:
|
<<: SQL-Implementierung von LeetCode (178. Punkterangliste)
>>: So installieren Sie ElasticSearch auf Docker in einem Artikel
Inhaltsverzeichnis Abhängigkeiten installieren Ko...
1. Fortsetzen nacos-Datenbank Datenbankname nacos...
Inhaltsverzeichnis Umfassender Vergleich Aus der ...
Inhaltsverzeichnis Vorwort Text 1. Installieren S...
Gestern Abend habe ich mir eine Interviewfrage ang...
Vorwort Wir alle wissen, dass MySQL-Abfragen den ...
<br />In früheren Tutorials von 123WORDPRESS...
Inhaltsverzeichnis veranschaulichen 1. Blob-Objek...
Bedarfsszenario: Der Chef bat mich, den Crawler z...
So implementieren Sie das MySQL-Umschalten des Da...
Inhaltsverzeichnis 1. Array-Abflachung (auch als ...
Ich habe in letzter Zeit nichts zu tun, also bast...
So können Sie mithilfe des CSS-Stils die Schrifta...
SQL implementiert Additions-, Subtraktions-, Mult...
Dieser Artikel stellt vor Online-Vorschau und Dow...