用canvas写 看你有多色 游戏

看你有多色,前一阵在朋友圈很火的一个游戏,前两天写到半夜两点,自己把他写出来了,供学习JavaScript的canvas人看。

没有用什么特别的技术,简单易懂。

html文件很简单,放一个canvas控件,关联css和js文件

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title></title>
    <link type="text/css" rel="stylesheet" href="css/style.css">
</head>
<body>

<canvas id="canvas">对不起,您的浏览器不支持canvas</canvas>
<div id="time">剩余时间:60秒</div>
<div id="count">第1关</div>

</body>
<script type="text/javascript" src="js/mainScript.js"></script>
</html>

js文件

初始化游戏

function initGame(){
    canvas=document.getElementById("canvas");
    canvas.width=window.innerWidth;
    canvas.height=window.innerHeight;
    // 给canvas添加单击事件
    canvas.addEventListener("mousedown",click);
    n=2;
    count=1;
    time=60;
    if(canvas.getContext("2d")){
        context=canvas.getContext("2d");
        addRect();
    }
    var timeDiv=document.getElementById("time");
    timeDiv.innerHTML="剩余时间:"+time;
    var countDiv=document.getElementById("count");
    countDiv.innerHTML="第"+count+"关";
    countDown();
}
调用倒计时函数

// 倒计时函数
function countDown(){
    var timeDiv=document.getElementById("time");
    var t=setInterval(function(){
        time--;
        timeDiv.innerHTML="剩余时间:"+time+"秒";
        if(time<=0){
            clearInterval(t);
            alert("游戏结束,您闯过了"+count+"关");
            initGame();
        }
    },1000)
}


定义canvas的大小

// 定义Canvas的大小,以宽和高中最小的那个为准
function getSize() {
    if (window.innerHeight >= window.innerWidth) {
        return window.innerWidth;
    } else {
        return window.innerHeight-60;
    }
}

创建一个方块

/*
 * 创建一个方块的函数
 * cxt:画笔
 * n: 一共创建几个方块
 * x:方块在屏幕上的x坐标,如0,1,2
 * y:方块在屏幕上的y坐标
 * color:创建方块的颜色
 * chooseColor:需要变浅的方块的颜色
 */
function createRect(n,x,y,color){
    context.beginPath();
    // 画正方形
    context.fillStyle=color;
    context.fillRect(x*getSize()/n-5,y*getSize()/n-5,getSize()/n-5,getSize()/n-5);
    context.closePath();
}

单击后添加方块,有一个方块的透明度是其他的0.9

// 向屏幕里面添加方块
function addRect() {
    var rColor=parseInt(Math.random()*255);
    var gColor=parseInt(Math.random()*255);
    var bColor=parseInt(Math.random()*255);
    var color="rgb("+rColor+","+gColor+","+bColor+")";
    var colorChoose="rgba("+rColor+","+gColor+","+bColor+",0.9)";
    // 随机生成x和y作为变成浅色的位置
    x = parseInt(Math.random() * n);
    y = parseInt(Math.random() * n);

    for (var i = 0; i < n; i++) {
        for (var j = 0; j < n; j++) {
            if(x!=i||y!=j) {
                createRect(n, i, j, color);  // 画方块
            }
        }
    }
    createRect(n, x, y, colorChoose);
}

单击时触发的事件

// 点击的函数
function click() {
    //  记录现在的点的坐标
    // event.preventDefault();
    //var touch = event.touches[0];
    var indexX = event.clientX;  // 触摸点的X轴坐标
    var indexY = event.clientY;
    if(indexX>x*getSize()/n-5&&indexX<(getSize()/n-5+x*getSize()/n-5)&&indexY>y*getSize()/n-5+60&&indexY<(y*getSize()/n-5+getSize()/n-5+60)){
        if(n<8){
            n++;
        }
        count++;
        var countDiv=document.getElementById("count");
        countDiv.innerHTML="第"+count+"关";
        context.clearRect(0,0,getSize(),getSize());
        addRect();
    }
}

css文件中简单的进行布局

html,body{
    position: relative;
    width: 100%;
    height: 100%;
    overflow: hidden;
    margin: 0;
}

#canvas{
    position: absolute;
    top:60px;
    left: 0;
    width: 100%;
    margin: 0 auto;
}

#time,#count{
    position: absolute;
    top: 0;
    left: 0;
    height: 30px;
    font-size: 1.5em;
}

