用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 function createCar(speed,cxt,dom) {
 2     var o = new Object();
 3     o.speed = speed;
 4     o.cxt = cxt;
 5     o.cell = 100;
 6     o.curdir = {‘x‘:100,‘y‘:400};
 7     o.hinder = [[],[],[]];
 8     o.scroll = 0;
 9     o.scored = 0;
10     o.init = function () {
11         o.cxt.fillStyle = ‘red‘;
12         o.cxt.fillRect(o.curdir.x, o.curdir.y, o.cell, o.cell);
13         document.onkeydown = function (e) {
14             if(e.keyCode === 37 && o.curdir.x > 0){
15                 o.moveCar(‘left‘);
16             }
17             else if(e.keyCode === 39 && o.curdir.x < 200){
18                 o.moveCar(‘right‘);
19             }
20             else if(e.keyCode === 40)
21                 o.speed = speed / 3;
22         };
23         document.onkeyup = function () {
24             o.speed = speed;
25         };
26         o.setHinder();
27         o.downHinder();
28     };
29     o.setHinder = function () {
30         var rand1 = Math.ceil(Math.random() * 1000) % 2,
31             rand2 = Math.ceil(Math.random() * 1000) % 2,
32             rand3 = Math.ceil(Math.random() * 1000) % 2;
33         o.hinder[0].push({‘x‘:0,‘y‘:0,‘hinder‘:rand1});
34         o.hinder[1].push({‘x‘:100,‘y‘:0,‘hinder‘:rand2});
35         o.hinder[2].push({‘x‘:200,‘y‘:0,‘hinder‘:rand1 + rand2 == 2?0:rand3});
36         for(var i = 0; i < o.hinder.length; i ++){
37             var last =o.hinder[i][o.hinder[i].length - 1];
38             if(last.hinder === 1) {
39                 o.cxt.fillStyle = ‘black‘;
40                 o.cxt.fillRect(last.x,last.y, o.cell, o.cell);
41             }
42         }
43     };
44     o.downHinder = function () {
45         setTimeout(function () {
46             var i = 0,
47                 j = 0,
48                 cur = null,
49                 old = null;
50             for(i = 0; i < o.hinder[0].length; i ++) {
51                 for(j = 0; j < 3; j ++) {
52                     cur = o.hinder[j][i];
53                     if (cur.hinder === 1) {
54                         old = o.hinder[j][i];
55                         o.cxt.clearRect(old.x,old.y, o.cell, o.cell);
56                         o.hinder[j][i].y = o.hinder[j][i].y + 5;
57                         cur = o.hinder[j][i];
58                         o.cxt.fillStyle = ‘black‘;
59                         o.cxt.fillRect(cur.x,cur.y, o.cell, o.cell);
60                     }
61                     else
62                         o.hinder[j][i].y = o.hinder[j][i].y + 5;
63                 }
64             }
65             for(i = 0; i < o.hinder.length; i ++) {
66                 if (o.hinder[i][0].y >= 500) {
67                     o.scored  = o.scored  +  Math.ceil(100/o.speed);
68                     dom.innerHTML = ‘得分:‘ + o.scored;
69                     var over = o.hinder[i].shift();
70                     if(over.hinder === 1)
71                         o.cxt.clearRect(over.x,over.y, o.cell, o.cell);
72                 }
73             }
74             if(o.hinder[o.curdir.x/100][0].hinder === 1 && o.hinder[o.curdir.x/100][0].y + 100 >= o.curdir.y){
75                 alert(‘你挂了‘);
76                 return;
77             }
78             o.scroll = o.scroll + 5;
79             if(o.scroll % 300 == 0)
80                 o.setHinder();
81             o.downHinder();
82         }, o.speed);
83     };
84     o.moveCar = function (dir) {
85         o.cxt.fillStyle = ‘red‘;
86         o.cxt.clearRect(o.curdir.x, o.curdir.y, o.cell, o.cell);
87         o.curdir.x = (dir === ‘left‘?o.curdir.x - o.cell:o.curdir.x + o.cell);
88         o.cxt.fillRect(o.curdir.x,o.curdir.y, o.cell, o.cell);
89     };
90     return o;
91 }
92
93 var c = document.getElementById(‘mycar‘);
94 var scored = document.getElementById(‘scored‘);
95 var cxt = c.getContext(‘2d‘);
96 var car = createCar(30,cxt,scored);
97 car.init();

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

时间: 2025-01-15 22:25:29

用html5+js实现掌机游戏赛车demo的相关文章

认为手机成掌机最大阻碍 索尼服软为哪般

曾几何时,索尼旗下掌机PSP代表了众多年青一代的终极梦想.在那个只局限于通话.短信等极简功能的翻盖.直板手机都卖3000元+的时代,索尼PSP掌机凭借超大屏幕和超炫的游戏.听歌.看视频.电子书等丰富功能,成为次时代"神器".然而迈入智能手机时代,索尼掌机就开始一蹶不振,尤其是新推出的PSV销量堪忧. 甚至索尼电子娱乐全球总裁吉田修平近日表示由于智能手机移动游戏市场的兴起,掌机游戏设备的行业大环境已经不容乐观,而索尼下一代PlayStation Vita游戏机也不会在近期问世.虽然听起来

