国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

服務器之家:專注于服務器技術及軟件下載分享
分類導航

node.js|vue.js|jquery|angularjs|React|json|js教程|

服務器之家 - 編程語言 - JavaScript - js教程 - 原生js canvas實現簡單貪吃蛇

原生js canvas實現簡單貪吃蛇

2022-02-15 18:10深夜猿 js教程

這篇文章主要為大家詳細介紹了原生js canvas實現簡單貪吃蛇,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下

本文實例為大家分享了js canvas實現簡單貪吃蛇的具體代碼,供大家參考,具體內容如下

Js原生貪吃蛇:canvas

HTML

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

CSS

?
1
2
3
4
5
#can{
 background: #000000;
 height: 400px;
 width: 850px;
}

JS

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
//公共板塊
 
var blockSize = 10;
//地圖的高寬
var mapW = 300;
var mapH = 150;
//歷史食物var
var historyfood = new Array();
//食物數組
var img = new Image()
var arrFood = ["ananas.png","hamburg.png","watermelon.png"]
historyfood =[{x: 0,y:0}];
//貪吃蛇默認值
var snake = [{x:3,y:0},{x:2,y:0},{x:1,y:0}]
 
//貪吃蛇方向
var directionX = 1;
var directionY = 0;
//添加一個標記,標記食物是否被吃掉
//默認值:沒有被吃掉
var isFood = false;
//判斷游戲狀態
//默認游戲繼續
var gameState = false;
 
//限制貪吃蛇所移動的方向不能反方向操作
var lockleft = true;
var lockright = true;
var lockup = true;
var lockdown = true;
 
//貪吃蛇分數
var count = 0;
//貪吃蛇速度
var speed = 1000 - (count + 5);
$(function () {
 $("#divContainer").height($("#can").height());
 //1,獲取到畫布對象
 var can = document.getElementById("can");
 //2,獲取到畫圖工具箱
 var tools = can.getContext('2d');
 tools.beginPath();
 //設置食物默認值
 var XY = Randomfood();
 console.log(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){
  switch (e.keyCode) {
   case 38:
    if (lockup){
     directionX = 0;
     directionY = -1;
     lockdown = false;
     lockleft = true;
     lockright = true;
    }
    break;
   case 40:
    if (lockdown){
     directionX = 0;
     directionY = 1;
     lockup = false;
     lockleft = true;
     lockright = true;
    }
    break;
   case 37:
    if (lockleft){
     directionX = - 1;
     directionY = 0;
     lockright = false;
     lockup = true;
     lockdown = true;
    }
    break;
   case 39:
    if (lockright){
     directionX = 1;
     directionY = 0;
     lockleft = false;
     lockup = true;
     lockdown = true;
    }
    break;
  }
 })
 setIntervalSnake(tools,x1,y1);
 //4,找位置
})
 
 
function setIntervalSnake(tools,x1,y1){
 setInterval(function (){
  if (gameState){
   return;
  }
  //1,擦除畫板
  tools.clearRect(0,0,850,420);
  var oldHead = snake[0];
 
  if (oldHead.x < 0 || oldHead.y < 0 || oldHead.x * blockSize >= mapW || oldHead.y * blockSize >= mapH){
   gameState = true;
   alert("游戲結束");
  }else {
   //蛇移動
   if (snake[0].x * blockSize === x1 && snake[0].y * blockSize === y1){
    isFood = true;
   } else {
    snake.pop()
   }
   var newHead = {
    x: oldHead.x + directionX,
    y: oldHead.y + directionY
   }
   snake.unshift(newHead);
  }
  //2,判斷食物是否被吃掉,吃掉刷新,不吃掉不刷新
  if (isFood){
   count = count + 1;
   $("#count").html(count);
   x1 = Randomfood().x;
   y1 = Randomfood().y;
   img.src = "/aimless/img/GluttonousSnakeFood/"+ arrFood[Math.floor(Math.random() * arrFood.length)];
   isFood = false;
  }
  tools.drawImage(img,x1,y1,blockSize,blockSize);
  //蛇身數組
  var Thesnakebody = new Array();
  //3,畫蛇
  for (var i = 0; i < snake.length; i++){
   if (i == 0){
    tools.fillStyle = "#9933CC";
   } else {
    var newHead1 = {
     x: snake[i].x,
     y: snake[i].y
    }
    Thesnakebody.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){
    gameState = true;
    setIntervalSnake(tools,x1,y1);
   }
  })
  //4,畫地圖
  var width = Math.round($("#can").width() / blockSize);
  var height = Math.round($("#can").height() / blockSize);
  for (var i = 1; i < width;i++){
   tools.moveTo(0,blockSize * i);
   tools.lineTo($("#can").width(),blockSize * i);
  }
  for (var i = 1; i < height;i++){
   tools.moveTo(blockSize * i,0);
   tools.lineTo(blockSize * i,$("#can").height());
  }
  tools.strokeStyle = "#FFFFFF";
  //5,繪制
  tools.stroke();
 },speed / 3);
}
 
 
//隨機食物不
function Randomfood() {
 var RandomX = Math.floor(Math.random() * mapW / blockSize) * blockSize;
 var RandomY = Math.floor(Math.random() * mapH / blockSize) * blockSize;
 setInterval(function (){
  snake.forEach(item=>{
   console.log(RandomX / blockSize,RandomY / blockSize);
   // console.log(item.x,item.y);
   if(item.x == RandomX / blockSize && item.y == RandomY / blockSize){
    return Randomfood();
   } else {
    return ;
   }
  })
 }, 10 / 3);
 var newRandom = {
  x: RandomX,
  y: RandomY
 }
 return newRandom;
}

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持服務器之家。