运行效果



手机端运行效果


以上就是主要方法了,源代码的下载地址

http://download.csdn.net/detail/u011035046/9156823


好的,我可以为您提供一个简单的拼图小游戏的示例代码代码中使用了HTML5的canvas元素和JavaScript语言来实现。 HTML部分: ```html <!DOCTYPE html> <html> <head> <title>拼图小游戏</title> <style> canvas { border: 1px solid black; } </style> </head> <body> <canvas id="canvas" width="400" height="400"></canvas> <button id="startBtn">开始</button> <script src="game.js"></script> </body> </html> ``` JavaScript部分: ```javascript var canvas = document.getElementById("canvas"); var ctx = canvas.getContext("2d"); var img = new Image(); img.src = "puzzle.jpg"; var tileSize = 100; // 每个拼图块的大小 var rows = 4; // 拼图块的行数 var cols = 4; // 拼图块的列数 var tiles = []; // 存储所有拼图块的数组 var emptyTile = {row: rows-1, col: cols-1}; // 空白拼图块位置 img.onload = function() { init(); } function init() { drawImage(); createTiles(); shuffleTiles(); drawTiles(); } function drawImage() { ctx.drawImage(img, 0, 0, canvas.width, canvas.height); } function createTiles() { for (var r = 0; r < rows; r++) { for (var c = 0; c < cols; c++) { var tile = { row: r, col: c, x: c * tileSize, y: r * tileSize, imageX: c * tileSize, imageY: r * tileSize }; tiles.push(tile); } } } function shuffleTiles() { for (var i = tiles.length-1; i >= 0; i--) { var randomIndex = Math.floor(Math.random() * i); var temp = tiles[i]; tiles[i] = tiles[randomIndex]; tiles[randomIndex] = temp; } } function drawTiles() { ctx.clearRect(0, 0, canvas.width, canvas.height); for (var i = 0; i < tiles.length; i++) { var tile = tiles[i]; ctx.drawImage(img, tile.imageX, tile.imageY, tileSize, tileSize, tile.x, tile.y, tileSize, tileSize); } } function getClickedTile(mouseX, mouseY) { for (var i = 0; i < tiles.length; i++) { var tile = tiles[i]; if (mouseX >= tile.x && mouseX < tile.x + tileSize && mouseY >= tile.y && mouseY < tile.y + tileSize) { return tile; } } return null; } canvas.addEventListener("click", function(event) { var mouseX = event.clientX - canvas.offsetLeft; var mouseY = event.clientY - canvas.offsetTop; var clickedTile = getClickedTile(mouseX, mouseY); if (clickedTile) { if (isValidMove(clickedTile)) { moveTile(clickedTile); drawTiles(); if (isGameComplete()) { alert("拼图完成!"); } } } }); function isValidMove(tile) { if (tile.row == emptyTile.row && Math.abs(tile.col - emptyTile.col) == 1) { return true; } if (tile.col == emptyTile.col && Math.abs(tile.row - emptyTile.row) == 1) { return true; } return false; } function moveTile(tile) { var temp = { row: tile.row, col: tile.col, x: tile.x, y: tile.y }; tile.row = emptyTile.row; tile.col = emptyTile.col; tile.x = emptyTile.col * tileSize; tile.y = emptyTile.row * tileSize; emptyTile.row = temp.row; emptyTile.col = temp.col; emptyTile.x = temp.col * tileSize; emptyTile.y = temp.row * tileSize; } function isGameComplete() { for (var i = 0; i < tiles.length; i++) { var tile = tiles[i]; if (tile.row != Math.floor(i / cols) || tile.col != i % cols) { return false; } } return true; } document.getElementById("startBtn").addEventListener("click", function() { shuffleTiles(); drawTiles(); }); ``` 代码中首先加载一张拼图图片,然后创建一个指定大小和行列数的拼图块数组,并使用shuffleTiles()方法对拼图块进行随机打乱。在绘制拼图块时,可以根据拼图块的位置和大小,从图片中截取拼图块对应的部分并绘制到canvas中。 当用户点击canvas时,根据鼠标坐标获取点击的拼图块,如果该拼图块与空白拼图块相邻且可以移动,则进行移动并重新绘制拼图块。当拼图全部拼好后,弹出提示框告知用户游戏完成。 最后,为了让用户可以重新开始游戏,我们添加了一个开始按钮,点击该按钮可以重新打乱拼图块并进行游戏
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值