HTML5+JS 《五子飞》游戏实现(五)移动棋子

上一章 我们知道了怎么处理两个重要的吃棋动作,想要吃对方的棋子,首先得移动自己的棋子.现在里沃特跟大家分享分享,怎么移动棋子. 想要移动棋子,在页面上,首先要点击一下要移动的棋子,然后再点击一下目标位置,如果可以移动,则把棋子移动的目标位置,原来的位置就要清空. 上面这句话,我们要分两步来处理:1.判断目标是否可移动:2.可以移动则移动棋子. 1.判断目标是否可移动. 首先移动时只能按直线,其次目标位置与原始位置之间不能有其他棋子: // 是否可移动 this.canMove = functio

HTML5+JS 《五子飞》游戏实现(八)人机对战

要想实现人机对战,就必须让电脑自动下棋,而且要知道自动去查找对方的棋子,看看有没有可以挑一对的,有没有可以夹一个的,这样下起来才有意思. 当电脑用户下完棋后,电脑应立即搜索用户的棋子,然后如果没有被吃的,就再随机走一个棋子(要想让电脑成为下棋高手就不能随机下棋,要考虑下棋后会不会再被对方吃掉等等,这里只简单做随机下子了). 完整<五子飞>游戏人机对战:http://www.lyout.com/projects/Fiveflychess/FiveflyChess8.htm // 查找是否有可挑的

HTML5+JS 《五子飞》游戏实现(六)鼠标响应与多重选择

上一章我们提到了如果有多条线上的棋子可以被吃掉,那么游戏需要提示用户,让用户选择吃哪条线上的.另外因为是网页游戏,所以一定要实现鼠标单击棋子可以进行操作. 当鼠标移动棋子上面后,切换鼠标指针为手形,移开棋子后再切换回默认的状态: el.mousemove(function (e) { var o = el.offset(); var p = { x: e.clientX - o.left, y: e.clientY - o.top }; el.css("cursor", "d

HTML5+JS 《五子飞》游戏实现(四)夹一个和挑一对

在第一章我们已经说了怎么才能“夹一个”以及怎样才能挑一对,但那毕竟只是书面上的,对码农来讲,我们还是用代码讲解起来会更容易了解. 为了更容易对照分析,我们先把路线再次贴出来: // 可走的路线 this.lines = [ [ 0, 1, 2, 3, 4], [ 5, 6, 7, 8, 9], [10, 11, 12, 13, 14], [15, 16, 17, 18, 19], [20, 21, 22, 23, 24], [ 0, 5, 10, 15, 20], [ 1, 6, 11, 16,

HTML5+JS 《五子飞》游戏实现(七)游戏试玩

前面第一至第六章我们已经把<五子飞>游戏的基本工作都已经讲得差不多了,这一章主要是把所有的代码分享给大家,然后小伙伴们也可以玩一玩. 至于人机对战的我们放到后面讲进行分析. 试玩地址:http://www.lyout.com/projects/fiveflychess/FiveflyChess7.htm 现在我们来总结一下该小游戏的一些基本定义: // 定义游戏对象 function GameChess(){ // 初始配置 this.init = function ()//... // 画棋

再见,掌机:PSP陪伴我的青葱岁月

一觉醒来,在惯例浏览新闻时突然发现一条让我情绪瞬间波动的消息:PSP将在年末正式停止发售!刹那间睡意全无,脑中全部闪现的是自己为PSP着魔的青葱岁月.作为一名职业撰稿人,如果不为即将逝去的PSP写篇悼文,又怎么对得起它陪伴我的那些年? 吃糠咽菜,只为PSP 实事求是的说,作为一个在小城市农村长大的孩子,第一次见到PSP还是在2006年年底--当时PSP 1000已经发布了两年.但第一次见到它,就被深深地吸引住.那时候我还在上高二,是在过年的时候一个在市里居住的表哥带来的.他拿着PSP 1000向

WebGL实现HTML5的3D贪吃蛇游戏

js1k.com收集了小于1k的javascript小例子,里面有很多很炫很酷的游戏和特效,今年规则又增加了新花样,传统的classic类型基础上又增加了WebGL类型,以及允许增加到2K的++类型,多次想尝试提交个小游戏但总无法写出让自己满意还能控制在这么小的字节范围. 自己写不出来,站在巨人肩膀总是有机会吧,想起<基于HTML5的电信网管3D机房监控应用>这篇提到的threejs,babylonjs和Hightopo的几种基于WebGL的3D引擎,突然想挑战下自己实现个100行JS的3D小

使用HTML5开发Kinect体感游戏

一.简介 我们要做的是怎样一款游戏? 在前不久成都TGC2016展会上,我们开发了一款<火影忍者手游>的体感游戏,主要模拟手游章节<九尾袭来 >,用户化身四代,与九尾进行对决,吸引了大量玩家参与. 表面上看,这款游戏与其它体感体验无异,实际上,它一直运行于浏览器Chrome下,也就是说,我们只需要掌握前端相应技术,就可以开发基于Kinect的网页体感游戏. 二.实现原理 实现思路是什么? 使用H5开发基于Kinect的体感游戏,其实工作原理很简单,由Kinect采集到玩家及环境数据