原文鏈接:https://blog.csdn.net/qq_41043296/article/details/114527235

延伸 · 閱讀

精彩推薦
  • js教程詳解 TypeScript 函數聲明和重載

    詳解 TypeScript 函數聲明和重載

    在 JavaScript 中,函數是構建應用的一塊基石,我們可以使用函數抽離可復用的邏輯、抽象模型、封裝過程。在TypeScript中,函數仍然是最基本、最重要的概念...

    前端充電寶7142022-01-05
  • js教程微信小程序實現modal彈出框遮罩層組件(可帶文本框)

    微信小程序實現modal彈出框遮罩層組件(可帶文本框)

    這篇文章主要給大家介紹了關于微信小程序實現modal彈出框遮罩層組件(可帶文本框)的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者...

    BadmintonCode3592021-12-15
  • js教程50行代碼實現Webpack組件使用次數統計

    50行代碼實現Webpack組件使用次數統計

    這篇文章主要介紹了50行代碼實現Webpack組件使用次數統計,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友...

    又在吃魚8652022-02-12
  • js教程原生JavaScript實現幻燈片效果

    原生JavaScript實現幻燈片效果

    這篇文章主要為大家詳細介紹了原生JavaScript實現幻燈片效果,文中安裝步驟介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下...

    清水拌墨茶4792022-01-21
  • js教程利用JS判斷元素是否為數組的方法示例

    利用JS判斷元素是否為數組的方法示例

    這篇文章主要給大家介紹了關于利用JS判斷元素是否為數組的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價...

    Fahrenheitzz10072021-12-29
  • js教程mustache.js實現首頁元件動態渲染的示例代碼

    mustache.js實現首頁元件動態渲染的示例代碼

    這篇文章主要介紹了mustache.js實現首頁元件動態渲染的示例代碼,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可...

    code2roc4262021-12-21
  • js教程JavaScript點擊按鈕生成4位隨機驗證碼

    JavaScript點擊按鈕生成4位隨機驗證碼

    這篇文章主要為大家詳細介紹了JavaScript點擊按鈕生成4位隨機驗證碼,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一...

    搬磚大法4502022-01-10
  • js教程js定時器出現第一次延遲的原因及解決方法

    js定時器出現第一次延遲的原因及解決方法

    在本篇文章里小編給大家整理的是一篇關于js定時器出現第一次延遲的原因及解決方法,對此有需要的朋友們可以學習下。...

    宋宋大人5002021-12-24
主站蜘蛛池模板: 99成人在线视频 | 久久亚洲国产精品 | 涩涩视频在线看 | 国产一区二区精品在线观看 | 日本美女一区二区三区 | 韩国精品一区 | 欧美亚洲在线 | 动漫卡通精品一区二区三区介绍 | 国产黄色片免费 | 日日躁夜夜躁狠狠躁 | 国产精品久久久久久久 | 国产大片在线观看 | 国产精品视频免费观看 | 久久亚洲一区二区三区四区 | 欧美日韩久久精品 | 国产视频在线播放 | 日韩精品免费在线观看 | 99久久99| 午夜视频 | av免费一区二区 | 久久99视频这里只有精品 | 成人精品影院 | 美日韩一区二区 | 操少妇逼视频 | 亚洲综合色成在线播放 | 午夜精品影院 | 国产羞羞视频免费在线观看 | 日韩欧美精品 | 国内成人精品2018免费看 | 午夜影院 | 黄色毛片免费网站 | 三级在线观看 | 亚洲国产精品久久久久久 | 在线观看a视频 | 国产在线一区二区三区 | 久久久精品国产 | 99精品一区二区 | 免费国产视频 | 青青草视频在线免费观看 | 亚洲成人免费影院 | 亚洲一区二区精品 |