一个canvas小游戏

https://github.com/Web-ZhangJian/jianfengchazhen

JavaScript代码:
var canvas=document.querySelector("#canvas");
var ctx=canvas.getContext("2d");
var centerX = 400;//大圆X轴坐标
var centerY = 200;//大圆Y轴坐标
var bigRadius = 50;// 大圆半径
var smallRadius = 10;//小球半径
var line = 100;//线条的长度
var balls = [];//定义一个用于存储转动小球数组 =  {'angle':120,numStr:''}
var waitBalls = [];//定义一个用于存储等待小球数组
//游戏模拟数据
var level;//定义游戏关卡
//重置关卡
var re=document.querySelector("#reset");
re.οnclick=function(){
    window.location.href = "index.html#"+0;
};
if(parseInt(window.location.href.split("#")[1])){
    level = parseInt(window.location.href.split("#")[1]);
    console.log(level);
}else{
    level = 0;
}
var levelArr=[          //设置关卡  ballNum转动小球  waitNum等待小球  speed速度
    {"ballNum":3, "waitNum":5, "speed":1},
    {"ballNum":4, "waitNum":8, "speed":1},
    {"ballNum":5, "waitNum":5, "speed":1},
    {"ballNum":6, "waitNum":8, "speed":1},
    {"ballNum":7, "waitNum":10, "speed":1},
    {"ballNum":8, "waitNum":12, "speed":1},
    {"ballNum":9, "waitNum":15, "speed":1},
    {"ballNum":10, "waitNum":18, "speed":1},
    {"ballNum":5, "waitNum":8, "speed":2},
    {"ballNum":6, "waitNum":10, "speed":2},
    {"ballNum":7, "waitNum":12, "speed":2},
    {"ballNum":6, "waitNum":8, "speed":3},
    {"ballNum":7, "waitNum":10, "speed":3},
    {"ballNum":8, "waitNum":12, "speed":3},
    {"ballNum":9, "waitNum":14, "speed":3}
];
var ballNum = levelArr[level].ballNum;//定义转动小球数量
var waitNum = levelArr[level].waitNum;//定义等待小球数量
var speed=levelArr[level].speed;//定义旋转速度  用以控制游戏难度
//定义全局的画笔样式
ctx.textAlign="center";//水平居中
ctx.textBaseline="middle";//垂直居中

function drawBig(){
    //绘制大圆
    ctx.beginPath();
    ctx.arc(centerX,centerY,bigRadius,0,Math.PI*2);
    ctx.closePath();
    ctx.fillStyle="#000";
    ctx.fill();
    //绘制关卡数
    ctx.fillStyle="#fff";
    ctx.font = "50px 微软雅黑";
    ctx.fillText(level+1,centerX,centerY);
}

//小球转动数据
    for(var i=0;i<ballNum;i++){
        var angle=360/ballNum*i;
        balls.push({
            angle:angle,
            numStr:''
        })
    }

//整体旋转
function drawBalls(){
    ctx.save();
    ctx.clearRect(200,20,400,350);
    drawBig();
    ctx.translate(centerX,centerY);//设置圆心位置
    //绘制转动小球
    balls.forEach(function(item){//通过循环遍历绘制小球,item 为数组每次遍历的元素
        ctx.save();//保存
        //旋转
        ctx.rotate(Math.PI/180*item.angle);
        item.angle+=speed;//增加角度   用以控制游戏难度
        if(item.angle>=360)item.angle=item.angle-360;//角度恢复
        //绘制小球线条
        ctx.beginPath();
        ctx.moveTo(0,-bigRadius);
        ctx.lineTo(0,-(bigRadius+line));
        ctx.stroke();
        ctx.closePath();
        //绘制小球
        ctx.beginPath();
        ctx.fillStyle="#000";
        ctx.arc(0,-(bigRadius+line),smallRadius,0,Math.PI*2);
        ctx.fill();
        ctx.closePath();
        //绘制数字
        if(item.numStr!=''){
            ctx.fillStyle="#fff";
            ctx.font="12px 微软雅黑";
            ctx.fillText(item.numStr,0,-(bigRadius+line));
        }
        ctx.restore();//恢复
    });
    ctx.restore();
    window.requestAnimationFrame(drawBalls);
}
drawBalls();

//小球储存信息
    for(var i=waitNum;i>0;i--){
        waitBalls.push({
            angle:'',
            numStr:i
        })
    }

//绘制等待小球
function drawWaitBalls(){
    //清空等待小球区域位置
    ctx.clearRect(390,350,20,450);
    //等待的小球
    waitBalls.forEach(function(item,index){//通过循环遍历绘制小球,item 为数组每次遍历的元素 index是索引值
        ctx.save();//保存
        //位移
        ctx.translate(0,30*index);
        //绘制等待小球
        ctx.beginPath();
        ctx.fillStyle="#000";
        ctx.arc(centerX,centerY+200,smallRadius,0,Math.PI*2);
        ctx.fill();
        ctx.closePath();
        ctx.fillStyle="#fff";
        ctx.font = "12px 微软雅黑";
        ctx.fillText(item.numStr,centerX,centerY+200);
        ctx.restore();
    });
}
drawWaitBalls();

