javascript它【蛇系列】第一弹:简单的蛇实现

参考博客:http://blog.csdn.net/sunxing007/article/details/4187038

上面的博客是一个参考,竟第一次做。真让自己盲人摸象做不出来。

只是我在其上做了一些改进。界面等效果看起来更好一些。

下图是在Chrome上执行的效果,可是火狐IE会不兼容。onkeydown事件不能正确调用

这里用了一张图把贪吃蛇制作过程的思想画了出来,画的有点简陋:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAxMDgwMDUzMA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" >

以下就是把代码发上来。上边有具体的解释:

<html>
<head>
    <title>贪吃蛇 By Big_Adamapple</title>
<style>
    body{
    	margin-left:auto;
		margin-right:auto;
        font-size:9px;
		background:#333333;
    }
	table{margin:140px auto 10px auto; overflow:hidden; border-collapse:collapse; }
	td {width:20px; height:20px; border:1px solid #eee; background:#f4f4f4}
	input{width:80px; height:30px; margin-left:10px;}
	#operate{margin-left:650px; font-size:20px;}
	#speed,#core{height:30px; width:50px; text-align:center; color:red; font-size:20px;}
    #operate span{color:white;}
</style>
</head>
<script>
    function $(id){return document.getElementById(id);}

    //贪吃蛇类
    var Snake = {
        tbl: null,
        /**
        * body: 蛇身。数组放蛇的每一节,
        * 数据结构{x:x0, y:y0, color:color0},
        * x,y表示坐标,color表示颜色
        **/
        body: [],
        //当前移动的方向,取值0,1,2,3, 分别表示向上,右,下,左, 按键盘方向键能够改变它
        direction: 0,
        //定时器
        timer: null,
        //速度
        speed: 250,
        //是否已经暂停
        paused: true,
        //行数
        rowCount: 20,
        //列数
        colCount: 20,
		//分数
		core: 0,

        //初始化
        init: function(){
            this.tbl = $("main");
            var x = 0;
            var y = 0;
            this.direction = Math.floor(Math.random()*4); //产生随机移动方向

		   //产生table
            for(var row=0;row<this.rowCount;row++){
                var tr=this.tbl.insertRow(-1);
                for(var col=0;col<this.colCount;col++) {
                    var td=tr.insertCell(-1);
                }
            }
            //初始化产生食物
            for(var i=0; i<1; i++){
                x = Math.floor(Math.random()*this.colCount);
                y = Math.floor(Math.random()*this.rowCount);

                if(!this.isCellFilled(x,y)){
                    this.tbl.rows[y].cells[x].style.backgroundColor = '#009933';
                }
            }
            //产生蛇头
            while(true){
                x = Math.floor(Math.random()*this.colCount);
                y = Math.floor(Math.random()*this.rowCount);
                if(!this.isCellFilled(x,y)){
                    this.tbl.rows[y].cells[x].style.backgroundColor = "#3399CC";
                    this.body.push({x:x,y:y,color:'black'});
                    break;
                }
            }
            this.paused = true;  //设置開始
            //加入键盘事件
            document.onkeydown= function(e){
                if (!e)
					e = e || window.event;
                switch(e.which){
                	case 13: {
                			if(Snake.paused){
                					Snake.move();
                					Snake.paused = false;
                			}
                			else{
                				  //假设没有暂停,则停止移动
                					Snake.pause();
                					Snake.paused = true;
                			}
                			break;
                		}
                    case 37:{//left
                        //阻止蛇倒退走
                        if(Snake.direction==1){
                            break;
                        }
                        Snake.direction = 3;
                        break;
                    }
                    case 38:{//up
                    	  //快捷键在这里起作用
                    		if(event.ctrlKey){
                    			  Snake.speedUp(-20);
                    				break;
                    		}
                        if(Snake.direction==2){//阻止蛇倒退走
                            break;
                        }
                        Snake.direction = 0;
                        break;
                    }
                    case 39:{//right
                        if(Snake.direction==3){//阻止蛇倒退走
                            break;
                        }
                        Snake.direction = 1;
                        break;
                    }
                    case 40:{//down
                    		if(event.ctrlKey){
                    			  Snake.speedUp(20);
                    				break;
                    		}
                        if(Snake.direction==0){//阻止蛇倒退走
                            break;
                        }
                        Snake.direction = 2;
                        break;
                    }
                }
            }
        },
        //移动
        move: function(){
			$("btn").value="暂停";
            this.timer = setInterval(function(){
                Snake.erase();
                Snake.moveOneStep();
                Snake.paint();
				$("core").value = Snake.core;
				$("speed").value = Snake.speedClass();

            }, this.speed);
        },
        //移动一节身体
        moveOneStep: function(){

            if(this.checkNextStep()==-1){
                clearInterval(this.timer);
                alert("Game Over");
                return;
            }
            if(this.checkNextStep()==1){
                var _point = this.getNextPos();
                var _x = _point.x;
                var _y = _point.y;
                var _color = 'red';
				Snake.core += 10;
                this.body.unshift({x:_x,y:_y,color:_color});

                this.generateDood();   //由于吃了一个食物。所以再产生一个食物
                return;
            }
            var point = this.getNextPos();

            var color = '#3399CC';

            //蛇尾减一节。 蛇头加一节,呈现蛇前进的效果
            this.body.pop();
            this.body.unshift({x:point.x,y:point.y,color:color});

        },

        pause: function(){
				$("btn").value="開始";
        		clearInterval(Snake.timer);
        		this.paint();
        },
		//探寻下一步将走到什么地方
        getNextPos: function(){
            var x = this.body[0].x;
            var y = this.body[0].y;

            //向上
            if(this.direction==0){
                y--;
            }
            //向右
            else if(this.direction==1){
                x++;
            }
            //向下
            else if(this.direction==2){
                y++;
            }
            //向左
            else{
                x--;
            }
            //返回一个坐标
            return {x:x,y:y};
        },
        //检查将要移动到的下一步是什么
        checkNextStep: function(){
            var point = this.getNextPos();
            var x = point.x;
            var y = point.y;
            if(x<0 || x>=this.colCount || y<0 || y>=this.rowCount){
                return -1;//触边界,游戏结束
            }
            for(var i=0; i<this.body.length; i++){
                if(this.body[i].x==x && this.body[i].y==y){
                    return -1;//碰到自己的身体,游戏结束
                }
            }
            if(this.isCellFilled(x,y)){
                return 1;//有东西
            }
            return 0;//空地
        },
        //擦除蛇身
        erase: function(){
            for(var i=0; i<this.body.length; i++){
                this.eraseDot(this.body[i].x, this.body[i].y);
            }
        },
        //绘制蛇身
        paint: function(){
            for(var i=0; i<this.body.length; i++){
                this.paintDot(this.body[i].x, this.body[i].y,'#3399CC');
            }
        },
        //擦除一节
        eraseDot: function(x,y){
            this.tbl.rows[y].cells[x].style.backgroundColor = "";
        },
        paintDot: function(x,y,color){
            this.tbl.rows[y].cells[x].style.backgroundColor = color;
        },

        //检查一个坐标点有没有被填充
        isCellFilled: function(x,y){
            if(this.tbl.rows[y].cells[x].style.backgroundColor == ""){
                return false;
            }
            return true;
        },
        //又一次開始
        restart: function(){
            if(this.timer){
                clearInterval(this.timer);
            }
            for(var i=0; i<this.rowCount;i++){
            		this.tbl.deleteRow(0);
            }
            this.body = [];
            this.init();
            this.speed = 250;
        },
        //加速
        speedUp: function(time){
        		if(!this.paused){
        				if(this.speed+time<10||this.speed+time>2000){
        						return;
        				}
		        		this.speed +=time;
		        		this.pause();
		        		this.move();
        		}
        },
		speedClass:function(){
			var speedClass = (250-Snake.speed)/20;
			return speedClass;
		},
        //产生食物。
        generateDood: function(){
    		var x = Math.floor(Math.random()*this.colCount);
            var y = Math.floor(Math.random()*this.rowCount);
            var color = '#009933';
			while (true) {
				if (!this.isCellFilled(x, y)) {
					this.tbl.rows[y].cells[x].style.backgroundColor = color;
					break;
				}
				x = Math.floor(Math.random()*this.colCount);
            	 y = Math.floor(Math.random()*this.rowCount);
			}
        }
    };
</script>
<body onLoad="Snake.init();">
	<div id="pannel">
		<table id="main" border="1" cellspacing="0" cellpadding="0">
		</table>
		<div id="operate">
			<input type="button" id="btn" value="開始" />
			<input type="button" id="reset" value="又一次開始" />
			<input type="button" id="upSpeed" value="加速" />
			<input type="button" id="downSpeed" value="减速" /><br><br>
			<span>当前分数:<input type="text" id="core" value=0 readonly="readonly" /></span>
			     <span>当前速度<input type="text" id="speed" value=0 readonly="readonly" /></span>
		<div>
	</div>
<script>
		$('btn').onclick = function(){
				if(Snake.paused){
						Snake.move();
						Snake.paused = false;
				}
				else{
						Snake.pause();
						Snake.paused = true;
				}
		};
		$("reset").onclick = function(){
				Snake.restart();
				this.blur();
		};
		$("upSpeed").onclick = function(){
				Snake.speedUp(-20);
		};
		$("downSpeed").onclick = function(){
				Snake.speedUp(20);
		};
</script>
</body>
</html>

代码可能有点多,并且bug也有好几个。可是对于刚開始学习的人我感觉应该是挺easy理解的。

版权声明:本文博客原创文章,博客,未经同意,不得转载。

时间: 2024-10-13 13:25:54

javascript它【蛇系列】第一弹:简单的蛇实现的相关文章

160个CRACK_ME系列 第一弹

这是160crackme系列的第一个,下载链接我会放在文章末尾,有兴趣的朋友可以玩玩看.我们先打开文件上来就是一个明晃晃的挑衅,等会一定也要把他干掉有三个按钮,看起来右边这个简单点,就点他好了这时候对软件的大体结构一定要有思路,虽然不能直接得出flag但是会对程序的分析有很大的帮助.那么来分析一下这个程序,左边那个按钮的部分大概就是根据输入的Name字段来生成Serial,而这个部分应该就是一个固定的注册码.按照惯例,先拉到PEID里查查壳不认识,没关系,百度一下看看是啥玩意幸好,不是壳而是一种

C语言——贪吃蛇(第一阶段构造小蛇

使用的工具是 CodeBlock #include<stdio.h> #include<stdlib.h> #include<windows.h> #define High 20 //游戏画面尺寸 #define Width 30 //全局变量 int canvas[High][Width] = {0}; void gotoxy(int x, int y) { HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE); COORD

javascript之【贪吃蛇系列】第一弹:简单的贪吃蛇实现

参考博客:http://blog.csdn.net/sunxing007/article/details/4187038 以上博客是参考,毕竟第一次做,真让自己盲人摸象做不出来. 不过我在其上做了一些改进,界面等效果看起来更好一些. 下图是在Chrome上运行的效果,但是火狐和IE会不兼容,onkeydown事件不能正确调用 这里用了一张图把贪吃蛇制作过程的思想画了出来,画的有点简陋: 下面就是把代码发上来,上边有详细的解释: <html> <head> <title>

JavaScript实现简单贪吃蛇小游戏

之前上Web课,学到JavaScript的时候,老师要求写几个静态页面,要用到JavaScript.想了想就写个贪吃蛇吧.其实之前用pygame写过一次GUI的贪吃蛇,素材都是自己拿画图画的,其丑无比.所以这次还是老老实实用字符吧. 首先,是一些全局变量的定义: 1 <script> 2 var state = 0;//0 wait 1 run 2 over 3 var width = 40; 4 var height = 25; 5 var update = false; 6 var dir

JavaScript中的三种弹出对话框

JavaScript中的三种弹出对话框 *****本文来自互联网****** 学习过js的小伙伴会发现,我们在一些实例中用到了alert()方法.prompt()方法.prompt()方法,他们都是在屏幕上弹出一个对话框,并且在上面显示括号内的内容,使用这种方法使得页面的交互性更精彩,实际上我们经常会在进行网页浏览时简单这种类型的对话框,在用户与应用程序进行双向交流时,经常要用到对话框.avascript的三种对话框是通过调用window对象的三个方法alert(),confirm()和prom

前端学HTTP之报文系列第一篇——起始行

前面的话 如果说HTTP是因特网的信使,那么HTTP报文就是它用来搬东西的包裹了.HTTP报文是在HTTP应用程序之间发送的简单的格式化数据块,每条报文都包含一条来自客户端的请求,或者一条来自服务器的响应.它们由三个部分组成:由起始行.首部和实体的主体部分.本文是HTTP报文系列第一篇——起始行 报文语法 所有的HTTP报文都可以分为两类:请求报文(request message)和响应报文(response message).请求报文会向Web服务器请求一个动作,响应报文会将请求的结果返回给客

C#Light 和 uLua的对比第一弹

初始化 做一样的初始化,其实是没办法对等的 C#Light的Env 不等于Lua的LuaState C#Light的执行有完全的执行堆栈,完整的作用域,lua都没有 C#Light有完整的class 函数,继承特征,lua都没有 C#Light可以用VS做编辑器,lua? 为了保持平等对抗,三个测试先做一遍,再依次执行 测试1 ,简单的一次创建给个名字并销毁,测试300次 测试2,调用Debug.Log打印,执行300次 测试3,一次性在脚本里多调用一些方法,创建10个物体再销毁 测试一结果:

【数据库优化(持续更新)】--第一弹设计优化

前言 数据库是程序的仓库,也是程序中最脆弱的一部分,因为它的脆弱性和重要性,所以需要专门进行管理和优化.在如今的网络化的时代更加需要数据库的灵活和快捷,一个高效的数据库能够使程序运行效率更快,提高程序的运行效率.但往往对数据库的设计达不到我们想要的效果,所以数据库的优化显得尤为重要.该系列文章正是考虑大数据量的当今如何才能让数据库的设计更加灵活,数据检索.操作更加高效展开的讨论,其中涉及到的优化方法是在笔者长期的开发经验以及其它有关数据库优化的文章基础上进行总结的,如果有异议还请指出. 数据

java nio 第一弹

java NIO 第一弹----概览 摘要: Non-blocking I/O (usually called NIO, and sometimes called "New I/O") is a collection of Java programming language APIs that offer features for intensive I/Ooperations. It was introduced with the J2SE 1.4 release of Java b

深究angularJS系列 - 第二弹

深究angularJS系列 - 第二弹,在初步了解了Angular的基础上,进一步的针对Angular的控制器和作用域问题深入探究O(∩_∩)O~~ Angular控制器 控制器(Controller)的理解 控制器是对view的抽象,用来接收view的事件,响应view的请求: 控制器包含view的静态属性和动态的方法: 控制器与view是一对一的关系. 控制器(Controller)的结构 1 .controller("控制器的名字",function($scoppe){ 2 ..