一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

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

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

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

原生js canvas實現(xiàn)簡單貪吃蛇

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

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

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

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();
//食物數(shù)組
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;
//判斷游戲狀態(tài)
//默認游戲繼續(xù)
var gameState = false;
 
//限制貪吃蛇所移動的方向不能反方向操作
var lockleft = true;
var lockright = true;
var lockup = true;
var lockdown = true;
 
//貪吃蛇分數(shù)
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);
  //蛇身數(shù)組
  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;
}

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

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

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 国产特级| 男人搡女人视频免费看 | 天天看黄 | 欧美人与日本人xx在线视频 | sxx免费看观看美女 sss亚洲国产欧美一区二区 | 白丝超短裙被输出娇喘不停小说 | 国产精品夜色视频一级区 | 99热久久国产精品这里 | 九九影院午夜理论片无码 | 久久亚洲成a人片 | 2019韩国最新三级 | futa百合高肉全h | 天堂网在线.www天堂在线视频 | 日本成人黄色片 | 好吊日在线 | 91精品国产高清久久久久 | 日本网络视频www色高清免费 | 91精品国产91热久久p | 高清国产精品久久久久 | 肉肉小说在线阅读 | julia ann一hd | 国产一区二区三区毛片 | juliaann大战黑人 | h肉动漫在线视频无修无遮挡 | 高清欧美videossexo免费 | 国产免费不卡视频 | 日本免费的一级绿象 | 色图片小说 | 久久99热成人精品国产 | 2021国产麻豆剧传媒剧情动漫 | 满溢游泳池免费土豪全集下拉版 | 日韩操比视频 | 日本最新伦中文字幕 | 亚洲aⅴ天堂 | 国产精品国产香蕉在线观看网 | 亚洲mm色国产网站 | 国产成人久视频免费 | 亚洲色图欧美色 | 女教师雪白老汉 | 91拍拍| 狠狠撸在线影院 |