贪吃蛇小游戏

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title></title>
</head>
<body>
</body>


</html>
<script type="text/javascript">
//地图
(function() {
//自定义地图构造函数
function MapG(width, height, background) {
this.width = width || 800;
this.height = height || 600;
this.background = background || '#ccc';
}
//定义到原型上  为了数据共享
MapG.prototype.init = function() {
//创建地图标签
var mapDiv = document.createElement('div');
//获取body标签
var body = document.querySelector('body');
//地图标签追加到body当中
body.appendChild(mapDiv);
mapDiv.style.width = this.width + 'px';
mapDiv.style.height = this.height + 'px';
mapDiv.style.background = this.background;
mapDiv.style.margin = '50px auto';
mapDiv.style.position = 'relative';
mapDiv.className = 'map';
}
//将作用域中的构造函数公布给全局window中的属性
window.MapG = MapG;
}());


//食物
(function() {
//创建数组 保存创建的食物的div
var elements = [];


function Food(width, height, background) {
this.Width = width || 20;
this.height = height || 20;
this.background = background || 'green';
//用来保存食物的坐标值
this.x = 0;
this.y = 0;
}
Food.prototype.init = function(mapDiv) {
//确保只有一个食物在地图上,所以当初始化生成食物div的时候
//先删除 再添加
remove();
//创建食物div标签
var foodDiv = document.createElement('div');
//追加到地图标签的子标签
mapDiv.appendChild(foodDiv);
foodDiv.style.width = this.Width + 'px';
foodDiv.style.height = this.height + 'px';
foodDiv.style.background = this.background;
foodDiv.style.position = 'absolute';
this.x = parseInt(Math.random() * (mapDiv.offsetWidth / foodDiv.offsetWidth)) * foodDiv.offsetWidth;


this.y = parseInt(Math.random() * (mapDiv.offsetHeight / foodDiv.offsetHeight)) * foodDiv.offsetHeight;


foodDiv.style.left = this.x + 'px';
foodDiv.style.top = this.y + 'px';
//把创建的食物div元素存到数组中
elements.push(foodDiv);
console.log(elements);
}
//私有方法,删除
function remove() {
for(var i = 0; i < elements.length; i++) {
//从父节点删除食物div
elements[i].parentNode.removeChild(elements[i]);
//删除数组中存储的每个食物div元素
elements.splice(i, 1);
}
}
window.Food = Food;
}());
//蛇
(function() {
var elements = [];


function Snake(width, height, dir) {
this.width = width || 20;
this.height = height || 20;
this.dir = dir || 'right';
//创建数组,由于身体三部分的位置不同,所以用json保存
this.snBody = [{
x: 3,
y: 2,
color: 'red'
}, {
x: 2,
y: 2,
color: 'orange'
}, {
x: 1,
y: 2,
color: 'orange'
}];
}
/*
* 初始化蛇方法 
* mapDiv参数:传入蛇的div元素
*/
Snake.prototype.init = function(mapDiv) {
//当初始化蛇的时候 只能保证有一条蛇 所以先删除  后添加
remove();
//遍历身体的三部分,
for(var i = 0; i < this.snBody.length; i++) {
//为每个身体创建div元素
var snDiv = document.createElement('div');
console.log(this.snBody[i]);
mapDiv.appendChild(snDiv);
//分别给每个部分设置css属性
snDiv.style.width = this.width + 'px';
snDiv.style.height = this.height + 'px';
snDiv.style.background = this.snBody[i].color;
snDiv.style.position = 'absolute';
snDiv.style.left = this.snBody[i].x * this.width + 'px';
snDiv.style.top = this.snBody[i].y * this.height + 'px';
elements.push(snDiv);
}
}
//删除蛇
function remove() {
//从蛇尾向蛇头删除div
for(var i = elements.length - 1; i >= 0; i--) {
elements[i].parentNode.removeChild(elements[i]);
elements.splice(i, 1);
}
}
//蛇移动
Snake.prototype.snMove = function() {
//把蛇头的x,y坐标给蛇中段,把蛇中间的坐标再给蛇头
for(var i = this.snBody.length - 1; i > 0; i--) {
this.snBody[i].x = this.snBody[i - 1].x;
this.snBody[i].y = this.snBody[i - 1].y;
}
//判断蛇头的方向
switch(this.dir) {
case 'right':
this.snBody[0].x += 1;
break;
case 'left':
this.snBody[0].x -= 1;
break;
case 'top':
this.snBody[0].y -= 1;
break;
case 'bottom':
this.snBody[0].y += 1;
break;
}
}
window.Snake = Snake;
}());


