去年挺火的一个游戏,当时想做但因为颜色不知道怎么根据难度调整,今天有空的时候尝试写了出来,可能不是很专业,但至少难度还是比较符合常理的,颜色差距会随着正确次数越多而逐渐缩小。

QQ截图20160418171618

演示链接:http://wx.karlew.com/findcolor/

下面是完整代码:

  1. <html>
  2. <head>
  3. <title>找不同色块的游戏</title>
  4. <style>
  5.     body{
  6.         padding:0;
  7.         margin:0;
  8.         width:100%;
  9.         height:100%;
  10.         background-color:#f3f3f3;
  11.         overflow:hidden;
  12.         display: table;
  13.     }
  14.     div{
  15.         display: table-cell;
  16.         vertical-align: middle;
  17.         text-align: center;
  18.     }
  19. </style>
  20. </head>
  21. <body>
  22.     <div>
  23.         <canvas id='canvas'>您的浏览器不支持canvas</canvas>
  24.     </div>
  25. </body>
  26. </html>
  27. <script>
  28.     canvas = document.getElementById('canvas'),
  29.     size = window.innerWidth<window.innerHeight?window.innerWidth:window.innerHeight
  30.     canvas.width = size
  31.     canvas.height = size
  32.     ctx = canvas.getContext('2d')
  33.     var rank=0,n=2
  34.     targetX=parseInt(Math.random()*n)
  35.     targetY=parseInt(Math.random()*n)
  36.     addRect()
  37.     canvas.onclick = function(e){
  38.         bcr =canvas.getBoundingClientRect()
  39.         clickX = e.clientX- bcr.left *(canvas.width / bcr.width)
  40.         clickY = e.clientY- bcr.top *(canvas.height / bcr.height)
  41.         if(checkArea(clickX,clickY)){
  42.             rank++
  43.             ctx.clearRect(0,0,size,size)
  44.             if(rank>60){
  45.                 alert("天才,你已经通关了,得分为"+rank+"分")
  46.                 rank=0
  47.                 n=2
  48.             }else if(n<8){
  49.                 n++
  50.             }
  51.         }else{
  52.             alert("游戏结束,你的分数为:"+rank+"分")
  53.             ctx.clearRect(0,0,size,size)
  54.             rank=0
  55.             n=2
  56.         }
  57.         targetX = parseInt(Math.random()*n)
  58.         targetY = parseInt(Math.random()*n)
  59.         addRect()
  60.     }
  61.     //判断点击的位置是否为不同色块所在区域
  62.     function checkArea(clickX,clickY){
  63.         beginX = size*targetX/n
  64.         endX = size*(targetX+1)/n
  65.         beginY = size*targetY/n
  66.         endY = size*(targetY+1)/n
  67.         if(clickX>=beginX&&clickX<=endX&&clickY>=beginY&&clickY<=endY){
  68.             return true
  69.         }else{
  70.             return false
  71.         }
  72.     }
  73.     //向canvas添加多个矩形
  74.     function addRect(){
  75.         itemSize = size/n
  76.         rectSize = itemSize-size*0.06/n
  77.         rectPadding = size*0.03/n
  78.         rectRadius = size*0.1/n
  79.         colorArr = setColor()
  80.         color = colorArr.color
  81.         scolor = colorArr.scolor
  82.         for(var x=0;x<n;x++){
  83.             for(var y=0;y<n;y++){
  84.                 if(x!=targetX||y!=targetY){
  85.                     drawRect(color,x*itemSize+rectPadding,y*itemSize+rectPadding,rectSize,rectSize,rectRadius)
  86.                 }else{
  87.                     drawRect(scolor,x*itemSize+rectPadding,y*itemSize+rectPadding,rectSize,rectSize,rectRadius)
  88.                 }
  89.             }
  90.         }
  91.     }
  92.     //画圆角矩形,r为圆角半径
  93.     function drawRect(color,x,y,w,h,r) {
  94.         ctx.beginPath()
  95.         ctx.moveTo(x-r,y)
  96.         ctx.arcTo(x+w,y,x+w,y+h,r)
  97.         ctx.arcTo(x+w,y+h,x,y+h,r)
  98.         ctx.arcTo(x,y+h,x,y,r)
  99.         ctx.arcTo(x,y,x+r,y,r)
  100.         ctx.fillStyle = color
  101.         ctx.fill()
  102.     }
  103.     //颜色配置
  104.     function setColor(){
  105.         rgbArr = [ parseInt(Math.random()*100+150), parseInt(Math.random()*250), parseInt(Math.random()*200) ]
  106.         rgbArr.sort(randomsort);
  107.         red=rgbArr[0]
  108.         green=rgbArr[1]
  109.         blue=rgbArr[2]
  110.         //设置颜色数字变化范围
  111.         if(Math.random()>0.5){
  112.             index = parseInt((100-rank)/5)
  113.         }else{
  114.             index = -parseInt((100-rank)/5)
  115.         }
  116.         color="rgb("+red+", "+green+", "+blue+")"
  117.         scolor="rgb("+(red+index)+", "+(green+index)+", "+(blue+index)+")"
  118.         return{
  119.             color:color,
  120.             scolor:scolor
  121.         }
  122.     }
  123.     //打乱颜色数组数组
  124.     function randomsort() {
  125.         return Math.random()>0.5 ? -1 : 1
  126.     }
  127. </script>

欢迎留言