案例:贪吃蛇小游戏

可以玩的小游戏,略复杂,过了2遍,先pass吧

先创建构造函数,再给原型添加方法。分别创建食物,小蛇和游戏对象。

食物,小蛇的横纵坐标,设置最大最小值,运动起来的函数,按上下左右键的处理函数,吃到的处理函数

<!DOCTYPE html>
<html lang="en"> <head>
<meta charset="UTF-8">
<title>title</title>
<style>
.map {
width: 800px;
height: 600px;
background-color: #CCC;
position: relative;
}
</style>
</head> <body>
<!--画出地图,设置样式-->
<div class="map"></div>
<script> //自调用函数----食物的
(function () {
var elements = [];//用来保存每个小方块食物的
//食物就是一个对象,有宽,有高,有颜色,有横纵坐标,先定义构造函数,然后创建对象
function Food(x, y, width, height, color) {
//横纵坐标
this.x = x || 0;
this.y = y || 0;
//宽和高
this.width = width || 20;
this.height = height || 20;
//背景颜色
this.color = color || "green";
} //为原型添加初始化的方法(作用:在页面上显示这个食物)
//因为食物要在地图上显示,所以,需要地图的这个参数(map---就是页面上的.class=map的这个div)
Food.prototype.init = function (map) {
//先删除这个小食物
//外部无法访问的函数
remove(); //创建div
var div = document.createElement("div");
//把div加到map中
map.appendChild(div);
//设置div的样式
div.style.width = this.width + "px";
div.style.height = this.height + "px";
div.style.backgroundColor = this.color;
//先脱离文档流
div.style.position = "absolute";
//随机横纵坐标
this.x = parseInt(Math.random() * (map.offsetWidth / this.width)) * this.width;
this.y = parseInt(Math.random() * (map.offsetHeight / this.height)) * this.height;
div.style.left = this.x + "px";
div.style.top = this.y + "px"; //把div加入到数组elements中
elements.push(div);
}; //私有的函数---删除食物的
function remove() {
//elements数组中有这个食物
for (var i = 0; i < elements.length; i++) {
var ele = elements[i];
//找到这个子元素的父级元素,然后删除这个子元素
ele.parentNode.removeChild(ele);
//再次把elements中的这个子元素也要删除
elements.splice(i, 1);
}
} //把Food暴露给Window,外部可以使用
window.Food = Food;
}()); //自调用函数---小蛇
(function () {
var elements = [];//存放小蛇的每个身体部分
//小蛇的构造函数
function Snake(width, height, direction) {
//小蛇的每个部分的宽
this.width = width || 20;
this.height = height || 20;
//小蛇的身体
this.body = [
{ x: 3, y: 2, color: "red" },//头
{ x: 2, y: 2, color: "orange" },//身体
{ x: 1, y: 2, color: "orange" }//身体
];
//方向
this.direction = direction || "right";
} //为原型添加方法--小蛇初始化的方法
Snake.prototype.init = function (map) {
//先删除之前的小蛇
remove();//=========================================== //循环遍历创建div
for (var i = 0; i < this.body.length; i++) {
//数组中的每个数组元素都是一个对象
var obj = this.body[i];
//创建div
var div = document.createElement("div");
//把div加入到map地图中
map.appendChild(div);
//设置div的样式
div.style.position = "absolute";
div.style.width = this.width + "px";
div.style.height = this.height + "px";
//横纵坐标
div.style.left = obj.x * this.width + "px";
div.style.top = obj.y * this.height + "px";
//背景颜色
div.style.backgroundColor = obj.color;
//方向暂时不定
//把div加入到elements数组中----目的是为了删除
elements.push(div);
}
}; //为原型添加方法---小蛇动起来
Snake.prototype.move = function (food, map) {
//改变小蛇的身体的坐标位置
var i = this.body.length - 1;//2
for (; i > 0; i--) {
this.body[i].x = this.body[i - 1].x;
this.body[i].y = this.body[i - 1].y;
}
//判断方向---改变小蛇的头的坐标位置
switch (this.direction) {
case "right":
this.body[0].x += 1;
break;
case "left":
this.body[0].x -= 1;
break;
case "top":
this.body[0].y -= 1;
break;
case "bottom":
this.body[0].y += 1;
break;
} //判断有没有吃到食物
//小蛇的头的坐标和食物的坐标一致
var headX = this.body[0].x * this.width;
var headY = this.body[0].y * this.height;
//判断小蛇的头的坐标和食物的坐标是否相同
if (headX == food.x && headY == food.y) {
//获取小蛇的最后的尾巴
var last = this.body[this.body.length - 1];
//把最后的蛇尾复制一个,重新的加入到小蛇的body中
this.body.push({
x: last.x,
y: last.y,
color: last.color
});
//把食物删除,重新初始化食物
food.init(map);
}
}
;//删除小蛇的私有的函数=============================================================================
function remove() {
//删除map中的小蛇的每个div,同时删除elements数组中的每个元素,从蛇尾向蛇头方向删除div
var i = elements.length - 1;
for (; i >= 0; i--) {
//先从当前的子元素中找到该子元素的父级元素,然后再弄死这个子元素
var ele = elements[i];
//从map地图上删除这个子元素div
ele.parentNode.removeChild(ele);
elements.splice(i, 1);
}
} //把Snake暴露给window,外部可以访问
window.Snake = Snake;
}()); //自调用函数---游戏对象================================================
(function () { var that = null;//该变量的目的就是为了保存游戏Game的实例对象------- //游戏的构造函数
function Game(map) {
this.food = new Food();//食物对象
this.snake = new Snake();//小蛇对象
this.map = map;//地图
that = this;//保存当前的实例对象到that变量中-----------------此时that就是this
} //初始化游戏-----可以设置小蛇和食物显示出来
Game.prototype.init = function () {
//初始化游戏
//食物初始化
this.food.init(this.map);
//小蛇初始化
this.snake.init(this.map);
//调用自动移动小蛇的方法========================||调用了小蛇自动移动的方法
this.runSnake(this.food, this.map);
//调用按键的方法
this.bindKey();//========================================
}; //添加原型方法---设置小蛇可以自动的跑起来
Game.prototype.runSnake = function (food, map) { //自动的去移动
var timeId = setInterval(function () {
//此时的this是window
//移动小蛇
this.snake.move(food, map);
//初始化小蛇
this.snake.init(map);
//横坐标的最大值
var maxX = map.offsetWidth / this.snake.width;
//纵坐标的最大值
var maxY = map.offsetHeight / this.snake.height;
//小蛇的头的坐标
var headX = this.snake.body[0].x;
var headY = this.snake.body[0].y;
//横坐标
if (headX < 0 || headX >= maxX) {
//撞墙了,停止定时器
clearInterval(timeId);
alert("游戏结束");
}
//纵坐标
if (headY < 0 || headY >= maxY) {
//撞墙了,停止定时器
clearInterval(timeId);
alert("游戏结束");
}
}.bind(that), 150);
}; //添加原型方法---设置用户按键,改变小蛇移动的方向
Game.prototype.bindKey = function () { //获取用户的按键,改变小蛇的方向
document.addEventListener("keydown", function (e) {
//这里的this应该是触发keydown的事件的对象---document,
//所以,这里的this就是document
//获取按键的值
switch (e.keyCode) {
case 37: this.snake.direction = "left"; break;
case 38: this.snake.direction = "top"; break;
case 39: this.snake.direction = "right"; break;
case 40: this.snake.direction = "bottom"; break;
}
}.bind(that), false);
}; //把Game暴露给window,外部就可以访问Game对象了
window.Game = Game;
}()); //初始化游戏对象
var gm = new Game(document.querySelector(".map")); //初始化游戏---开始游戏
gm.init(); </script>
</body> </html>