(function() {
var myThis;


function Game() {
//实例化地图对象
var m = new MapG();
this.m = m;
//实例化食物对象
var food = new Food();
this.food = food;
//实例化蛇对象
var snake = new Snake();
this.snake = snake;
myThis = this;
}
Game.prototype.init = function() {
//调用初始化方法,将创建的地图div添加到body
this.m.init();
var mapDiv = document.querySelector('.map')
//调用食物的init方法,参数中传入mapDiv,为了将食物加到地图div的子元素
this.food.init(mapDiv);
this.snake.init(mapDiv);
rule();
userKeydown();
}
//规则
var rule = function() {
var mapDiv = document.querySelector('.map');
//蛇移动
var timer = setInterval(function() {
//由于定时器是window对象调用的,所以在定时器内部的匿名函数中,this指的是window
//所以第一种方法:在定时器外声明一个变量,把指向Game的this保存到变量中
//在函数内可以通过变量访问Game对象的属性和方法
//第二种方法:直接在用匿名函数调用bind(对象),匿名函数中的this指向的就是bind()参数中对象
this.snake.snMove();
this.snake.init(mapDiv);

//蛇头出地图 游戏结束
//判断蛇头的坐标值是否和地图的坐标相等
// this.snake.snBody[0].x * this.snake.width 份数乘以自身宽度等于坐标值 
var overX = this.snake.snBody[0].x * this.snake.width;
var overY = this.snake.snBody[0].y * this.snake.height;
function divStyle() {
var div = document.createElement('div');
var body = document.querySelector('body');
body.appendChild(div);
div.style.cssText = 'width:300px;height:200px;border:1px #000 solid;position: absolute;left: 50%;top:0;transform: translateX(-50%);background: #fff;text-align: center; line-height: 200px;';
div.innerHTML = '游戏结束';
}
if(overX < 0 || overX == this.m.width||overY < 0 || overY == this.m.height) {
this.snake.init(mapDiv);
//关闭定时器游戏结束
clearInterval(timer);
divStyle();
}
//蛇头吃到食物
//判断蛇的坐标是否等于食物的坐标时,表示吃到食物,食物重新初始化  蛇尾加一个div
console.log(this.snake.snBody[0].x+'-------------'+ this.food.x);
if(this.snake.snBody[0].x * this.snake.width== this.food.x && this.snake.snBody[0].y * this.snake.height == this.food.y){
//初始化食物
this.food.init(mapDiv);
//蛇尾增加一个div,div的坐标就是当前蛇尾的坐标
//创建一条json数据 获取蛇尾的坐标,赋值给json追加到数组中
var snJson = {
x:this.snake.snBody[this.snake.snBody.length-1].x,
y:this.snake.snBody[this.snake.snBody.length-1].y,
color:'orange'
}
this.snake.snBody.push(snJson);
this.snake.init(mapDiv);

}

}.bind(myThis), 150)
}
var userKeydown = function() {
//addEventListener 事件监听 第一个参数:事件类型 第二个参数:匿名函数 第三个参数:是否事件冒泡
document.addEventListener('keydown', function(e) {
switch(e.keyCode) {
case 37:
this.snake.dir = 'left';
break;
case 38:
this.snake.dir = 'top';
break;
case 39:
this.snake.dir = 'right';
break;
case 40:
this.snake.dir = 'bottom';
break;
}
}.bind(myThis), false)
}
window.Game = Game;
}());


var game = new Game();
game.init();
</script>

1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。
1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值