シンプルなスネークを実現するためのネイティブjsキャンバス

シンプルなスネークを実現するためのネイティブjsキャンバス

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

Jsネイティブスネーク:キャンバス

html

<canvas id="can"></canvas>

CS

#できる{
 背景: #000000;
 高さ: 400px;
 幅: 850ピクセル;
}

JS

//パブリックセクション var blockSize = 10;
//マップの高さと幅 var mapW = 300;
var mapH = 150;
// 歴史的な食べ物 var
var historyfood = 新しい配列();
// 食べ物配列 var img = new Image()
var arrFood = ["ananas.png","hamburg.png","watermelon.png"]
履歴フード = [{x: 0,y:0}];
//Greedy Snake のデフォルト値 var snake = [{x:3,y:0},{x:2,y:0},{x:1,y:0}]

// ヘビの方向 var directionX = 1;
var 方向Y = 0;
// 食べ物が食べられたかどうかを示すフラグを追加します // デフォルト値: 食べられていない var isFood = false;
// ゲームの状態を判断します // デフォルトのゲームは続行されます var gameState = false;

// ヘビの移動方向が反転しないように制限します var lockleft = true;
var lockright = true;
var ロックアップ = true;
var ロックダウン = true;

//スネークスコア var count = 0;
// ヘビの速度 var speed = 1000 - (count + 5);
$(関数() {
 $("#divContainer").height($("#can").height());
 //1、キャンバス オブジェクトを取得します。var can = document.getElementById("can");
 //2、描画ツールボックスを取得します。var tools = can.getContext('2d');
 ツールのbeginPath();
 //食品のデフォルト値を設定する var XY = Randomfood();
 コンソールログ(XY);
 var x1 = Randomfood().x;
 var y1 = Randomfood().y;
 img.src = "/aimless/img/GluttonousSnakeFood/" + arrFood[Math.floor(Math.random() * arrFood.length)];
 //スネークの動きを制御する document.addEventListener('keydown',function (e){
  スイッチ (e.keyCode) {
   ケース38:
    if (ロックアップ){
     方向X = 0;
     方向Y = -1;
     ロックダウン = false;
     ロック左 = true;
     ロックライト = true;
    }
    壊す;
   ケース40:
    (ロックダウン)の場合{
     方向X = 0;
     方向Y = 1;
     ロックアップ = false;
     ロック左 = true;
     ロックライト = true;
    }
    壊す;
   ケース37:
    (ロック左){
     方向X = - 1;
     方向Y = 0;
     ロックライト = false;
     ロックアップ = true;
     ロックダウン = true;
    }
    壊す;
   ケース39:
    if (lockright){
     方向X = 1;
     方向Y = 0;
     ロック左 = false;
     ロックアップ = true;
     ロックダウン = true;
    }
    壊す;
  }
 })
 setIntervalSnake(ツール、x1、y1);
 //4、場所を見つける})


関数setIntervalSnake(ツール,x1,y1){
 setInterval(関数(){
  if (ゲーム状態){
   戻る;
  }
  //1、描画ボードを消去しますtools.clearRect(0,0,850,420);
  var oldHead = ヘビ[0];

  (oldHead.x < 0 || oldHead.y < 0 || oldHead.x * ブロックサイズ >= mapW || oldHead.y * ブロックサイズ >= mapH){
   ゲーム状態 = true;
   alert("ゲームオーバー");
  }それ以外 {
   //Snakeが動く if (snake[0].x * blockSize === x1 && snake[0].y * blockSize === y1){
    isFood = true;
   } それ以外 {
    スネーク.ポップ()
   }
   var newHead = {
    x: oldHead.x + directionX、
    y: oldHead.y + directionY
   }
   snake.unshift(newHead);
  }
  //2、食べ物が食べられたかどうかを判断し、食べられた場合は更新し、食べられなかった場合は更新しない if (isFood) {
   カウント = カウント + 1;
   $("#count").html(カウント);
   x1 = ランダムフード().x;
   y1 = ランダムフード().y;
   img.src = "/aimless/img/GluttonousSnakeFood/" + arrFood[Math.floor(Math.random() * arrFood.length)];
   isFood = false;
  }
  tools.drawImage(画像、x1、y1、ブロックサイズ、ブロックサイズ);
  // スネークボディ配列 var Thesnakebody = new Array();
  //3、ヘビを描く for (var i = 0; i < snake.length; i++){
   (i == 0)の場合{
    tools.fillStyle = "#9933CC";
   } それ以外 {
    var newHead1 = {
     x: ヘビ[i].x,
     y: ヘビ[i].y
    }
    ヘビの体。unshift(newHead1);
    tools.fillStyle = "#33adcc";
   }
   tools.fillRect(snake[i].x * blockSize,snake[i].y * blockSize,blockSize,blockSize);
  }
  // //蛇の頭が蛇の体を噛んだかどうかを判定する Thesnakebody.forEach(item=>{
   if(item.x == snake[0].x && item.y == snake[0].y){
    ゲーム状態 = true;
    setIntervalSnake(ツール、x1、y1);
   }
  })
  //4、マップを描画します var width = Math.round($("#can").width() / blockSize);
  var height = Math.round($("#can").height() / blockSize);
  (var i = 1; i < 幅; i++){
   ツールを0に移動する。ブロックサイズ*i;
   tools.lineTo($("#can").width(),blockSize * i);
  }
  (var i = 1; i < 高さ; i++){
   ツールを移動先(ブロックサイズ * i,0);
   tools.lineTo(ブロックサイズ * i,$("#can").height());
  }
  tools.strokeStyle = "#FFFFFF";
  //5、描画ツール.stroke();
 },速度 / 3);
}