//canvas 点击事件
var gameOver=false;
canvas.οnclick=function(){
    //删除等待小球,并且把删除的小球插入到转动小球的末尾处
    var obj = waitBalls.shift();
    //更改小球的角度
    obj.angle=180;
    //通过循环判断小球是否被撞
    for(var i=0;i<balls.length;i++){
        //console.log(balls[i].angle);
        if(balls[i].angle>=172.4&&balls[i].angle<=187.6){
            gameOver=true;
            break;
        }
    }
    //如果等待小球撞到旋转小球,游戏就结束
    if(gameOver){
        alert('闯关失败');
        //重置当前关卡
        window.location.href = "index.html#"+level;
        gameOver=false;
    }else if(waitBalls.length==0){
        alert('成功过关');
        level++;
        if(level>=levelArr.length)alert('通关');
        window.location.href = "index.html#"+level;
        //drawBalls();
        //drawWaitBalls();
        //location.reload();//重新加载页面  刷新
    }
    //将删除的小球插入
    balls.push(obj);
    //重新绘制等待小球区域
    drawWaitBalls();
};

见缝插针 一个canvas小游戏相关推荐

  1. 开发一个Canvas小游戏 实现一个游戏“引擎”

    前言 这个游戏其实在三四年前就写了,中间还重构过好几次,之前都是用简单的面向对象和函数式编程来写,游戏中的元素关系到还是分的挺开,但是游戏的渲染,运算等逻辑分的不够清晰,整个逻辑基本都是自顶向下的流水 ...

  2. 一个类打地鼠的canvas小游戏

    html 部分 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www ...

  3. 大家都在发圣诞树,我偏偏要发一个圣诞小游戏给大家玩【内附源码】

    ​大家好,我是辣条. 前言 圣诞节快来了,热榜都被一堆圣诞树攻占了,这样的流量密码我怎么会错过,大家都发圣诞树,我就不发啦,直接分享一个圣诞小游戏给大家玩,代码太长一定要先赞和收藏. 领取福利 300 ...

  4. 类打地鼠canvas小游戏

    HTML代码部分: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://w ...

  5. python经典小游戏-用Python设计一个经典小游戏:猜大小

    码农那点事儿 关注我们,一起学习进步 本文主要介绍如何用Python设计一个经典小游戏:猜大小. 游戏规则: 初始本金是1000元,默认赔率是1倍,赢了,获得一倍金额,输了,扣除1倍金额. 玩家选择下 ...

  6. 20行python代码的入门级小游戏-用Python设计一个经典小游戏

    本文主要介绍如何用Python设计一个经典小游戏:猜大小. 在这个游戏中,将用到前面我介绍过的所有内容:变量的使用.参数传递.函数设计.条件控制和循环等,做个整体的总结和复习. 游戏规则: 初始本金是 ...

  7. python经典小游戏-用Python设计一个经典小游戏

    本文主要介绍如何用Python设计一个经典小游戏:猜大小. 在这个游戏中,将用到前面我介绍过的所有内容:变量的使用.参数传递.函数设计.条件控制和循环等,做个整体的总结和复习. 游戏规则: 初始本金是 ...

  8. 原生js实现一个连连看小游戏(一)

    前几天使用原生的js写了一个连连看小游戏,地址:连连看(js),基本功能都实现了,运行截图为: 根据游戏规则获取开发思路 创建棋盘格 生成随机不重复数字 映射到棋盘格 鼠标点击事件 寻路,无通路,则到 ...

  9. 《看聊天记录都学不会Python到游戏实战?太菜了吧》(8)我们开始做一个数字小游戏吧

    本系列文章将会以通俗易懂的对话方式进行教学,对话中将涵盖了新手在学习中的一般问题.此系列将会持续更新,包括别的语言以及实战都将使用对话的方式进行教学,基础编程语言教学适用于零基础小白,之后实战课程也将 ...

最新文章

  1. ref和out 传递参数(C#)
  2. php 运行外部程序_php 中运行外部程序的一个潜在风险
  3. 贝塞尔曲线 花束直播点赞效果
  4. SVD原理及其应用导论
  5. make zImage和make uImage的区别和mkimage工具的使用
  6. cp和scp复制命令
  7. R语言中怎么将一个字符串向量合成一个大字符串
  8. CS224n自然语言处理(二)——语言模型、机器翻译和CNN
  9. 汉字乱码的终极解决方案
  10. ffmpeg 音乐循环_背景音乐自动循环播放
  11. 吃鸡游戏计算机配置,运行端游吃鸡要什么配置
  12. linux udp转发脚本,使用Socat转发TCP和UDP流量搭建跳板教程及一键脚本
  13. adjoint-io bulletpoofs 性能测试结果
  14. vue起服务时或npm install时遇到code EPERM errno -4048这样的报错,还有就是文字数量超出盒子可以设置多行省略或单行省略!!!
  15. Launching unittests with arguments python -m unittest
  16. 推荐基于4G模块打造的超低功耗4G摄像头通讯板
  17. PhotoShop批量生成App大小不同的Icon
  18. 知网html阅读需要花钱么,自己花钱怎么在知网上查重
  19. 产品管理NeoceanI网络存储产品开局指导书
  20. 快速上手 Flutter 空安全

热门文章

  1. 王祖贤素颜现身疑整形 明星整容前后对比照惨不忍睹
  2. 网上配镜前计算镜片边缘厚度的小程序
  3. 出现未知错误,错误代码:0x80070057
  4. 推荐系统中不得不学的对比学习(Contrastive Learning)方法
  5. 深度学习基础笔记——激活函数
  6. Marathon主要功能介绍(一)
  7. 量化新手初识H-M模型
  8. 写文章时,你是不是也有这4个困惑?
  9. Xcode8.2 真机测试 ,添加iOS10.3的idk到Xcode8.2中
  10. 微信小程序+OLAMI自然语言API接口制作智能查询工具--快递、聊天、日历等