コメント付きのスネークゲームを実装する js

コメント付きのスネークゲームを実装する js

この記事の例では、スネークゲームを実装するためのjsの具体的なコードを参考までに共有しています。具体的な内容は次のとおりです。

完成までに2時間かかりました。ちょっと粗雑です。

効果を直接確認してください。デバッグ パネルを開き、リソース パネルに新しいスニペットを作成します。

次のコードを貼り付け、スニペットを右クリックして実行します。

タイマーの間隔をクリアします。
ドキュメントのbody要素を空のままにしておくと、

// 1 秒間に何マス移動するか let speed = 10;
speedUpMul = 3 とします。

//壁を通り抜けられますか? let isThroughTheWall = true;

//行数 let row = 40;
headColor を 'red' にします。
bodyColor を 'green' とします。
foodColor を 'yellow' とします。
borderColor を 'grey' にします。


//ゲームのグローバル変数 let hasFood = false;
//ゲームステータス let gamestaus = 'start';
hasAccelerate を false にします。

mainContainer を document.createElement("div"); にします。
mainContainer.style.width = 20 * 行 + 1 + "px";
mainContainer.style.height = 20 * 行 + 1 + "px";
mainContainer.style.margin = "0 自動";
mainContainer.style.position = "相対";
mainContainer.style.border = "1px ソリッド " + borderColor;

document.body.appendChild(メインコンテナ);

for(let i = 0;i<row;i++){
 marginTop = 20 * i + "px" とします。
 for(j = 0; j < row; j++) {
 marginLeft = j * 20 + "px"とします。
 tempDiv = document.createElement('div'); とします。
 tempDiv.style.width = "19px";
 tempDiv.style.height = "19px";
 tempDiv.style.marginTop = marginTop;
 tempDiv.style.marginLeft = marginLeft;
 tempDiv.style.border = "0.5px ソリッド " + borderColor;
 tempDiv.style.position = "絶対";
 tempDiv.id = j + "div" + i;
 mainContainer.appendChild(tempDiv);
 }
}

クラス Cell{
 コンストラクタ(x, y, 色){
 if (isThroughTheWall) {
  x < 0 の場合、x = 行-1;
  x > 行 - 1 の場合、x = 0;
  y < 0 の場合、y = 行 - 1;
  y > 行 - 1 の場合、y = 0;
 }それ以外{
  if(x < 0 || y < 0 || x > 行 - 1 || y > 行 - 1){
  タイマーの間隔をクリアします。
  alert('ゲームオーバー');
  戻る;
  }
 }
 this.x = x;
 y = y;
 this.color = 色;
 tempDiv = document.getElementById(x + 'div' + y); とします。
 if(tempDiv) tempDiv.style.backgroundColor = color;
 }
}

ヘビ = {
 頭 : {}、
 体 : []、
 ダイレ:1
}

headx = Math.floor(Math.random() * 14) + 3 とします。
heady = Math.floor(Math.random() * 14) + 3 とします。
snake.head = 新しいセル(headx、heady、headColor);

//上、右、下、左、方向 = [1, 2, 3, 4] とします

snake.dire = direction[Math.floor(Math.random() * 4)];

snake.direct == 1の場合
 snake.body.push(新しいセル(snake.head.x、snake.head.y+1、bodyColor));
 snake.body.push(新しいセル(snake.head.x、snake.head.y+2、bodyColor));
 snake.body.push(新しいセル(snake.head.x、snake.head.y+3、bodyColor));
}

snake.direct == 2の場合
 snake.body.push(新しいセル(snake.head.x-1、snake.head.y、bodyColor));
 snake.body.push(新しいセル(snake.head.x-2、snake.head.y、bodyColor));
 snake.body.push(新しいセル(snake.head.x-3、snake.head.y、bodyColor));
}

スネークダイレクトの場合 3
 snake.body.push(新しいセル(snake.head.x、snake.head.y-1、bodyColor));
 snake.body.push(新しいセル(snake.head.x、snake.head.y-2、bodyColor));
 snake.body.push(新しいセル(snake.head.x、snake.head.y-3、bodyColor));
}

snake.direct == 4の場合
 snake.body.push(新しいセル(snake.head.x+1、snake.head.y、bodyColor));
 snake.body.push(新しいセル(snake.head.x+2、snake.head.y、bodyColor));
 snake.body.push(新しいセル(snake.head.x+3、snake.head.y、bodyColor));
}

