Js写贪吃蛇

使用Javascript做贪吃蛇小游戏,

1.自定义地图宽高,蛇的初始速度

2.食物随机出现

3.蛇的样式属性

4.贪吃蛇玩法(吃食物,碰到边界,吃食物后加速,计分,)



<!DOCTYPE html>

<html lang="en">

<head>

<meta charset="UTF-8">

<title>Document</title>

<style type="text/css">

*{

padding: 0;

margin: 0;

}

</style>

</head>

<body>

<input type="text" id="fen" value="0" disabled>

<script type="text/javascript">

var kuang = parseInt(prompt("请输入地图宽度"));

var gao = parseInt(prompt("请输入地图高度"));

var sudu = parseInt(prompt("请输入蛇的速度(越大越慢)"));

//创建地图

function Map(){

//属性

this.width = kuang;

this.height = gao;

this.backgroundColor = 'gray';

this.ditu = null;

//方法

if (!Map.prototype.show) {

Map.prototype.show = function(){

//创建div

var div = document.createElement('div');

//设置样式

div.style.width = this.width + 'px';

div.style.height = this.height + 'px';

div.style.backgroundColor = this.backgroundColor;

//显示在页面

document.body.appendChild(div);

//将地图div 保存到地图对象的属性上

this.ditu = div;

}

}

}

var map = new Map();

map.show();

//创建食物

function Food(map){

//属性

this.width = 20;

this.height = 20;

this.backgroundColor = 'yellow';

this.x = 0;

this.y = 0;

this.position = 'absolute';

this.borderRadius = '50%';

this.shiwu = null;

//方法

if(!Food.prototype.show){

Food.prototype.show = function(){

//判断,显示,刷新

if(!this.shiwu){

//创建div

var div = document.createElement('div');

div.style.width = this.width + 'px';

div.style.height = this.height + 'px';

div.style.backgroundColor = this.backgroundColor;

div.style.borderRadius = this.borderRadius;

div.style.position = this.position;

//显示到界面

map.ditu.appendChild(div);

this.shiwu = div;

}

//位置

//横/纵坐标 = 0~30随机数 * 地图宽/食物宽(食物宽20)

this.x = Math.floor(Math.random() * (map.width / this.width));

this.y = Math.floor(Math.random() * (map.height / this.height));

//根据坐标,显示食物位置

this.shiwu.style.left = this.x * this.width + 'px';

this.shiwu.style.top = this.y * this.height + 'px';

}

}

}

//输出

var food = new Food(map);

food.show();

//创建蛇

