您现在的位置:首页 >> 前端 >> 内容

变色方块选择游戏(代码实例)

时间:2017/11/22 15:06:49 点击:

  核心提示:变色方块选择游戏(代码实例)/* Function:ColorGame-ex5 Author:Michelle Build_Date:2017-10-30 Version :1.0 *///1. 公共...

变色方块选择游戏(代码实例)

/*
	Function  :ColorGame-ex5
	Author    :Michelle
	Build_Date:2017-10-30
	Version   :1.0
 */

//1. 公共变量声明块........................................................
var canvas=document.getElementById("canvas"),
	ctx=canvas.getContext("2d");

const BIGRECT_WIDTH=300,
	  BIGRECT_HEIGHT=300,
	  MARGIN=5;
var rect={x:0,y:0,w:0,h:0};
var rect_right={x:0,y:0,w:0,h:0,step:50,color:"#fff"};
var style={color:"#000",
		   font_size:38,
		   align:"center",
		   valign:"middle",
		   font_family:"Arial"};
var text={text:"",x:0,y:0};
var iCanvasWidth=canvas.width,
	iCanvasHeight=canvas.height;
var bFlag=false,iBlocks=2;
var bigRect={x:iCanvasWidth/2-BIGRECT_WIDTH/2,
			y:iCanvasHeight/2-BIGRECT_HEIGHT/2,
			w:BIGRECT_WIDTH,
			h:BIGRECT_HEIGHT};
//2. 函数定义块...........................................................
function drawText(text,style,mode){
	ctx.save();
	ctx.textAlign = style.align;
	ctx.textBaseline = style.valign;
	ctx.font=style.font_size+"px "+style.font_family;
	if(!mode){
		ctx.strokeStyle = style.color;
		ctx.strokeText(text.text, text.x, text.y);
	}
	else{
		ctx.fillStyle = style.color;
		ctx.fillText(text.text, text.x, text.y);
	}
	ctx.restore();
}
function drawRect(rect,style,mode){
	ctx.beginPath();
	ctx.rect(rect.x, rect.y, rect.w, rect.h);
	ctx.save();

	if(!mode){
		ctx.strokeStyle = style.color;
		ctx.stroke();
	}
	else{
		ctx.fillStyle = style.color;
		ctx.fill();
	}

	ctx.restore();
	ctx.closePath();

}
function drawRects(nums){
	// 清除屏幕
	ctx.clearRect(0, 0, iCanvasWidth,iCanvasHeight);

	// 绘制外部矩形
	style.color="#000";
	drawRect(bigRect,style,0);

	// 绘制小矩形
 	iNumsInLine=Math.sqrt(nums);
	rectWidth=(BIGRECT_WIDTH-(iNumsInLine+1)*MARGIN)/iNumsInLine;
	rect.w=rectWidth;
	rect.h=rect.w;

	// hsl颜色模式
	// h表示色相(0~360),s表示饱和度(0~100%),l表示亮度(0~100%)
	h=parseInt(Math.random()*360);
	s=100;
	l=50;
	iRight=parseInt(Math.random()*nums)+1;
	hsl="hsl(" + h + "," + s+ "%," + l + "%)";
	
	style.color=hsl;
	
	// 答案方块色的递减值设置
	rect_right.step-=nums;
	// 游戏出口,当饱和度递减值为<=0,即和别的颜色相同了,就退出
	if(rect_right.step<=0) {
		ctx.clearRect(0, 0, iCanvasWidth, iCanvasHeight);
		style.color="#000";
		drawText(text,style,1);
		return;
	}
	// hsl模式,饱和度s值递减
	s-=rect_right.step;
	// 生成新的不同于别的方块的颜色
	rect_right.color="hsl(" + h + "," + s+ "%," + l + "%)";
	// 生成答案色块的行列值
	iRowNo=0;
	iRowNo=parseInt(iRight/iNumsInLine);
	if(iRight%iNumsInLine==0) iRowNo=parseInt(iRight/iNumsInLine)-1;
	iColNo=iRight-iRowNo*iNumsInLine;
	// 生成答案色块的位置和大小
	rect_right.x=(iColNo-1)*rect.w+iColNo*MARGIN+bigRect.x;
	rect_right.y=iRowNo*rect.h+iRowNo*MARGIN+bigRect.y;
	rect_right.w=rect.w;
	rect_right.h=rect.h;

	// 2、循环法画小矩形
	for(i=0;i=rect_right.x && 
		event.clientX<=rect_right.x+rect_right.w)
		&&
		(event.clientY>=rect_right.y && 
		event.clientY<=rect_right.y+rect_right.h)){
		iBlocks+=1;
		drawRects(iBlocks*iBlocks);
		
	}
}
canvas.onclick=onCanvasClick;
// canvas.addEventListener("click",onCanvasClick);

//4. 初始化块............................................................
text.text="GAME OVER!";
text.x=iCanvasWidth/2;
text.y=iCanvasHeight/2;

drawRects(iBlocks*iBlocks);
<!DOCTYPE html>  
<html>  
<head>  
    <meta charset="utf-8">  
    <meta http-equiv="X-UA-Compatible" content="IE=edge">  
    <title></title>  
    <style type="text/css" media="screen">  
        canvas{  
            border:1px solid green;  
        }  
    </style>  
    <link rel="stylesheet" href="">  
</head>  
<body>  
    <canvas id="canvas" width="600" height="400" >  
        Your Browser does not support Canvas, please upgrade  
    </canvas>  
  
    <script type="text/javascript" src="example1030.js"></script>  
</body>  
</html>  

作者:网络 来源:ydmichelle