(完整原始碼)貪吃蛇小遊戲——HTML+CSS+JavaScript實現

bingoCoder發表於2019-01-05

最近因為幫助大一的學妹做網頁,又接觸了一下前端方面的知識。(學妹已經成了女朋友!!!,嘻嘻)感謝自己當年認真學習,大三了好多東西還能拾起來,哈哈。我翻出了我當年寫的程式碼,還真不少呢。今天覆習複習,看一看那時候寫的一個貪吃蛇的程式碼。當時用了一整天,跟著今日頭條上推送給我的一個視訊一點一點手敲的…… 兩年半了,我記得這麼清楚,是因為寫這個太痛苦了,記憶猶新啊!!!大一手敲著不知道為什麼的程式碼,一遍一遍的報錯,一遍一遍的改錯誤…… 

現在感覺起來,裝好外掛的VS code配合上Chrome除錯,真的是爽到爆啊。當時太年輕,不知道這麼先進的工具,可能有人會說Sublime Text更好用,我承認,我選擇VS code 僅僅因為是外掛安裝方便。

大概看了看這個貪吃蛇的程式碼,主要用了HTML5中的canvas(畫布)實現遊戲介面,蛇的控制邏輯用JavaScript。定時呼叫函式使得蛇動起來。程式碼簡單易懂,分享出來,供初學者參考學習。省的手敲程式碼,遇到各種錯誤,學習的熱情被各種八阿哥拒之門外,先讓程式跑起來,帶有興趣的研究程式碼,效率應該更高吧。(個人觀點,純屬扯淡)話不多說,直接上程式碼:

HTML頁面內容:

<!DOCTYPE html>
<html>
<head>
	<title>貪吃蛇</title>
	<meta charset="UTF-8">
	<meta name="keywords" content="貪吃蛇">
	<meta name="Description" content="這是一個初學者用來學習的小遊戲">
	<style type="text/css">
	*{margin:0;}
	.map{margin:100px auto;
		height:600px;
		width:900px;
		background:#00D0FF;
		border:10px solid #AFAEB2;
		border-radius:8px;
	}
	</style>



</head>

<body>
<div class="map">
<canvas id="canvas" height="600" width="900">
	
</canvas>
</div>

<script src="javascript/snake.js">

</script>
</body>
</html>

javascript程式碼:


	//獲取繪製工具
	/*
	var canvas = document.getElementById("canvas");
	var ctx = canvas.getContext("2d");//獲取上下文
	ctx.moveTo(0,0);
	ctx.lineTo(450,450);*/
	var c=document.getElementById("canvas");
    var ctx=c.getContext("2d");
    /*ctx.beginPath();
    ctx.moveTo(0,0);
    ctx.lineTo(450,450);
    ctx.stroke();
    */

    var snake =[];//定義一條蛇,畫蛇的身體
    var snakeCount = 6;//初始化蛇的長度
	var foodx =0;
	var foody =0;
    var togo =0;
    function drawtable()//畫地圖的函式
    {


    	for(var i=0;i<60;i++)//畫豎線
    	{
    		ctx.strokeStyle="black";
    		ctx.beginPath();
    		ctx.moveTo(15*i,0);
    		ctx.lineTo(15*i,600);
    		ctx.closePath();
    		ctx.stroke();
    	}
        for(var j=0;j<40;j++)//畫橫線
    	{
    		ctx.strokeStyle="black";
    		ctx.beginPath();
    		ctx.moveTo(0,15*j);
    		ctx.lineTo(900,15*j);
    		ctx.closePath();
    		ctx.stroke();
    	}
    	
    	for(var k=0;k<snakeCount;k++)//畫蛇的身體
			{
			ctx.fillStyle="#000";
			if (k==snakeCount-1)
			{
				ctx.fillStyle="red";//蛇頭的顏色與身體區分開
			}
			ctx.fillRect(snake[k].x,snake[k].y,15,15);//前兩個數是矩形的起始座標,後兩個數是矩形的長寬。
			
			}
			//繪製食物	
    		ctx.fillStyle ="black";
	     ctx.fillRect(foodx,foody,15,15);
	     ctx.fill();
    	
    }

    
    function start()//定義蛇的座標
    {
    	//var snake =[];//定義一條蛇,畫蛇的身體
        //var snakeCount = 6;//初始化蛇的長度
		
		for(var k=0;k<snakeCount;k++)
    		{
    			snake[k]={x:k*15,y:0};
    			
            }
			
		  drawtable();
          addfood();//在start中呼叫新增食物函式

    }

    function addfood()
	{
	foodx = Math.floor(Math.random()*60)*15; //隨機產生一個0-1之間的數
	foody = Math.floor(Math.random()*40)*15;
		
		for (var k=0;k<snake;k++)
		{
			if (foodx==snake[k].x&&foody==sanke[k].y)//防止產生的隨機食物落在蛇身上
			{	
			addfood();
			}
		}
	
	
	}	
    		
   function move()
   {
	switch (togo)
	{
	case 1: snake.push({x:snake[snakeCount-1].x-15,y:snake[snakeCount-1].y}); break;//向左走
	case 2: snake.push({x:snake[snakeCount-1].x,y:snake[snakeCount-1].y-15}); break;
	case 3: snake.push({x:snake[snakeCount-1].x+15,y:snake[snakeCount-1].y}); break;
	case 4: snake.push({x:snake[snakeCount-1].x,y:snake[snakeCount-1].y+15}); break;
	case 5: snake.push({x:snake[snakeCount-1].x-15,y:snake[snakeCount-1].y-15}); break;
	case 6: snake.push({x:snake[snakeCount-1].x+15,y:snake[snakeCount-1].y+15}); break;
	default: snake.push({x:snake[snakeCount-1].x+15,y:snake[snakeCount-1].y});
	}
    snake.shift();//刪除陣列第一個元素
   	ctx.clearRect(0,0,900,600);//清除畫布重新繪製
   	isEat();
	isDead();
	drawtable();
   } 			
   
   function keydown(e)
   {
   switch(e.keyCode)
		{
         case 37: togo=1; break;
		 case 38: togo=2; break;
		 case 39: togo=3; break;
		 case 40: togo=4; break;
		 case 65: togo=5; break;
		 case 68: togo=6; break;
		}
   }
   
   function isEat()//吃到食物後長度加1
   {
    if(snake[snakeCount-1].x==foodx&&snake[snakeCount-1].y==foody)
   {
		addfood();
		snakeCount++;
		snake.unshift({x:-15,y:-15});
   }
   
   }
   
   function isDead()
   {
    if (snake[snakeCount-1].x>885||snake[snakeCount-1].y>585||snake[snakeCount-1].x<0||snake[snakeCount-1].y<0)
		{
		alert("You are dead,GAME OVER!!!");
		window.location.reload();
		}
   }
   
    document.onkeydown=function(e)
{
	keydown(e);

} 
window.onload = function()//呼叫函式
{ 
	start();
	setInterval(move,150);
	drawtable();
	
	

}
           

下面是程式執行截圖:

 

相關文章