用html5+js实现掌机游戏赛车demo

最近无聊,用html5+js做了一个以前玩过的掌机赛车游戏,顺便学习一下画布的api以及巩固一下js基础。

游戏界面,没做什么美化。

游戏规则:游戏界面分为三列,黑色方块随机落下,红色方块可以在三列自由移动(用方向键,长按下方向键黑色方块加速下滑)。红色方块碰到黑色方块即为输。
得分:每正常通过一次黑色方块加12分,加速通过加30分。

下面直接上代码:

html:

 1 <!DOCTYPE html>
 2 <html>
 3 <head lang="en">
 4     <meta charset="UTF-8">
 5     <title></title>
 6 </head>
 7 <style>
 8     body{
 9         text-align: center;
10     }
11     #mycar{
12         border: 1px solid black;
13     }
14 </style>
15 <body>
16     <canvas id="mycar" width="300px" height="500px"></canvas>
17     <div id="scored">得分:0</div>
18     <script src="js/mycar.js"></script>
19 </body>
20 </html>

 js:

 

  1 /**
  2  * Created by zqc on 2014/12/3.
  3  */
  4 
  5 function createCar(speed,cxt,dom) {
  6     var o = new Object();
  7     o.speed = speed; // 落下速度
  8     o.cxt = cxt; // 画布
  9     o.cell = 100; // 赛车宽度
 10     o.curdir = {'x':100,'y':400}; // 红色赛车初始位置
 11     o.hinder = [[],[],[]]; // 障碍物位置
 12     o.scroll = 0; // 下滑距离
 13     o.scored = 0; // 分数
 14     o.init = function () {
 15         o.cxt.fillStyle = 'red';
 16         o.cxt.fillRect(o.curdir.x, o.curdir.y, o.cell, o.cell);
 17         document.onkeydown = function (e) { // 按键事件
 18             if(e.keyCode === 37 && o.curdir.x > 0){
 19                 o.moveCar('left');
 20             }
 21             else if(e.keyCode === 39 && o.curdir.x < 200){
 22                 o.moveCar('right');
 23             }
 24             else if(e.keyCode === 40) {// 长按加速
 25                 o.speed = speed / 3;
 26             }
 27         };
 28         document.onkeyup = function () {
 29             o.speed = speed;
 30         };
 31         o.setHinder();
 32         o.startCar();
 33     };
 34     o.setHinder = function () { // 生成障碍物
 35         var rand1 = Math.ceil(Math.random() * 1000) % 2,
 36             rand2 = Math.ceil(Math.random() * 1000) % 2,
 37             rand3 = Math.ceil(Math.random() * 1000) % 2;
 38         o.hinder[0].push({'x':0,'y':0,'hinder':rand1}); // hinder表示是否有障碍物
 39         o.hinder[1].push({'x':100,'y':0,'hinder':rand2});
 40         o.hinder[2].push({'x':200,'y':0,'hinder':rand1 + rand2 == 2?0:rand3});
 41         for(var i = 0; i < o.hinder.length; i ++){
 42             var last =o.hinder[i][o.hinder[i].length - 1];
 43             if(last.hinder === 1) { // 有障碍物
 44                 o.cxt.fillStyle = 'black';
 45                 o.cxt.fillRect(last.x,last.y, o.cell, o.cell);
 46             }
 47         }
 48     };
 49     o.downHinder = function () { // 控制障碍物下降
 50         var i = 0,
 51             j = 0,
 52             cur = null,
 53             old = null;
 54         for(; i < o.hinder[0].length; i ++) {
 55             for(j = 0; j < 3; j ++) {
 56                 cur = o.hinder[j][i];
 57                 if (cur.hinder === 1) {
 58                     old = o.hinder[j][i];
 59                     o.cxt.clearRect(old.x,old.y, o.cell, o.cell); // 清除上一帧
 60                     o.hinder[j][i].y = o.hinder[j][i].y + 5;
 61                     cur = o.hinder[j][i];
 62                     o.cxt.fillStyle = 'black';
 63                     o.cxt.fillRect(cur.x,cur.y, o.cell, o.cell);
 64                 }
 65                 else
 66                     o.hinder[j][i].y = o.hinder[j][i].y + 5;
 67             }
 68         }
 69     };
 70     o.moveCar = function (dir) {
 71         o.cxt.fillStyle = 'red';
 72         o.cxt.clearRect(o.curdir.x, o.curdir.y, o.cell, o.cell);
 73         o.curdir.x = (dir === 'left'?o.curdir.x - o.cell:o.curdir.x + o.cell);
 74         o.cxt.fillRect(o.curdir.x,o.curdir.y, o.cell, o.cell);
 75     };
 76     o.clearHander = function () {
 77         for(var i = 0; i < o.hinder.length; i ++) {
 78             if (o.hinder[i][0].y >= 500) { // 超过画布最低位置,清除障碍物
 79                 o.counterScorde(); // 计分
 80                 var over = o.hinder[i].shift();
 81                 if(over.hinder === 1)
 82                     o.cxt.clearRect(over.x,over.y, o.cell, o.cell);
 83             }
 84         }
 85     };
 86     o.counterScorde = function () {
 87         o.scored  = o.scored  +  Math.ceil(100/o.speed);
 88         dom.innerHTML = '得分:' + o.scored;
 89     };
 90     o.startCar = function () {
 91         setTimeout(function () {
 92             o.downHinder(); // 落下障碍物
 93             o.clearHander(); // 清除已通过的障碍物
 94             if(o.hinder[o.curdir.x/100][0].hinder === 1 && o.hinder[o.curdir.x/100][0].y + 100 >= o.curdir.y){
 95                 alert('你挂了');
 96                 return;
 97             }
 98             o.scroll = o.scroll + 5; // 单位下滑速度
 99             if(o.scroll % 300 === 0)
100                 o.setHinder(); // 设置障碍物
101             o.startCar();
102         }, o.speed);
103     };
104     return o;
105 }
106 
107 var c = document.getElementById('mycar');
108 var scored = document.getElementById('scored');
109 var cxt = c.getContext('2d');
110 var car = createCar(30,cxt,scored);
111 car.init();

 

 

 

详情见github: 掌机游戏赛车demo

 

算法写的有点不好,有大神路过望给一写指导。

 

转载于:https://www.cnblogs.com/zquancai/p/4081021.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值