関数ゲーム(){
 if(ゲームステータス == '一時停止'){
 戻る;
 }
 if(ゲームステータス == 'ゲームオーバー'){
 タイマーの間隔をクリアします。
 alert('ゲームオーバー');
 戻る;
 }
 フードを初期化します。
 snakeHeadX = snake.head.x とします。
 snakeHeadY = snake.head.y とします。
 色を '' とします。
 snake.direct == 1の場合
 tempDiv = document.getElementById(snakeHeadX + 'div' + (snakeHeadY-1)); とします。
 if(tempDiv) color = tempDiv.style.backgroundColor;
 snake.head = 新しいセル(snakeHeadX、snakeHeadY - 1、headColor);
 }
 snake.direct == 2の場合
 tempDiv = document.getElementById((snakeHeadX + 1) + 'div' + snakeHeadY); とします。
 if(tempDiv) color = tempDiv.style.backgroundColor;
 snake.head = 新しいセル(snakeHeadX + 1、snakeHeadY、headColor);
 }
 スネークダイレクトの場合 3
 tempDiv = document.getElementById(snakeHeadX + 'div' + (snakeHeadY+1)); とします。
 if(tempDiv) color = tempDiv.style.backgroundColor;
 snake.head = 新しいセル(snakeHeadX、snakeHeadY + 1、headColor);
 }
 snake.direct == 4の場合
 tempDiv = document.getElementById((snakeHeadX - 1) + 'div' + snakeHeadY); とします。
 if(tempDiv) color = tempDiv.style.backgroundColor;
 snake.head = 新しいセル(snakeHeadX - 1、snakeHeadY、headColor);
 }
 snake.body.unshift(新しいセル(snakeHeadX、snakeHeadY、bodyColor));
 if(color && color == foodColor){
 フードがある = false;
 フードを初期化します。
 }そうでない場合(色 && 色 == ボディカラー){
 gamestaus = 'ゲームオーバー'; 
 }それ以外{
 lastBody を snake.body.pop() とします。
 新しいセル(lastBody.x、lastBody.y、'');
 }
}
var timer = setInterval(ゲーム、10 / 速度 * 100)


/**
 * 食べ物を初期化する */
関数initFood(){
 while(!hasFood){
 x = Math.floor(Math.random() * row); とします。
 y = Math.floor(Math.random() * row); とします。
 snakeBody を snake.body とします。
 enable = true とします。
 ヘビの頭のx == x && ヘビの頭のy == y){
  有効 = false;
 }
 for(sBody of snakeBody){
  sBody.x == x && sBody.y == yの場合{
  有効 = false;
  壊す;
  }
 }
 if(有効){
  新しいセル(x, y, foodColor);
  食べ物がある = true;
 }
 }
}

document.onkeydown = function(e){
 if(e.keyCode == 38){
 //if(snake.dire != 3 && snake.dire != 1){
  ヘビ.dire = 1;
 }そうでない場合(snake.direct == 1){
  加速がある場合
  タイマーの間隔をクリアします。
  加速する = true;
  速度 = 速度 * speedUpMul;
  タイマー = setInterval(ゲーム、10 / 速度 * 100)
  }
 }

 }

 if(e.keyCode == 39){
 //正しいif(snake.dire != 4 && snake.dire != 2){
  ヘビ.dire = 2;
 }そうでない場合(snake.dire == 2){
  加速がある場合
  タイマーの間隔をクリアします。
  加速する = true;
  速度 = 速度 * speedUpMul;
  タイマー = setInterval(ゲーム、10 / 速度 * 100)
  }
 }
 }

 キーコード == 40 の場合
 //Nextif(snake.dire != 1 && snake.dire != 3){
  ヘビ.dire = 3;
 }そうでない場合(snake.dire == 3){
  if(!hasAccelerate){
  タイマーの間隔をクリアします。
  加速する = true;
  速度 = 速度 * speedUpMul;
  タイマー = setInterval(ゲーム、10 / 速度 * 100)
  }
 }
 }

 if(e.keyCode == 37){
 // 左 if (snake.dire != 2 && snake.dire != 4) {
  ヘビ.dire = 4;
 }そうでない場合(snake.dire == 4){
  if(!hasAccelerate){
  タイマーの間隔をクリアします。
  加速する = true;
  速度 = 速度 * speedUpMul;
  タイマー = setInterval(ゲーム、10 / 速度 * 100)
  }
 }
 }
 //スペースバーで一時停止 if(e.keyCode == 32){
 if(ゲームステータス == '開始'){
  gamestaus = '一時停止';
 }それ以外の場合(ゲームステータス == '一時停止'){
  gamestaus = '開始';
 }
 }
}

