JavaScript 貪喫蛇
自己用js寫的貪喫蛇小遊戲
一、製作遊戲界面
1 定義遊戲中需要的變量
var rowNum = 25;
var colNum = 25;
var arr = [];
var snakeArry =[];
var speedTime = 100;
var moveTimer = null;
var X = 2;
var Y = 0;
var score = 0;
var dec = 'right';
2 定義兩個變量控制界面的佈局
將建好的小方塊放入arr數組中
function makePenal(){
for(i=0; i<rowNum; i++){
var rowDiv = document.createElement('div');
wrap.appendChild(rowDiv);
var arrArry = [];
for(j=0; j<colNum; j++){
var colDiv = document.createElement('div');
colDiv.className = 'col';
rowDiv.appendChild(colDiv);
arrArry.push(colDiv);
}
arr.push(arrArry);
}
}
3 初始化蛇身
將arr數組中的前三個放入snakeArray數組中 完成蛇身初始化
function snakeBody(){
for(i=0; i<3; i++){
arr[0][i].className = 'col col1';
snakeArry.push(arr[0][i]);
}
}
二、蛇身開始移動
1 添加計時器
添加計時器 通過改變 蛇頭方向 改變蛇移動的方向
moveTimer = setInterval(function(){
switch(dec){
case 'right':
X ++;
break;
case 'left':
X --;
break;
case 'up':
Y --;
break;
case 'down':
Y ++;
break;
}
2 鍵盤事件
鍵盤監聽事件 根據鍵盤輸入的鍵值 改變蛇移動的方向 當蛇在移動時 按下相反方向的鍵時 不執行當前操作 還有添加一個開關 當蛇身完全移動一個方格後纔可以執行操作 否則不執行
var aa = true;
document.onkeydown = function(){
var ev = window.event || event;
if(!aa){
return;
}
if(ev.keyCode == 37 && dec == 'right'){
return;
}
if(ev.keyCode == 38 && dec == 'down'){
return;
}
if(ev.keyCode == 39 && dec == 'left'){
return;
}
if(ev.keyCode == 40 && dec == 'up'){
return;
}
switch (ev.keyCode){
case 37:
dec = 'left';
break;
case 38:
dec = 'up';
break;
case 39:
dec = 'right';
break;
case 40:
dec = 'down';
break;
}
aa = false;
setTimeout(function(){
aa = true;
},speedTime);
}
3 生成食物
先產生兩個隨機數 foodX foodY 來確定食物在界面上的位置 確定後改變它的樣式 特別注意食物的位置不能夠和蛇身重複
function rand(max){
var ran = Math.floor(Math.random() * max);
return ran;
}
function snakeFood(){
foodX = rand(colNum);
foodY = rand(rowNum);
if(arr[foodY][foodX].className == 'col col1'){
snakeFood();
}else{
arr[foodY][foodX].className = 'col food';
}
}
三、蛇喫食物
1 蛇碰到四面牆壁
當蛇頭碰到界面邊界是 結束遊戲 注意 要清空計時器
if(X < 0 || X >= colNum || Y<0 || Y >= rowNum){
clearInterval(moveTimer);
alert('game over');
return;
}
2 蛇頭碰到蛇身
在蛇移動過程中 蛇頭是不能碰到自己身體的 否則結束遊戲 並清空計時器
for(i=0; i<snakeArry.length; i++){
if(snakeArry[i] ==arr[Y][X]){
clearInterval(moveTimer);
alert('game over');
return;
}
}
3 蛇碰到食物
當蛇喫到食物後 積分器 加 1 , 當前位置的方格樣式給變爲蛇身的樣式 並放入到蛇身的數組中,當蛇移動是沒有食物時, 將它當前的方格加入蛇身 ,並刪除數組中的第0個元素(即蛇尾)
if(X == foodX && Y == foodY){
arr[foodY][foodX].className = 'col col1';
snakeArry.push(arr[foodY][foodX]);
score ++;
scoreDiv.innerHTML = "得分: " + score;
snakeFood();
}else{
snakeArry[0].className = 'col';
snakeArry.shift();
arr[Y][X].className = 'col col1';
snakeArry.push(arr[Y][X]);
}
},speedTime);
}
效果圖:
完整代碼:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>貪喫蛇</title>
<style type="text/css">
.wrap{border: 1px solid black; margin: auto; font-size: 0;}
.scoring {width: 100%; border-bottom: 1px solid black; font-size: 2rem; text-align: right;}
.scoring div{padding: 10px; }
.col {width: 30px; height: 30px; display: inline-block; border: 1px solid blanchedalmond; background: wheat;}
.col1 {background: black;}
.food {background: brown;}
</style>
</head>
<body>
<div class="wrap">
<div class="scoring">
<div>得分: 0</div>
</div>
</div>
</body>
<script type="text/javascript">
var rowNum = 25;
var colNum = 25;
var arr = [];
var snakeArry =[];
var speedTime = 100;
var moveTimer = null;
var X = 2;
var Y = 0;
var score = 0;
var dec = 'right';
var wrap = document.querySelector('.wrap');
wrap.style.width = colNum * (30 + 2) + 'px';
var scoreDiv = document.querySelector('.scoring div');
function makePenal(){
for(i=0; i<rowNum; i++){
var rowDiv = document.createElement('div');
wrap.appendChild(rowDiv);
var arrArry = [];
for(j=0; j<colNum; j++){
var colDiv = document.createElement('div');
colDiv.className = 'col';
rowDiv.appendChild(colDiv);
arrArry.push(colDiv);
}
arr.push(arrArry);
}
}
makePenal();
function snakeBody(){
for(i=0; i<3; i++){
arr[0][i].className = 'col col1';
snakeArry.push(arr[0][i]);
}
}
snakeBody();
function snakeMove(){
moveTimer = setInterval(function(){
switch(dec){
case 'right':
X ++;
break;
case 'left':
X --;
break;
case 'up':
Y --;
break;
case 'down':
Y ++;
break;
}
if(X < 0 || X >= colNum || Y<0 || Y >= rowNum){
clearInterval(moveTimer);
alert('game over');
return;
}
for(i=0; i<snakeArry.length; i++){
if(snakeArry[i] ==arr[Y][X]){
clearInterval(moveTimer);
alert('game over');
return;
}
}
if(X == foodX && Y == foodY){
arr[foodY][foodX].className = 'col col1';
snakeArry.push(arr[foodY][foodX]);
score ++;
scoreDiv.innerHTML = "得分: " + score;
snakeFood();
}else{
snakeArry[0].className = 'col';
snakeArry.shift();
arr[Y][X].className = 'col col1';
snakeArry.push(arr[Y][X]);
}
},speedTime);
}
snakeMove();
var aa = true;
document.onkeydown = function(){
var ev = window.event || event;
if(!aa){
return;
}
if(ev.keyCode == 37 && dec == 'right'){
return;
}
if(ev.keyCode == 38 && dec == 'down'){
return;
}
if(ev.keyCode == 39 && dec == 'left'){
return;
}
if(ev.keyCode == 40 && dec == 'up'){
return;
}
switch (ev.keyCode){
case 37:
dec = 'left';
break;
case 38:
dec = 'up';
break;
case 39:
dec = 'right';
break;
case 40:
dec = 'down';
break;
}
aa = false;
setTimeout(function(){
aa = true;
},speedTime);
}
function rand(max){
var ran = Math.floor(Math.random() * max);
return ran;
}
function snakeFood(){
foodX = rand(colNum);
foodY = rand(rowNum);
if(arr[foodY][foodX].className == 'col col1'){
snakeFood();
}else{
arr[foodY][foodX].className = 'col food';
}
}
snakeFood();
</script>
</html>