canvas+js簡単なヘビの小さなゲームを実現

7777 ワード

ヘビを食いしん坊にするのは古典的なゲームとして、今でも多くの人が游んでいますが、他の人のゲームを游ぶよりも、自分のゲームを游ぶほうが达成感があります.このブログでは、+jsで简単なヘビを食いしん坊にする方法を教えています.canvasのAPIを知らない人は、canvasの基础知识を学んでから本文を読んでください.
私はまだ穴の先端に入って間もないので、何か悪いことがあったら、大神さんに指摘してください.
まず、ゲームを書くときから、簡単なhtmlファイルを書きます.ここでは美観の設定を考えません(主に本白さんは審美があまりにも悪いです.).したがってcanvasラベルは1つだけで、cssでレイアウトを考慮しません.jsでcanvasラベルを呼び出すために、canvasにid=「canvas」を追加しました.



	
	      


	
	


なhtmlファイルを いた 、コアのjsファイルを き めました.まず、 に を り てます.
var canvas=document.getElementById('canvas');
var context=canvas.getContext('2d');
canvas.width=600;
canvas.height=600;
//     
var left=37;
var up=38;
var right=39;
var down=40;
var numbers=new Array(10);
for(var i=0;i

ろで の を する はdocumentを する.onkeydownなので、ここの キーは するASCIIコードを しており、 のキーの も です. の さは で され、snake[0]は の として、x,yは の の に する.このゲームは に の を して する に や を き、0の は を めないので、ここではまず をすべて0に します.
を した 、 たちは を するブロックを る があります.ここには な で い を き、5つのパラメータを して、ブロックの のx,y 、ブロックの 、ブロックの の の 、ブロック の の を します.
//           
drawRct(0,0,520,10,'rgb(204,204,204)');//     
drawRct(10,10,500,0,'rgba(0,0,0,0.8)');//     
//       
function drawRct(x,y,l,r,color)
{
		context.beginPath();
		context.moveTo(x+r,y);
		context.lineTo(x+l-r,y);
		context.arcTo(x+l,y,x+l,y+r,r);
		context.lineTo(x+l,y+l-r);
		context.arcTo(x+l,y+l,x+l-r,y+l,r);
		context.lineTo(x+r,y+l);
		context.arcTo(x,y+l,x,y+l-r,r);
		context.lineTo(x,y+r);
		context.arcTo(x,y,x+r,y,r);
		context.fillStyle=color;
		context.closePath();
		context.fill();
		context.stroke();
}

い が すると、 は たちの が を いしん にする です.
//    
function markSnake(){
	for(var i=0;i0))
	{
		numbers[appleY][appleX]=4;
	}
	else
		markApple();
}
//    ,  
function drawPic(){
	for(var i=0;i

キャンバスに を するために、 の を す をマークする markSnake()を し、 の を する を り、iが0の は の 、 の の する に2、 の に3と する. を する にランダムに のx,y を し, する に する の が0 の にはその を4と し,その に する が0より きい にはその に が するという を び し, に されていない を つけるまでその を4と する.
タグ け 、drawPic()メソッドを して する に する を き、0の は しない.2の 、 の を きます.3の 、 の を きます(ここでは の と を なる で します).4の 、 を きます.( のパソコンには1 が と かれていますが、ここには の であるバリアフリーの が に かれているだけなので、1は いませんでしたが、 さんはこのようにして う を くことができます)
ここまで くと、ゲームの な が てきて、 は を かしました.ゲーム が と の を に させ、 を み ることで と を くので、 を させるには、 に されている を え、 が を べたときに の さを くすることがゲームの だと います.この をどうするか えてから、 のコードを てみましょう.
//        
function snakePerMove(x,y)//x,y          x,y        
{
	if(snake[0].y+y>=0&&snake[0].y+y<=9&&snake[0].x+x>=0&&snake[0].x+x<=9)//          
	{
		if(numbers[snake[0].y+y][snake[0].x+x]==4)//              
		{
			markApple();//      
			snake[snake.length]={x:'',y:''};//       
		}
		else
			numbers[snake[snake.length-1].y][snake[snake.length-1].x]=0;
		for(var i=snake.length-2;i>=0;i--)
		{
			snake[i+1].x=snake[i].x;
			snake[i+1].y=snake[i].y;
		}
		snake[0].x=snake[0].x+x;
		snake[0].y=snake[0].y+y;
	}
}

まず、 が にぶつかるかどうかを します.できない 、 の のステップが であれば、 たちは を し、 の さを やします.そうしないと、 の の の の を0とマークし、この を にします.その 、 の の ろから を し、 の の の を の の に しくし、snake[0]の を の に することで、 の を することができる. えば、 の の がsnake[{x:6,y:5},{x:5,y:5},{x:4,y:5}],{x:5,{x:4,y:5}],( が(6,5)) のステップで が べられなかった 、 ボタンを すとsnake[2]=snake[1],snake[1]=snake[0],snake[0]がxに1つ され、 がsnake[{x:7,y:5},{x:6,{x:5},{x:5,{x:5,y:5}]となり、 の シフトが される.
にキーボードイベントを してヘビの を します.
//       
function resetDraw(){
	context.clearRect(0,0,canvas.width,canvas.height);
	drawRct(0,0,520,10,'rgb(204,204,204)');
	drawRct(10,10,500,0,'rgba(0,0,0,0.8)');
	markSnake();
	drawPic();
}
var judgeFalse=0;//          
//     
function snakeMove(){
	document.onkeydown=function(){//    
		var e=event||window.event;
		if(e.keyCode==left)
		{
			if(snakeState.d!='right'&&snakeState.d!='left')
			{
				snakeState.d='left';
				setLeft=setTimeout(function(){snakeMoveLeft()},snakeState.v);
			}
		}
		if(e.keyCode==right)
		{
			if(snakeState.d!='right'&&snakeState.d!='left')
			{
				snakeState.d='right';
				setRight=setTimeout(function(){snakeMoveRight()},snakeState.v);
			}
		}
		if(e.keyCode==up)
		{
			if(snakeState.d!='down'&&snakeState.d!='up')
			{
				snakeState.d='up';
				setUp=setTimeout(function(){snakeMoveUp()},snakeState.v);
			}
		}
		if(e.keyCode==down)
		{
			if(snakeState.d!='down'&&snakeState.d!='up')
			{
				snakeState.d='down';
				setDown=setTimeout(function(){snakeMoveDown()},snakeState.v);
			}
		}
	}
}
//  
function snakeMoveUp(){
	if(snakeState.d=='up'){
		setUp=setTimeout(function(){snakeMoveUp()},snakeState.v);
	}
	if(snake[0].y==0||numbers[snake[0].y-1][snake[0].x]==3)
	{
		clearTimeout(setUp);
		clearTimeout(setRight);
		clearTimeout(setDown);
		clearTimeout(setLeft);
		if(judgeFalse==0){
			judgeFalse=1;
			alert('game over');
		}
		document.onkeydown=null;//       
	}
	snakePerMove(0,-1);
	resetRct();
}
//  
function snakeMoveDown(){
	if(snakeState.d=='down'){
		setDown=setTimeout(function(){snakeMoveDown()},snakeState.v);
	}
	if(snake[0].y==9||numbers[snake[0].y+1][snake[0].x]==3)
	{
		clearTimeout(setUp);
		clearTimeout(setRight);
		clearTimeout(setDown);
		clearTimeout(setLeft);
		if(judgeFalse==0){
			judgeFalse=1;
			alert('game over');
		}
		document.onkeydown=null;//       
	}
	snakePerMove(0,1);
	resetRct();
}
//  
function snakeMoveRight(){
	if(snakeState.d=='right'){
		setRight=setTimeout(function(){snakeMoveRight()},snakeState.v);
	}
	if(snake[0].x==9||numbers[snake[0].y][snake[0].x+1]==3)
	{
		clearTimeout(setUp);
		clearTimeout(setRight);
		clearTimeout(setDown);
		clearTimeout(setLeft);
		if(judgeFalse==0){
			judgeFalse=1;
			alert('game over');
		}
		document.onkeydown=null;//       
	}
	snakePerMove(1,0);
	resetRct();
}
//  
function snakeMoveLeft(){
	if(snakeState.d=='left'){
		setLeft=setTimeout(function(){snakeMoveLeft()},snakeState.v);
	}
	if(snake[0].x==0||numbers[snake[0].y][snake[0].x-1]==3)
	{
		clearTimeout(setUp);
		clearTimeout(setRight);
		clearTimeout(setDown);
		clearTimeout(setLeft);
		if(judgeFalse==0){
			judgeFalse=1;
			alert('game over');
		}
		document.onkeydown=null;//       
	}
	snakePerMove(-1,0);
	resetRct();
}
snakeMove();

するたびに い や 、 を する があるので、 、これらの を じ resetDraw()に れます.
キーを した 、まず した が が している (snakeState.d)またはその に がっているかどうかを し、もしそうであれば の を えず、そうでなければ のメソッドを び し、 の を える.ヘビが のステップで や の にぶつかると、ゲームに し、ゲームオーバーの ウィンドウをポップアップし、キーボードイベントを します.
ここでは4つのコーナーで に2つの キーを すと2つの ウィンドウがポップアップされるので、judgeFalseが ウィンドウがポップアップされたかどうかを し、 したときにポップアップウィンドウが1つしかないように しました.
ここまでの は に わりますが、もちろん の で、 が さが に すると が くなり、 にはいつ し、どれだけ くなるかは、みんなで で きます.
//       
function changeV(){
	if(snake.length==6)
		snakeState.v=400;
	else if(snakeState.length==10)
		snakeState.v=350;
	else if(snakeState.v==15)
		snakeState.v=300;
}
changeV();

の が さんに に つことを んで、 が の を して、みんなが に することを んでいます.