JS高级---案例:贪吃蛇小游戏的更多相关文章

  1. JS高级---案例贪吃蛇,把封装的函数移动到js文件中

    案例贪吃蛇,把封装的函数移动到js文件中 <!DOCTYPE html> <html lang="en"> <head> <meta ch ...

  2. 用js写一个贪吃蛇小游戏

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  3. C++ 简单的控制台贪吃蛇小游戏

    由于比较懒,所以不怎么写,觉得这样不应该.我应该对自己学的做出整理,不管是高端低端,写出来是自己的. // 贪吃蛇.cpp : 定义控制台应用程序的入口点. // #include "std ...

  4. 贪吃蛇小游戏-----C语言实现

    1.分析 众所周知,贪吃蛇游戏是一款经典的益智游戏,有PC和手机等多平台版本,既简单又耐玩.该游戏通过控制蛇头方向吃食物,从而使得蛇变得越来越长,蛇不能撞墙,也不能装到自己,否则游戏结束.玩过贪吃蛇的 ...

  5. Java GUI学习,贪吃蛇小游戏

    JAVA GUI练习 贪吃蛇小游戏 前几天虽然生病了,但还是跟着狂神学习了GUI的方面,跟着练习了贪吃蛇的小项目,这里有狂神写的源码点我下载,还有我跟着敲的点我下载,嘿嘿,也就注释了下重要的地方,这方 ...

  6. 用GUI实现java版贪吃蛇小游戏

    项目结构 新建一个JFrame窗口,作为程序入口 public class GameStart{ public static void main(String[] args) { JFrame jFr ...

  7. Java 用java GUI写一个贪吃蛇小游戏

    目录 主要用到 swing 包下的一些类 上代码 游戏启动类 游戏数据类 游戏面板类 代码地址 主要用到 swing 包下的一些类 JFrame 窗口类 JPanel 面板类 KeyListener ...

  8. JS高级---案例:随机小方块 (贪吃蛇的食物部分)

    案例:随机小方块 产生随机数对象,自调用构造函数 产生小方块对象,自调用构造函数,里面存放: 食物的构造函数 给原型对象添加方法:初始化小方块的显示的效果及位置---显示地图上 给原型对象添加方法,产 ...

  9. JS贪吃蛇小游戏

    效果图展示: 具体实现代码如下: (1)html部分 !DOCTYPE html> <html> <head> <meta charset="utf-8& ...

随机推荐

  1. canvas-文字粒子化(小程序)

    有2张画板,1张渲染文字为获取文字数组,另一张用来渲染粒子根据拿到的数组. step1:渲染文字,根据canvasGetImageData拿到rgba数组 step2:遍历rgba数组拿到粒子的坐标 ...

  2. 【你不知道的javaScript 上卷 笔记6】javaScript中的对象相关内容

    一.创建一个对象的语法 var myObj = { key: value // ... };//字面量 var myObj = new Object(); //new myObj.key = valu ...

  3. Quartz.NET 2.x教程

    第1课:使用Quartz第2课:工作和触发器第3课:关于工作和JobDetails的更多信息第4课:有关触发器的更多信息第5课:SimpleTriggers第6课:CronTriggers第7课:Tr ...

  4. linux命令解压压缩rar文件的详细步骤

    参考文件:https://www.cnblogs.com/qinglin/p/9007939.html

  5. [SDOI2013] 直径 - 树形dp

    对于给定的一棵树,其直径的长度是多少,以及有多少条边满足所有的直径都经过该边. Solution 有点意思 先随便求一条直径(两次DFS即可),不妨设为 \(s,t\),我们知道要求的这些边一定都在这 ...

  6. 设置Eclipse中的字符集为UTF-8

    Eclipse 修改字符集 默认情况下 Eclipse 字符集为 GBK,但现在很多项目采用的是 UTF-8,这是我们就需要设置我们的 Eclipse 开发环境字符集为 UTF-8, 设置步骤如下: ...

  7. jdk 1.8.0_131 Class JavaLaunchHelper is implemented

    错误提示:objc[49447]: Class JavaLaunchHelper is implemented in both /Library/Java/JavaVirtualMachines/jd ...

  8. Your name ?

    序言 才发觉自己有许多名字 ··································································· 言归正传 今天才发现,自己在不同地方 ...

  9. python:复制文件及文件夹

    #!/usr/bin/python# -*- coding:utf-8 -*- import shutil #shutil.copy(文件1,文件2)#将源内容复制到目标文件中.d.txt不存在则创建 ...

  10. python UI自动化之js操作

    js处理iframe无需先切换到iframe上,再切回来操作.它可以在iframe上和主页面上来回自由操作. switch方法需要先切换到iframe上,操作完之后又的切换回来(很容易忘记切换回来), ...