canvas+js簡単なヘビ食いゲームを実現(進級編)

10860 ワード

+jsで簡単なヘビを食べるゲームを実現することによって、私たちは基本的なヘビを食べるゲームを実現し、ヘビを食べて果実を移動し、食べることができますが、ヘビは今多くのバージョンに多かれ少なかれ内容を追加しています.今日、私は以上のブログを基礎に、ヘビを食べるゲームにいくつかの新しい内容を追加します.容器貫通、障害物の設置、道具の設置.
まず、前のブログの長さと幅が10*10の配列は、より多くの内容を追加するために、ここではまず配列を20*20に拡張します.
var numbers=new Array(20);
for(var i=0;i

これまで実装されていたヘビ食いゲームでは、ヘビを4つぶつけた後に失敗することが多かったが、多くのヘビ食いゲームでは、実は反対方向に現れながら、この効果を実現するために、また異なる人の好みを満たすために、つまりゲームでぶつけたときに失敗するモードと反対方向になるモードを設定し、まずhtmlに対応する選択ボタンを追加することができる.(ここでは自分でゲームのトップページを設定し、各設定とゲーム開始インタフェースの間でジャンプすることができます.ここではジャンププロセスのjsコードは書かれていません)
//
canvas, 0

ここでは、ゲームインタフェースに現在のスコアを表示する追加を行い、以下で別の効果を実現します.
次に、どのラジオボタンが選択されているかを判断することで、現在のモードを判断します.小蛇が一歩一歩動く方法を書き直す.
//       
var rank=0;
//        
function snakePerMove(x,y)
{
	if((snake[0].y+y>=0&&snake[0].y+y<=19&&snake[0].x+x>=0&&snake[0].x+x<=19)||(document.getElementsByTagName('input')[1].checked))
	{
		numbers[snake[snake.length-1].y][snake[snake.length-1].x]=0;
		if(snake[0].y+y>=0&&snake[0].y+y<=19&&snake[0].x+x>=0&&snake[0].x+x<=19){
			if(numbers[snake[0].y+y][snake[0].x+x]==4)
			{
				markApple();
				rank++;
				score+=10;
				myScore.innerHTML=score;
				snake[snake.length]={x:'',y:''};
			}
		for(var i=snake.length-2;i>=0;i--)
		{
			snake[i+1].x=snake[i].x;
			snake[i+1].y=snake[i].y;
		}
		if((document.getElementsByTagName('input')[1].checked)&&!(snake[0].y+y>=0&&snake[0].y+y<=19&&snake[0].x+x>=0&&snake[0].x+x<=19)){//                
			if(snake[0].y+y>19)
			{
				snake[0].y=0;
			}
			if(snake[0].y+y<0)
			{
				snake[0].y=19;
			}
			if(snake[0].x+x>19)
			{
				snake[0].x=0;
			}
			if(snake[0].x+x<0)
			{
				snake[0].x=19;
			}
		}
		else{
			snake[0].x=snake[0].x+x;
			snake[0].y=snake[0].y+y;
		}
	}
}

ここでdocument.getElementsByTagName('input')[1].checkedは、貫通モードが選択されているかどうかを判断し、そうでなければtrueを返し、そうでなければfalseを返します.ヘビの次のステップがコンテナ内にある場合にのみ、次のステップに移動できる条件に加えて、貫通モードを追加するか、選択しました.つまり、ヘビが次のステップでコンテナから出る場合、貫通モードが選択されている場合は、次のステップに進むことができます.そして、次に貫通モードにおいて小蛇の頭部の位置が容器を超えているか否かを判断し、もし、容器の反対側から現れ、これにより片側の縁から反対側に抜ける機能が完了する.
ここで、私は果実を食べるたびに点数を10加算し、後で蛇の長さを変えるので、蛇の長さを速度変化の判断基準とせず、rankを速度変化の判断基準とし、速度変化の方法を書き換えます.
//       
function changeV(){
	if(rank==6)
		snakeState.v=400;
	else if(rank==10)
		snakeState.v=350;
	else if(rank==15)
		snakeState.v=300;
}

次に障害物の出現に着手し,果実,蛇の出現と同様に,まず配列に障害物の位置を表示し,canvasキャンバスに描く.まず、何枚かの地図を選択できるように、まず地図の中の障害物の位置を配列に保存します.
var barriers=[
	[],//    
	[
		{x:8,y:10},
		{x:9,y:10},
		{x:10,y:10},
		{x:11,y:10},
		{x:12,y:10},
		{x:10,y:8},
		{x:10,y:9},
		{x:10,y:11},
		{x:10,y:12}
	],
	[
		{x:6,y:10},
		{x:7,y:10},
		{x:8,y:10},
		{x:9,y:10},
		{x:10,y:10},
		{x:11,y:10},
		{x:12,y:10},
		{x:13,y:10},
		{x:14,y:10},
		{x:6,y:6},
		{x:7,y:6},
		{x:8,y:6},
		{x:9,y:6},
		{x:10,y:6},
		{x:11,y:6},
		{x:12,y:6},
		{x:13,y:6},
		{x:14,y:6},
		{x:6,y:14},
		{x:7,y:14},
		{x:8,y:14},
		{x:9,y:14},
		{x:10,y:14},
		{x:11,y:14},
		{x:12,y:14},
		{x:13,y:14},
		{x:14,y:14}
	]
];

配列に障害物のx,y座標を保存し,配列を遍歴することで対応する位置を1とし,描画方法で対応する配列を1としたときに描いた内容を書き出した.小蛇の移動中に障害物にぶつかって失敗したと判断する条件、すなわち配列の次の位置を判断する数字が1であるかどうかを判断する.ここでは失敗した処理を1つの方法にカプセル化する.
//     
function markBarrier(index){
	for(var i=0;i0){
		if((snake[0].y==0&&document.getElementsByTagName('input')[0].checked)||numbers[snake[0].y-1][snake[0].x]==3||numbers[snake[0].y-1][snake[0].x]==1)
		{
			falseHandle();
		}
	}
	if((snake[0].y-1<0)&&(document.getElementsByTagName('input')[0].checked))
	{
		falseHandle();
	}
	snakePerMove(0,-1);
	resetRct();
}
function snakeMoveDown(){//  
	if(snakeState.d=='down'){
		setDown=setTimeout(function(){snakeMoveDown()},snakeState.v);
	}
	if(snake[0].y+1<19){
		if((snake[0].y==19&&document.getElementsByTagName('input')[0].checked)||numbers[snake[0].y+1][snake[0].x]==3||numbers[snake[0].y+1][snake[0].x]==1)
		{
			falseHandle();
		}
	}
	if((snake[0].y+1>19)&&(document.getElementsByTagName('input')[0].checked))
	{
		falseHandle();
	}
	snakePerMove(0,1);
	resetRct();
}
function snakeMoveRight(){  
	if(snakeState.d=='right'){
		setRight=setTimeout(function(){snakeMoveRight()},snakeState.v);
	}
	if(snake[0].x+1<19){
		if((snake[0].x==19&&document.getElementsByTagName('input')[0].checked)||numbers[snake[0].y][snake[0].x+1]==3||numbers[snake[0].y][snake[0].x+1]==1)
		{
			falseHandle();
		}
	}
	if((snake[0].x+1>19)&&(document.getElementsByTagName('input')[0].checked))
	{
		falseHandle();
	}
	snakePerMove(1,0);
	resetRct();
}
function snakeMoveLeft(){  
	if(snakeState.d=='left'){
		setLeft=setTimeout(function(){snakeMoveLeft()},snakeState.v);
	}
	if(snake[0].x-1>0){
		if((snake[0].x==0&&document.getElementsByTagName('input')[0].checked)||numbers[snake[0].y][snake[0].x-1]==3||numbers[snake[0].y][snake[0].x-1]==1)
		{
			falseHandle();
		}
	}
	if((snake[0].x-1<0)&&(document.getElementsByTagName('input')[0].checked))
	{
		falseHandle();
	}
	snakePerMove(-1,0);
	resetRct();
}

次に、地図を選択するためにhtmlに対応する内容を追加しますが、新しい地図を追加するたびに画像を再追加する場合は、地図の障害物の位置を変更すると、画像全体を再描画しなければなりません.このような面倒を避けるためにhtmlにdivを追加してcanvasラベルを追加し、jsで障害物の配列を巡ることで、このdivに各地図に対応するcanvasラベルを追加し、イベントを追加して対応するcanvasラベルを選択する際に対応する地図を使用します.

//       
var picChoose=0;
//          
var minLength=5;
//     
markBarrier(picChoose);
//     
function setMaps(){
	var txt=document.createTextNode('        canvas,              ');
	var canvasArray=[];
	var contextArray=[];
	for(var i=0;i

最後に、道具の設定を完了します.私はここにいくつかの比較的簡単に実現できる道具を設置して、加速して、減速して、長さは短くなって、次の食べた果実の点数は倍になります.まずアイテムをランダムに表示するには、4つのアイテムに対応する配列の数字を5,6,7,8に設定し、アイテムをマークするときに乱数Mathを使用します.floor(Math.random(*)*4)+5は、ランダムに5-8の数字を取得し、配列内の対応する位置にその数字をマークします.そしていつ道具を出現させるかを判断し、ここでrankが5の倍数であるか否かを判断して道具を追加するか否かを判断し、小蛇移動に次のステップ5-8で対応する処理方式を追加する.速度の増減はsnakeStateを変える.vの値は効果を達成する.長さが短くなるには、短くなった後の余分な長さの位置に対応する配列を0とマークし、蛇の配列の長さを変更します.次の果実の点数を2倍にして、私は1つのブール型変数でその道具を食べるかどうかを判断して、もし、次の果実の点数を2倍にして、そのブール型変数をリセットします.
//         
var scoreMul=false;
//      
function markProp(propRandom){
	if(propRandom=='')
		propRandom=Math.floor(Math.random()*4)+5;
	var propX=Math.floor(Math.random()*20);
	var propY=Math.floor(Math.random()*20);
	if(!(numbers[propY][propX]>0))
	{
		numbers[propY][propX]=propRandom;
		setTimeout(function(){
			if(numbers[propY][propX]==propRandom)
				numbers[propY][propX]=0;
		},10000);//    10    
	}
	else
		markProp(propRandom);
}
//    
function drawProp(Alpha,color,i,j){//Alpha       
	context.arc(10+(j+0.5)*perLength,10+(i+0.5)*perLength,appleR,0,2*Math.PI);
	context.fillStyle=color;
	context.fill();
	context.closePath();
	context.beginPath();
	context.fillStyle='rgb(0,0,0)';//      
	context.textAlign='center';
	context.textBaseline='middle';
	context.font='18px Adobe Ming Std';
	context.fillText(Alpha,10+(j+0.5)*perLength,10+(i+0.5)*perLength);
}
//    ,  ,   ,  
function drawPic(){
	for(var i=0;i=0&&snake[0].y+y<=19&&snake[0].x+x>=0&&snake[0].x+x<=19)||(document.getElementsByTagName('input')[1].checked))
	{
		numbers[snake[snake.length-1].y][snake[snake.length-1].x]=0;
		if(snake[0].y+y>=0&&snake[0].y+y<=19&&snake[0].x+x>=0&&snake[0].x+x<=19){
			if(numbers[snake[0].y+y][snake[0].x+x]==4)
			{
				markApple();
				if(rank%5==0&&rank!=0)//     7        
				{
					markProp('');
				}
				if(!scoreMul)//           
					score+=10;
				else
				{
					score+=50;
					scoreMul=false;
				}
				rank++;
				snake[snake.length]={x:'',y:''};
				myScore.innerHTML=score;
			}
			else if(numbers[snake[0].y+y][snake[0].x+x]==5)
			{
				snakeState.v=snakeState.v*1.25;//          0.8 
			}
			else if(numbers[snake[0].y+y][snake[0].x+x]==6)
			{
				snakeState.v=snakeState.v*0.8;//          1.25 
			}
			else if(numbers[snake[0].y+y][snake[0].x+x]==7)
			{
				for(var i=Math.ceil(snake.length/2);i=0;i--)
		{
			snake[i+1].x=snake[i].x;
			snake[i+1].y=snake[i].y;
		}
		if((document.getElementsByTagName('input')[1].checked)&&!(snake[0].y+y>=0&&snake[0].y+y<=19&&snake[0].x+x>=0&&snake[0].x+x<=19)){
			if(snake[0].y+y>19)
			{
				snake[0].y=0;
			}
			if(snake[0].y+y<0)
			{
				snake[0].y=19;
			}
			if(snake[0].x+x>19)
			{
				snake[0].x=0;
			}
			if(snake[0].x+x<0)
			{
				snake[0].x=19;
			}
		}
		else{
			snake[0].x=snake[0].x+x;
			snake[0].y=snake[0].y+y;
		}
	}
}

ここまで3つの机能はすでに完成して、この博文がみんなに役に立つことを望んで、もし文章の中でどんな间违いが现れたら、万望各位大神は本白を知らせて、とても感谢します.