- 浏览: 69837 次
- 性别:
- 来自: 绍兴
最新评论
最近在看javascript权威指南,真是写的好啊,在没看html5之前先写个小游戏练练手,看完全部以后策划一个html5游戏,这个游戏断断续续写了大概一周时间,采用面向对象的方式开发的,完成以后还是发现有很多之前设计不足的情况,在下个游戏中一定要改进,有兴趣的朋友给提点意见
1.0js 贪食蛇初稿,上下左右控制方向 空格暂定 回去继续搞..
1.1 面向对象开发的魅力,马上转双蛇抢食,后续开发拦杀
1.2 拦杀已开发完成
本地IE8 火狐17.0 谷歌23.0已测试通过
1.0js 贪食蛇初稿,上下左右控制方向 空格暂定 回去继续搞..
1.1 面向对象开发的魅力,马上转双蛇抢食,后续开发拦杀
1.2 拦杀已开发完成
本地IE8 火狐17.0 谷歌23.0已测试通过
var SnakeGame = function(options) { //游戏配置项 this.level = 5;//第几关 与速度相关 this.blockWidth = 13;//身体食物面积(推荐10-20,耐玩性高) this.initBodyNum = 5;//初始身体长度 if (options) {//加载控制器 食物 和身体颜色 this.controler = options.controler; this._fm = options.fm; this.color = options.color; } }; SnakeGame.prototype = { start : function() {//开始游戏 //随机分配一个初始位置 this.initBodyPos = this.getRnadPos(this.refsnakes); //创建身体管理器 this.setBodyManager(new SnakeGame.BodyManager({ speed : 500 / this.level, blockWidth : this.blockWidth, initBodyNum : this.initBodyNum, initBodyPos : this.initBodyPos })); //初始化身体 this._bm.initBody(this._fm); //绑定鼠标事件 this.keyBind(); }, getRnadPos : function(num){ var pos = parseInt(Math.random()*(getWindowHeight()/this.blockWidth))*this.blockWidth; if(num&&num[0]["initBodyPos"]==pos) return this.getRnadPos(); return pos; }, setBodyManager : function(manager) { this._bm = manager; this._bm._parent = this; }, setFoodManager : function(manager) { this._fm = manager; }, keyBind : function() { var me = this; var _keyback = document.onkeydown; document.onkeydown = function(e) { if (_keyback) { _keyback(e); } var event = e || window.event; switch (event.keyCode) { case me.controler["left"]: me._bm.moveDir = 4; break; case me.controler["top"]: me._bm.moveDir = 1; break; case me.controler["buttom"]: me._bm.moveDir = 3; break; case me.controler["right"]: me._bm.moveDir = 2; break; case 32: me._bm.spendMove(); break; } }; }, setRefSnakeBody : function(snake){//管理所有身体对象 //被注掉的部分可以减少调用时的代码 但是不利于扩展分辨敌我 /* if(!this.refsnakes){debugger; this.refsnakes = [snake]; snake.setRefSnakeBody(this); }else{ var flag = true; for(var i = 0;i<this.refsnakes.length;i++){ if(snake===this.refsnakes[i]){ flag = false; } } if(flag){ this.refsnakes.push(snake); for(var i = 0;i<this.refsnakes.length;i++){ this.refsnakes[i].setRefSnakeBody(snake); } } } */ this.refsnakes = snake; } }; //身体管理器 SnakeGame.BodyManager = function(options) { this.bodyArr = [];//存放bady的数组 this.moveDir = 2;//下一步方向 1上 2右 3下 4左 this.nowDir = 0; //正在移动的方向 this.gameOptions = options; };SnakeGame.BodyManager.prototype = { initBody : function(manager) {//初始化身体 this.setFoodManager(manager); for ( var i = 0; i < this.gameOptions["initBodyNum"]; i++) { var style = this._parent.color||"red"; if (i == 0) { style = "black"; } this.createBody({ position : "absolute", width : this.gameOptions["blockWidth"], height : this.gameOptions["blockWidth"], top : this._parent.initBodyPos, backgroundColor : style, border : '1px', left : 0//this.gameOptions["initBodyPos"] //- (i * this.gameOptions["blockWidth"]) }); } this.startMove(); }, createBody : function(options) {//创建一块身体 var _body = document.createElement("div"); _body.style.position = "absolute"; _body.style.width = options["width"] + "px"; _body.style.height = options["height"] + "px"; _body.style.top = options["top"] + "px"; _body.style.left = options["left"] + "px"; _body.style.background = options["backgroundColor"]; _body.style.display = options["display"] || "block"; _body.style.border = "1px solid"; this.bodyArr.push(_body); document.body.appendChild(_body); return _body; }, moveBody : function(num) {//移动身体 if (this.nowDir != 0 && Math.abs(this.moveDir - this.nowDir) % 2 == 0) {//控制限制,例:在方向为左时 按左或右无效 this.moveDir = this.nowDir; } var lastPosition = {}; for ( var i = 0; i < this.bodyArr.length; i++) { this.bodyArr[i].style.display = "block";//显示身体 var _l = getElementPos(this.bodyArr[i]).x;//获取身体坐标 var _t = getElementPos(this.bodyArr[i]).y; var _cssparam = { left : _l, top : _t }; var _dw = parseInt(this.bodyArr[i].offsetWidth, 10);//获取块的宽度,因为是正方形所以高度也一样 if (i == 0) {//是头的情况下 var _dir, _len;//方向 和 移动的距离 if (this.moveDir == 1 || this.moveDir == 3) {//1或3是垂直移动 _dir = "top"; if (this.moveDir == 1) { num = 0 - num; } _len = getElementPos(this.bodyArr[i]).y + num; if (_len<0 || _len>getWindowHeight()) { this.stopMove(); return; } } else {//2或4是水平移动 _dir = "left"; if (this.moveDir == 4) { num = 0 - num; } _len = getElementPos(this.bodyArr[i]).x + num; if (_len<0 || _len+_dw>getWindowWidth()) { this.stopMove(); return; } } _cssparam[_dir] = _len; for ( var j = 1; j < this.bodyArr.length; j++) {//如果头部撞到了自己的身体 var _l2 = getElementPos(this.bodyArr[j]).x; var _t2 = getElementPos(this.bodyArr[j]).y; if (_l2 == _cssparam["left"] && _t2 == _cssparam["top"]) { this.stopMove(); return; } } if(this._parent.refsnakes&&this._parent.refsnakes.length>0){//判断是否撞到对手的身体上 for(var h = 0;h<this._parent.refsnakes.length;h++){ var refbodys = this._parent.refsnakes[h]._bm["bodyArr"]; for(var f = 0;f<refbodys.length;f++){ if(refbodys[f].offsetLeft == _cssparam["left"] && refbodys[f].offsetTop == _cssparam["top"]){ if(f==0){//如果撞的对手的头,那么同归 this._parent.refsnakes[h]._bm.stopMove(true); this.stopMove(); alert("打和"); return; } this.stopMove(); return; } } } } } else {//不是头部的话 只要照着上一个块的位置移动就行了 _cssparam["left"] = lastPosition.x; _cssparam["top"] = lastPosition.y; } this.bodyArr[i].style.left = _cssparam["left"] + "px"; this.bodyArr[i].style.top = _cssparam["top"] + "px"; //记录上一个块 lastPosition.x = _l; lastPosition.y = _t; } //头部位置 var _hpl = this.bodyArr[0].style.left; var _hpt = this.bodyArr[0].style.top; //如果头部吃到食物 if (this._fm && _hpl == this._fm.pos["x"] + "px" && _hpt == this._fm.pos["y"] + "px") { this.createBody({//创建一个隐藏的身体,身体会马上根据上一个块的坐标把他带上去 position : "absolute", width : this.gameOptions["blockWidth"], height : this.gameOptions["blockWidth"], top : -10, backgroundColor : this._parent.color, border : '1px', left : -10, display : "none" }); this._fm.randomPosi(); //this.changeSpeed(1); } this.nowDir = this.moveDir; }, startMove : function() {//开始移动 var me = this; function intervalCall() {//将移动方法闭包起来 me.moveBody(me.gameOptions["blockWidth"]); } this.moveTimer = setInterval(intervalCall,//根据速度开始执行 this.gameOptions["speed"]); }, changeSpeed : function(num) {//加速的方法 this.gameOptions["speed"] = this.gameOptions["speed"] - num; this.spendMove(); this.startMove(); }, spendMove : function() {//暂定 var me = this; if (!this.moveTimer) { me.startMove(); } else { clearInterval(this.moveTimer); this.moveTimer = null; } }, setFoodManager : function(manager) {//提供食物管理器 this._fm = manager; }, stopMove : function(flag) {//发生碰撞即将停止 clearInterval(this.moveTimer); for ( var j = 0; j < this.bodyArr.length; j++) {//当前身体清空掉 this.bodyArr[j].parentNode.removeChild(this.bodyArr[j]); } if(this._parent.refsnakes){ if(this._parent.refsnakes.length==1){//如果一只有个对手,那么这个对手赢了 if(!flag){ alert(this._parent.refsnakes[0].color+" 赢"); } var reload = function(){ window.location.reload(); } setTimeout(reload,3000);//3秒后重新游戏 } for(var i = 0;i<this._parent.refsnakes.length;i++){//把自己从别人的对手列表中清除 var subref = this._parent.refsnakes[i].refsnakes; for(var j = 0;j<subref.length;j++){ if(subref[j]==this._parent){ subref.splice(j,1); } } } } } }; //食物管理器 SnakeGame.FoodManager = function(options) { this.gameOptions = options; var me = this; this.foodDom; this.getRandomPos = function() { var _rw = parseInt(Math.random() * (getWindowWidth() / me.gameOptions["blockWidth"] - 1)); var _rh = parseInt(Math.random() * (getWindowHeight() / me.gameOptions["blockWidth"] - 1)); return { x : _rw * me.gameOptions["blockWidth"], y : _rh * me.gameOptions["blockWidth"] } } this.pos = this.getRandomPos(); this.initFood({ backgroundColor : "blue", left : this.pos["x"], top : this.pos["y"], width : this.gameOptions["blockWidth"], height : this.gameOptions["blockWidth"] }); } SnakeGame.FoodManager.prototype = { initFood : function(options) { this.foodDom = document.createElement("div"); this.foodDom.style.position = "absolute"; this.foodDom.style.width = options["width"] + "px"; this.foodDom.style.height = options["height"] + "px"; this.foodDom.style.top = options["top"] + "px"; this.foodDom.style.left = options["left"] + "px"; this.foodDom.style.background = options["backgroundColor"]; document.body.appendChild(this.foodDom); }, randomPosi : function() { this.pos = this.getRandomPos(); this.foodDom.style.top = this.pos["y"] + "px"; this.foodDom.style.left = this.pos["x"] + "px"; } } var param = new SnakeGame(); //构造食物管理器 var fm = new SnakeGame.FoodManager({ blockWidth : param.blockWidth }); //两条蛇 有不同的控制方式 相同的食物管理器 var snake1 = new SnakeGame({ controler : { buttom : 83, left : 65, top : 87, right : 68 }, fm : fm, color : 'red' }); var snake2 = new SnakeGame({ controler : { buttom : 40, left : 37, top : 38, right : 39 }, fm : fm, color : 'green' }); /* var snake3 = new SnakeGame({ controler : { buttom : 40, left : 37, top : 38, right : 39 }, fm : fm, color : 'yellow' }); */ snake1.setRefSnakeBody([snake2/* ,snake3 */]);//配置对手列表,由此来分辨是敌是友 snake2.setRefSnakeBody([snake1/* ,snake3 */]); //snake3.setRefSnakeBody([snake2,snake1]); snake1.start(); snake2.start(); //snake3.start();
发表评论
-
canvas绘制当前时间时钟
2013-03-27 17:27 1483<html> <head> ... -
对于IE6 不支持XMLHttpRequest的改进方式
2012-12-13 15:44 0if(window.XMLHttpRequest === ... -
111
2012-12-06 17:46 0http://www.cnblogs.com/Godbless ... -
获取当前浏览器地址参数列表
2012-11-22 15:52 918function urlArgs(){ var a ... -
JavaScript继承小例子
2012-11-20 19:27 778权威指南第九章真心很给力,精彩啊,抽出了这个小例子 //对 ... -
闭包实现单例气泡提示
2012-11-15 12:37 851var kcbplugs = kcbplugs || {} ... -
JavaScript数组方法罗列
2012-11-05 11:37 879join 连接 reverse 反转 sort 排序 可传参自 ...
相关推荐
"贪食蛇-王思聪吃热狗" 是一个基于 HTML、CSS 和 JavaScript 的经典贪吃蛇游戏改编项目。在这个有趣的游戏中,玩家操控王思聪的头像来代替传统的贪吃蛇角色,而食物则被替换成美味的热狗。玩家需要通过键盘控制...
《贪食蛇游戏的VC6.0实现解析》 贪食蛇是一款经典的计算机游戏,它在各种平台上都有着广泛的应用,包括早期的手机和现代的PC。在这个“贪食蛇-VC6.0实现”的项目中,我们将深入探讨如何利用Visual C++ 6.0这一古老...
贪食蛇项目-基于JAVA的J2ME的手机游戏开发(LW+源代码).贪食蛇项目-基于JAVA的J2ME的手机游戏开发(LW+源代码).贪食蛇项目-基于JAVA的J2ME的手机游戏开发(LW+源代码).贪食蛇项目-基于JAVA的J2ME的手机游戏开发(LW+源...
在这个“Labview贪食蛇-1.zip”压缩包中,包含了一个使用Labview编写的经典游戏——贪食蛇。这个游戏是许多初学者学习编程时的入门项目,因为它涉及到基础的逻辑控制、数组操作以及子VI(Virtual Instrument,虚拟...
贪食蛇是一款经典的游戏,它的实现方式多样,其中一种是使用链表数据结构。链表是一种线性数据结构,由一系列节点(也称为元素或记录)组成,每个节点包含数据和指向下一个节点的指针。在这个场景下,链表被用来存储...
一小段javascript编写的贪食蛇代码
标题中的"F767"指的是STM32F767系列微控制器,这是意法半导体(STMicroelectronics)推出的一款高性能、低功耗的32位微处理器,广泛应用于嵌入式系统设计。STM32F767拥有强大的ARM Cortex-M7内核,能够处理复杂的...
《cocos2d-x贪食蛇游戏开发详解》 cocos2d-x是一款跨平台的2D游戏开发框架,由C++编写,支持多种操作系统,包括iOS、Android、Windows等。它提供了丰富的图形渲染功能、物理引擎接口以及事件处理机制,使得游戏...
【标题】"JS版贪食蛇"所涉及的知识点主要集中在JavaScript编程语言上,这是一个经典的使用JavaScript实现的网页游戏。JavaScript是一种广泛应用于Web开发的脚本语言,它主要用于客户端的网页交互,使得网页具有动态...
在贪食蛇游戏中,JavaScript的主要工作包括: 1. **初始化游戏状态**:设置蛇的位置、食物的位置、游戏速度等。 2. **处理用户输入**:监听键盘事件,根据用户输入改变蛇的方向。 3. **游戏逻辑**:计算蛇的移动,...
网页简单实现贪食蛇 纯html+js实现的贪食蛇
《贪食蛇》是一款经典的游戏,它以其简单易懂的操作和无尽的挑战性深受玩家喜爱。本压缩包文件“游戏制作《贪食蛇》--eNet游戏资讯1_files”包含的是关于如何使用Flash制作这款经典游戏的教程资料。下面我们将深入...
java贪食蛇游戏java贪食蛇游戏java贪食蛇游戏java贪食蛇游戏java贪食蛇游戏 java贪食蛇游戏java贪食蛇游戏java贪食蛇游戏java贪食蛇游戏java贪食蛇游戏 java贪食蛇游戏java贪食蛇游戏java贪食蛇游戏java贪食蛇游戏...
贪食蛇序C语言-----源代码,适合初级C语言学习的朋友参考练习,对编写小程序有一定帮助,希望能对C语言爱好者有所帮助。
基于Scratch的贪食蛇游戏开发教程-Scratch教程-贪食蛇游戏 内容概要:详细介绍了如何使用Scratch教育平台构建简单的贪食蛇游戏,并逐步阐述了角色设置(如蛇头、蛇身以及苹果)、响应方向按键的操作指引、自动增大...
《贪食蛇游戏的JavaScript实现详解》 贪食蛇,这款经典的像素级游戏,自诞生以来就深受广大玩家喜爱。本文将深入解析一个基于JavaScript实现的贪食蛇游戏,通过分析压缩包中的四个文件——my.css、说明.htm、my....
贪食蛇是一款经典的游戏,它的实现涉及到了编程基础、图形用户界面(GUI)设计以及算法应用等多个方面的知识。本文将围绕C#语言实现贪食蛇的最短源代码进行详细解读,帮助读者深入理解游戏机制及编程技巧。 首先,...
【贪食蛇游戏简介】 贪食蛇是一款经典的电子游戏,起源于1976年的“Blockade”,后来在诺基亚手机上广为人知。在这个游戏中,玩家控制一条不断增长的蛇,目标是吃到食物,每次吃到食物后,蛇的长度会增加。如果蛇头...
【贪食蛇C++工程详解】 贪食蛇是一款经典的电子游戏,它的基本玩法是控制一个在有限区域内移动的蛇,通过吃食物使蛇身增长,同时避免蛇头碰到自己的身体或边界。本项目是一个用C++语言实现的贪食蛇游戏,具有图形...