//ランダムフード関数 Randomfood() {
 var RandomX = Math.floor(Math.random() * mapW / blockSize) * blockSize;
 var RandomY = Math.floor(Math.random() * mapH / blockSize) * blockSize;
 setInterval(関数(){
  スネーク.forEach(item=>{
   console.log(ランダムX/ブロックサイズ、ランダムY/ブロックサイズ);
   // console.log(item.x,item.y);
   if (item.x == RandomX / blockSize && item.y == RandomY / blockSize) {
    Randomfood() を返します。
   } それ以外 {
    戻る ;
   }
  })
 }, 10 / 3);
 var 新しいランダム = {
  x: ランダムX、
  y: ランダムY
 }
 newRandom を返します。
}

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

以下もご興味があるかもしれません:
  • JSで書いたスネークゲーム(個人練習)
  • JavaScript Snake フルバージョン (ソースコード)
  • スネークゲームを実現するjs(わかりやすい)
  • JS で実装されたスネークゲームの完全な例
  • 20 行の js コードで実装されたスネーク ゲーム
  • js を使って小さな貪欲なヘビのゲームを書く
  • js スネーク ゲームの実装アイデアとソース コード
  • javascript スネーク実装コード
  • シンプルなスネークゲームを実現するJavaScript
  • ネイティブ js で実装されたスネーク ゲームの Web バージョンの完全な例

<<:  Win7 x64 に解凍版の mysql 5.7.18 winx64 をインストールするとサービスが起動できない問題を解決します

>>:  Centos6.5 に zabbix2.4 をインストールするチュートリアル図

ブログ    

推薦する

MySQL 8.0 パスワード有効期限ポリシーの詳細な説明

MySQL 8.0.16 以降では、パスワードの有効期限ポリシーを設定できます。今日は、この小さな知...

Vue パッケージアップロードサーバー更新 404 問題に対する 2 つの解決策

1: nginxサーバーソリューション、.conf構成ファイルを変更する解決策は2つある1: 位置 ...

まだ*を選択しますか?

アプリケーションが牛のように遅い理由は数多くあります。ネットワーク、システム アーキテクチャ、または...

Docker で複数のアプリケーション サイトをプロキシするために Nginx を使用する方法

序文エージェントの役割は何ですか? - 複数のドメイン名が同じサーバーに解決される- 1つのサーバー...

子ども向けウェブサイトの視覚構造レイアウト設計手法の分析

1. 温かくて優しい関連アドレス: http://www.web-designers.cn/post...

HTML の ReadOnly と Enabled の違い

ReadOnly 属性を持つ TextBox は、クライアント上で次のマークアップとして表示されます...

Vueプロジェクトでlessを使用するためのヒント

目次序文1. スタイルの浸透1. パターン浸透とは何ですか? 2. 使い方は? 2. ミキシング1....

Vueのフロントエンドとバックエンドのポートの不一致の問題を解決する

Vue のフロントエンドとバックエンドのポートが一致していませんconfig index.jsファイ...

Tomcat で JNDI データ ソースを構成する 3 つの方法

これまでの仕事では、開発サーバーは一般的にTomcatでした。データソースは、多くの場合、appli...

Vue diffアルゴリズムの完全な分析

目次序文Vue 更新ビューパッチ同じVノードパッチVノード更新子供序文Vue は仮想 DOM を使用...

Vueはツリーテーブルを実装する

この記事では、ツリーテーブルを実装するためのVueの具体的なコードを例として紹介します。具体的な内容...

JavaScript DOMContentLoaded イベントのケーススタディ

DOMContentLoaded イベント文字通り、DOM がロードされた後に実行されます。 win...

JavaScript のよりエレガントなエラー処理方法 async await

目次背景なぜエラー処理が必要なのでしょうか? async await より適切なエラー処理まとめ要約...

Hadoop を使用せずに Linux 環境に Spark のスタンドアロン バージョンをインストールする方法

ビッグデータはますます注目を集めており、ビッグデータのいくつかの構成要素に精通していないと、自慢でき...

Vue コンポーネント (Vuex を含む) 間の値の転送に関する簡単な説明

目次父から息子へ:息子から父へ: Vuex を使用せずにコンポーネント間で値を渡す方法は、親から子、...