jQuery贪吃蛇--jQuery学习
我用JQuery有一段时间了,越来越体会到其强大之处,于是自己尝试写了一个贪吃蛇小游戏,拿来与网友分享一下。
1. 了解JQuery.Timers
除用到了jQuery1.5.1之外,我还用到了jQuery.timers-1.2,作为定时器。它比Js的setInterval函数提供了更友好的接口。
JQuery Timers提供了三个函数:
1. everyTime(时间间隔, [定时器名称], 函式名称, [次数限制], [等待函式程序完成])
2. oneTime(时间间隔, [定时器名称], 呼叫的函式)
3. stopTime ([定时器名称], [函式名称])
示例:
$('body').everyTime(300, 'MainTimer', function () {
//do something every 300ms.
}
把定时器放到body上,确保定时器不会随被移除。
这样就能定时的更新贪吃蛇的位置,并且做一些逻辑判断。
2. 键盘响应
jquery提供了一系列的键盘事件函数:
1、keydown()
keydown事件会在键盘按下时触发.
2、keyup()
keyup事件会在按键释放时触发,也就是你按下键盘起来后的事件
3、keypress()
keypress事件会在敲击按键时触发,我们可以理解为按下并抬起同一个按键
可以通过回调函数的参数event.keyCode来获取
$(document).keydown(function(event){
if(event.keyCode == 37){//左方向键
//do somethings;
}else if (event.keyCode == 39){//右方向键
//do somethings;
}
});
所有的键盘代码表,可参考这篇博文
3. 创建、移动蛇身
蛇身是一系列的img标记,使用一个小的方形图片,为了能固定位置,需要将样式设置为:
.game{
position: fixed;
/* 为了兼容IE7 */
_position: absolute;
}
一个蛇身节点就是:
<img id="node1" class="game" src="Images/node.ico" />
在定时器回调中,当要更新蛇身位置时,从后往前遍历节点,逐一设置为上一个节点的位置,即实现了向前移动:
var i;
for (i = snakeLength - 1; i > 0; i--) {
$("#node" + i).css("left", $("#node" + (i - 1)).css("left"));
$("#node" + i).css("top", $("#node" + (i - 1)).css("top"));
}
其他的大家应该就明白了,主要实现食物、越界判断、撞自己判断、吃食物判断、变长、变快、记分等。
上代码:
<html>
<head>
<title>Snaker</title>
<link rel="stylesheet" href="style/style.css" type="text/css" />
<script type="text/javascript" src="js/jquery-1.5.1.min.js"></script>
<script type="text/javascript" src="js/jquery.timers-1.2.js"></script>
<script type="text/javascript">
var x = 0;
var y = 0;
var step = 20;
var dir = "right";
var initNodeCount = 4;
var snakeLength;
//生成新节点
function getNewNode(id) {
return $('<img id="' + id + '" class="game" src="Images/node.ico" />');
};
//判断是否位置相同,即碰撞测试
function isSamePosition(id1, id2) {
//alert(id1 + "_" + id2);
return ($('#' + id1).css("left") == $('#' + id2).css("left") && $("#" + id1).css("top") == $('#' + id2).css("top"));
};
//初始化节点
function initPositions() {
var i;
for (i = initNodeCount - 1; i >= 0; i--) {
getNewNode('node' + i).appendTo("body");
$("#node" + i).css("left", 100 - step * i);
$("#node" + i).css("top", 0);
}
snakeLength = initNodeCount;
};
//更新节点位置
function updatePositions() {
var i;
for (i = snakeLength - 1; i > 0; i--) {
$("#node" + i).css("left", $("#node" + (i - 1)).css("left"));
$("#node" + i).css("top", $("#node" + (i - 1)).css("top"));
}
$("#node0").css("top", y);
$("#node0").css("left", x);
if (x < 0 || x > window.innerWidth || y < 0 || y > window.innerHeight) {
alert("你一头撞到屏幕边缘上了!有木有!!!");
location.reload();
}
for (i = snakeLength - 1; i > 0; i--) {
if (isSamePosition("node" + i, "node0")) {
alert("你一口咬到自己屁屁上了!有木有!!!");
location.reload();
}
}
};
//吃掉食物
function eatFood() {
if (isSamePosition("node0", "food")) {
getNewNode('node' + snakeLength).appendTo('body');
$(('#node' + snakeLength)).css("left", -100);
snakeLength = snakeLength + 1;
createFood(false);
};
};
//创建新食物
function createFood(isNew) {
var fx = Math.random();
fx = Math.round(fx * 20) * 20;
var fy = Math.random();
fy = Math.round(fy * 20) * 20;
if (isNew) {
$('<img id="food" class="game" src="Images/food.ico" />').appendTo('body');
}
$('#food').css("left", fx);
$('#food').css("top", fy);
};
//启动定时器
function startTimer() {
$('body').everyTime(300, 'MainTimer', function () {
//alert(dir);
if (dir == "right") {
x = x + step;
} else if (dir == "left") {
x = x - step;
} else if (dir == "down") {
y = y + step;
} else if (dir == "up") {
y = y - step;
}
updatePositions();
eatFood();
});
};
$(function () {
initPositions();
createFood(true);
//暂停、继续
$('#startStop').toggle(
function () {
$('body').stopTime('MainTimer');
},
function () {
startTimer();
}
);
//定时器
startTimer();
//键盘响应
$(document).keydown(function (event) {
event = event || window.event;
if (event.keyCode == 38 && dir != "down") {
dir = "up";
} else if (event.keyCode == 37 && dir != "right") {
dir = "left";
} else if (event.keyCode == 39 && dir != "left") {
dir = "right";
} else if (event.keyCode == 40 && dir != "up") {
dir = "down";
};
});
}); </script>
</head>
<body>
<button type="button" id="startStop">
开始/停止</button>
</body>
</html>
初学jQuery,经验尚浅,有很多做的不好的地方,希望大家批评指正。
jQuery贪吃蛇--jQuery学习的更多相关文章
- WebSocket贪吃蛇例子学习
在Tomcat7.0.64下的examples文件夹内,有多人贪吃蛇的例子. Multiplayer snake 这是一个多人在线小游戏,客户端通过操作上下左右键指挥自己的蛇,如果碰到别的蛇就死掉.还 ...
- QT下的贪吃蛇
QT写的贪吃蛇,学习于https://www.devbean.net/2012/12/qt-study-road-2-snake-1/ 建议就学习一下开发思想,开发游戏还是用专门的编译器. 多加了墙, ...
- Jquery练手之-贪吃蛇
记得以前刚出来工作的时候,什么都不懂.老板让用Jquery写一个功能,我不会写,然后跟老板说,我就是个.net程序员,为什么要写Jquery...后面我们老大给我写了!现在我才知道net程序员要会多少 ...
- 小菜学习Winform(一)贪吃蛇2
前言 上一篇<小菜学习Winform(一)贪吃蛇>中实现了简单版的贪吃蛇,在文章末也提到需要优化的地方,比如使用oo.得分模式.速度加快模式和减少界面重绘.因为是优化篇,实现方式上一篇有, ...
- 小菜学习Winform(一)贪吃蛇
前言 说到贪吃蛇,大家可能小时候都玩过,小菜最近在整理Winfrom的学习系列,那我觉得有兴趣才会有学习,就从这个小游戏讲起吧. 实现 其实我刚开始学习编程的时候,感觉写个贪吃蛇的程序会很难,因为涉及 ...
- 从零开始学习jQuery (四) 使用jQuery操作元素的属性与样式
本系列文章导航 从零开始学习jQuery (四) 使用jQuery操作元素的属性与样式 一.摘要 本篇文章讲解如何使用jQuery获取和操作元素的属性和CSS样式. 其中DOM属性和元素属性的区分值得 ...
- 从零开始学习jQuery (三) 管理jQuery包装集
本系列文章导航 从零开始学习jQuery (三) 管理jQuery包装集 一.摘要 在使用jQuery选择器获取到jQuery包装集后, 我们需要对其进行操作. 本章首先讲解如何动态的创建元素, 接着 ...
- 以小时候玩的贪吃蛇为例,对于Java图像界面的学习感悟
简介 正文 01.JFrame是啥? 02.JPanel 03. KeyListener 04.Runnable 05.游戏Running 06.游戏初始类编写 07.main 简介: 一直以来用代码 ...
- jQuery学习-什么是jquery? Js与jquery之间的关系 Jquery选择器
1. 什么是jQuery以及学习的意义等 jQuery是一个js库 JS库是什么? 把常用的方法,进行封装,封装到一个单独的js文件当中,要用的时候直接调用. 学习jQuery主要学什么? 学习jQ ...
随机推荐
- MyBatis SQL动态装配
MyBatis的方便在于可以配置动态SQL,通过过滤器进行动态装配.在刚开始使用中,遇到不少问题,其中update语句也需要动态装配,核心在于DAO层要与.xml文件中的语句和变量名要匹配.例如: D ...
- 分离式模型separation model
1.关键字export 在头文件中定义模板,并且在模板的定义以及声明前添加关键字export. exported 模板可以直接使用,不需要看到该模板定义.模板的使用和定义可以分割于两个不同的编译单元. ...
- Object-C中代码如何分离接口和实现
使用C#习惯了代码的布局为:public (interface,class with static memebers),internal (class with implementation). 比如 ...
- 基于VC的声音文件操作(五)
(六)读取波形文件的实例 1.打开文件后,可通过HMMO句柄获得文件中的波形部份:MMCKINFO mmckinfo;mmckinfo.fccType = mmioFOURCC('W','A','V' ...
- WebBench源码分析与心得
源码:https://github.com/EZLippi/WebBench 关键全局变量: speed 成功次数 failed 失败次数 bytes 接收字节数 benchtime 执行时长(秒 ...
- oracle创建视图
create or replace view view_fwaqjcjl as select T_FWAQJCJL.FWAQJCJL_ID,T_FWAQJCJL.ZCBM,T_FWAQJCJL.FWB ...
- Dojo Data Store——统一数据访问接口
原文地址:http://www.infoq.com/cn/articles/wq-dojo-data-store 无论在传统的桌面应用还是在主流的互联网应用中,数据始终占据着软件应用中的核心地位.当下 ...
- ie7,8常见bug,共计257个bug汇总?如何解决ie的历史bug
ie7.8常见bug,共计257个bug汇总 针对web开发者来说,浏览器的bug,特备是ie的bug是很多人的噩梦,因为ie的更新换代没有ff,chrome,safari,opera那么快,而且ie ...
- ASP.NET 5系列教程 (一):领读新特性
近期微软发布了ASP.NET 5.0,本次发布的新特性需求源于大量用户的反馈和需求,例如灵活的跨平台运行时和自主部署能力使ASP.NET应用不再受限于IIS.Cloud-ready环境配置降低了云端部 ...
- 谈谈javascript语法里一些难点问题(二)
3) 作用域链相关的问题 作用域链是javascript语言里非常红的概念,很多学习和使用javascript语言的程序员都知道作用域链是理解javascript里很重要的一些概念的关键,这些概 ...