document.onkeyup = function(e){
 if(e.keyCode == 38){
 // if (snake.dire == 1 && hasAccelerate) {
  タイマーの間隔をクリアします。
  加速あり = false;
  速度 = 速度 / speedUpMul;
  タイマー = setInterval(ゲーム、10 / 速度 * 100)
 }

 }

 if(e.keyCode == 39){
 // Rightif(snake.dire == 2 && hasAccelerate){
  タイマーの間隔をクリアします。
  加速あり = false;
  速度 = 速度 / speedUpMul;
  タイマー = setInterval(ゲーム、10 / 速度 * 100)
 }
 }

 キーコード == 40 の場合
 //Nextif(snake.dire == 3 && hasAccelerate){
  タイマーの間隔をクリアします。
  加速あり = false;
  速度 = 速度 / speedUpMul;
  タイマー = setInterval(ゲーム、10 / 速度 * 100)
 }
 }

 if(e.keyCode == 37){
 // 左 if (snake.dire == 4 && hasAccelerate) {
  タイマーの間隔をクリアします。
  加速あり = false;
  速度 = 速度 / speedUpMul;
  タイマー = setInterval(ゲーム、10 / 速度 * 100)
 }
 }
}

以上がこの記事の全内容です。皆様の勉強のお役に立てれば幸いです。また、123WORDPRESS.COM を応援していただければ幸いです。

以下もご興味があるかもしれません:
  • JSはスネークゲームを実装する
  • スネークゲームのアイデアを実現するためのJavaScript
  • 古典的なスネークゲームの JavaScript 実装
  • jsを使用して簡単なスネークゲームを書く
  • JavaScript スネーク実装コード
  • スネークゲームのウェブ版を実装するためのJavaScript
  • JavaScript でスネーク ゲームを実装する
  • シンプルなスネークゲームを実現するネイティブjs
  • ネイティブ JS でスネーク ゲームを書く
  • JavaScript の絶妙なスネーク実装プロセス

<<:  Linux の who コマンド例の紹介

>>:  Mysql マスタースレーブ サービスの実装例を構成する

推薦する

この記事はJavaScriptの変数とデータ型を理解するのに役立ちます

目次序文:親切なヒント:変数1. 免責事項2. 譲渡3. 2つの小さな文法上の詳細変数の命名規則なぜ...

threejs でリアルタイムポリゴン屈折を実装する方法

目次序文ステップ1: セットアップと前方屈折ステップ2: 反射とフレネル方程式ステップ3: 多面屈折...

ES5とES6の違いを分析する

目次概要関数シグネチャオプションパラメータ非厳密モード例外処理実用要約する概要ご存知のとおり、ES6...

HTML フォームとフォーム内部タグの使用

コードをコピーコードは次のとおりです。 <html> <ヘッド> <t...

エンタープライズプロダクション MySQL 最適化入門

Oracle、DB2、SQL Server などの他の大規模データベースと比較すると、MySQL に...

TypeScript のマップされた型とより優れたリテラル型推論について説明します。

目次概要マップされた型を使用して Object.freeze() を構築するマッピングタイプの構文は...

ウェブサイトレイアウトにおける CSS の計算関数 calc の例

calc は数値を計算するために使用される CSS 関数です。長さ、角度、時間などを計算できます。 ...

Vue+WebSocket ページでの長時間接続のリアルタイム更新

最近、Vue プロジェクトではデータをリアルタイムで更新する必要があります。折れ線グラフは 1 秒ご...

Docker ファイルの保存パス、ポート マッピング操作モードの変更

コンテナの起動コマンドを取得する方法コンテナはすでに作成されていますが、その起動パラメータ(データが...

Vueのドラッグ可能なコンポーネントであるVue Smooth DnDの使用方法の詳細な説明

目次紹介とデモAPI: コンテナ財産ライフサイクルコールバックイベントAPI: ドラッグ可能実際の戦...

MySQLデータベースの数千万件のデータクエリとストレージの詳細な説明

目次百万レベルのデータ処理ソリューションデータストレージ構造設計クエリステートメントの最適化1000...

優れた UI (ユーザー インターフェース) デザイナーになるための 20 の道標

はじめに: インターフェイス デザイナーの Joshua Porter が自身のブログでこの記事を公...

Linux環境にRedisをデプロイし、Dockerにインストールする方法

インストール手順1. Redisをインストールするdocker search redis和docke...

mini-vueレンダリングのシンプルな実装

目次序文ターゲット最初のステップ:ステップ2:ステップ3:ステップ4:要約する序文現在主流のフレーム...

ブラウザは関連するHTTPヘッダーをキャッシュし、HTTPリクエストの数を最小限に抑えます。

最近、Yahoo の 34 の黄金律を読み、ウェブサイトのパフォーマンスを最適化する方法を学びました...