function Snake(){

//属性

this.width = 20;

this.height = 20;

this.position = 'absolute';

this.direction = 'right';

this.borderRadius = '50%';

//是否可以改变方向

this.canChange = false;

//身体

//[[x, y, 颜色, div]]

this.body = [[5, 5, 'red', null], [4, 5, 'blue', null], [3, 5, 'blue', null]];

//方法

//判断,显示,移动

if(!Snake.prototype.show){

Snake.prototype.show = function(){

//创建每节身体div

for (var i = 0; i < this.body.length; i++) {

//每节身体,判断是否创建过

if (!this.body[i][3]) {

//公共样式

var div =document.createElement('div');

div.style.width = this.width + 'px';

div.style.height = this.height + 'px';

div.style.position = this.position;

//显示

map.ditu.appendChild(div);

this.body[i][3] = div;

}

//不同样式

this.body[i][3].style.backgroundColor = this.body[i][2];

this.body[i][3].style.left = this.body[i][0] * this.width + 'px';

this.body[i][3].style.top = this.body[i][1] * this.height+ 'px';

this.body[i][3].style.borderRadius = '5px';

this.body[0][3].style.borderRadius = this.borderRadius;

}

//显示完成,可以修改方向

this.canChange = true;

}

//移动

//最后一节坐标变成前一节坐标

Snake.prototype.move = function(){

//循环,修改每节坐标

for (var i = this.body.length - 1; i > 0; i--) {

//x = x-1 y = y-1

this.body[i][0] = this.body[i-1][0];

this.body[i][1] = this.body[i-1][1];

}

//蛇头控制方向

if (this.direction == 'right') {

//x + 1

this.body[0][0] += 1;

}else if(this.direction == 'left') {

//x - 1

this.body[0][0] -= 1;

}else if(this.direction == 'up') {

//y - 1

this.body[0][1] -= 1;

}else if(this.direction == 'down') {

//y + 1

this.body[0][1] += 1;

}

//判断边界

if (this.body[0][0] < 0 || this.body[0][0] > (map.width / this.width) - 1 || this.body[0][1] < 0 || this.body[0][1] > (map.height / this.height) - 1)  {

//游戏结束

clearInterval(timer);

alert('游戏结束');

return;

}

//判断 蛇头和其他身体坐标重合

for (var i = 1; i < this.body.length; i++) {

if (this.body[0][0] == this.body[i][0] && this.body[0][1] == this.body[i][1]) {

//重合,停止

clearInterval(timer);

alert('游戏结束');

return;

}

}

//重新显示

this.show();

//判断 是否吃到食物 蛇头坐标和食物坐标一样

if (this.body[0][0] == food.x && this.body[0][1] == food.y) {

//分数

var score = document.getElementById('fen');

var sc = parseInt(score.value)+1;

                    score.value = sc;

//吃到 this.body加长一节

this.body[this.body.length] = [0, 0, 'blue', null];

//食物刷新

food.show();

//吃到食物,加速

if(t>150){

t -= 10;

setTimer();

}

}

}

}

}

//输出蛇

var snake = new Snake;

snake.show();

//绑定键盘

window.onkeyup = function(e){

var evt = e || window.event;

if (!snake.canChange) {

return;

}

//左 37 上 38 右 39 下 40

if (e.keyCode == 37 && snake.direction != 'right') {

snake.direction = 'left'

}else if(e.keyCode == 38 && snake.direction != 'down') {

snake.direction = 'up'

}else if(e.keyCode == 39 && snake.direction != 'left') {

snake.direction = 'right'

}else if(e.keyCode == 40 && snake.direction != 'up') {

snake.direction = 'down'

}

snake.canChange =false;

};

//定时器 自动移动

var t = sudu;

var timer;

function setTimer(){

//先停止

clearInterval(timer);

//重新设置

timer = setInterval(function(){

snake.move();

}, t);

}

setTimer();

</script>

</body>

</html>

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,723评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,485评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,998评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,323评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,355评论 5 374
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,079评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,389评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,019评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,519评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,971评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,100评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,738评论 4 324
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,293评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,289评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,517评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,547评论 2 354
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,834评论 2 345

推荐阅读更多精彩内容

  • 辟谷第五天,感觉: 1、头脑异常清醒; 2、精气神儿足; 3、体重轻了6斤 4、还是特别馋,最想吃麻辣火锅、麻辣香...
    恩煦阅读 338评论 0 0
  • 每天都会有不同的状况,比如今天我们阿姨玻璃擦带掉了,按正常情况来说,我因该会生气发火,但是我知道当下是要解决问题,...
    夏天的名字被用了阅读 91评论 0 0
  • 隔壁单元有个老太太,七十左右的年纪,前几年头发花白,今年是全白了。不知什么时候起,我们开始打招呼,我叫她“阿姨”,...
    荒岛黎明7809阅读 297评论 1 1
  • 过了12点 便是昨天发生的事 和冬骑着单车 一路向前 一前一后一左一右 又回到我们十几岁的样子 那年我跟在她后面 ...
    Greece姑娘阅读 99评论 0 0
  • 昨天在紧张的节奏中赶回到家已经很晚,疲惫的双眼和身躯让我和儿子都倒床秒睡!错过了第二十一的打卡,其实心里觉得挺遗憾...
    滋养悦纳活在当下阅读 363评论 0 0