web前端项目-贪吃蛇小游戏【附源码】

news2024/11/26 16:59:54

web前端项目-贪吃蛇小游戏

【贪吃蛇】是一款经典的小游戏,采用HTMLCSSJavaScript技术进行开发,玩家通过控制一条蛇在地图上移动,蛇的目的是吃掉地图上的食物,并且让自己变得更长。游戏的核心玩法是控制蛇的移动方向和长度,同时避免蛇头碰到自己的身体或者游戏边界

运行效果:上下左右键控制蛇的移动;空格为游戏开始/暂停;可以在游戏界面设置蛇的移动速度
在这里插入图片描述
在这里插入图片描述

HTML源码–index.html

<!DOCTYPE html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>贪吃蛇小游戏</title>
<link rel="stylesheet" href="css/snake.css">
<script type="text/javascript" src="js/snake.js"></script>
</head>

<body>
<div class="box">
    <span>分数:<span id="foodNum"></span></span>
    <span>选择速度:<select id="setSpeed">
		<option value="200">慢速</option>
		<option value="100">中速</option>
		<option value="50">快速</option>
	</select></span>
    <span>开始/暂停(空格键)</span>
</div>
<table id="map"></table>
</body>
</html>

js源码–snake.js

function Snake(){
    this.rows = 21;//21行
    this.cols = 21;//21列
    this.speed = 200;//前进速度
    this.curKey = 0;//当前方向按键键码值
    this.timer = 0;
    this.pos = [];//蛇身位置
    this.foodPos = {"x":-1,"y":-1};
    this.foodNum = 0;//吃掉食物数量
    this.dom = document.getElementById("map");//地图元素
    this.pause = 1;//1表示暂停,-1表示开始
}
Snake.prototype.map = function(){//创建地图
	if(this.dom.firstChild){
		this.dom.removeChild(this.dom.firstChild);//重新开始 删除之前创建的tbody
	}
    for( j = 0; j < this.rows; j++ ){
        var tr = this.dom.insertRow(-1);//插入一行
        for( i = 0; i < this.cols; i++ ){
            tr.insertCell(-1);//插入一列
        }
    }
}
Snake.prototype.food = function(){//生成食物
    do{
        this.foodPos.y = Math.floor( Math.random()*this.rows );
        this.foodPos.x = Math.floor( Math.random()*this.cols );
    }while( this.dom.rows[this.foodPos.y].cells[this.foodPos.x].className != "" )//防止食物生成在蛇身上
    this.dom.rows[this.foodPos.y].cells[this.foodPos.x].className="snakefood";//设置食物样式
    document.getElementById("foodNum").innerHTML=this.foodNum++;//设置分数
}
Snake.prototype.init = function(){
    this.map();//创建地图
    arguments[0] ? this.speed=arguments[0] : false;//选择速度
    this.pos = [{"x":2,"y":0},{"x":1,"y":0},{"x":0,"y":0}];//定义蛇身位置
    for(var j=0; j<this.pos.length; j++ ){//显示蛇身
        this.dom.rows[this.pos[j].y].cells[this.pos[j].x].className="snakebody";
    }
    this.dom.rows[this.pos[0].y].cells[this.pos[0].x].className="snakehead";//为蛇头设置样式
    this.curKey = 0;//当前方向按键键码值
    this.foodNum = 0;//吃掉食物数量
    this.food();//生成食物
    this.pause = 1;//1表示暂停,-1表示开始
}
Snake.prototype.trigger = function(e){
	var _t=this;
    var e = e || event;
    var eKey = e.keyCode;//获取按键键码值
    if( eKey>=37 && eKey<=40 && eKey!=this.curKey && !( (this.curKey == 37 && eKey == 39) || (this.curKey == 38 && eKey == 40) || (this.curKey == 39 && eKey == 37) || (this.curKey == 40 && eKey == 38) ) && this.pause==-1 ){//如果按下的是方向键,并且不是当前方向,也不是反方向和暂停状态
        this.curKey = eKey;        //设置当前方向按键键码值        
    }else if( eKey==32 ){
        this.curKey = (this.curKey==0) ? 39 : this.curKey;
		this.pause*=-1;
		if(this.pause==-1){
			this.timer=window.setInterval(function(){_t.move()},this.speed);//蛇身移动
		}else{
			window.clearInterval(this.timer);//停止
		}
    }
}
Snake.prototype.move = function(){//移动
    switch(this.curKey){
        case 37: //左方向
            if( this.pos[0].x <= 0 ){ //蛇头撞到边界
				this.over(); 
				return; 
			}else{ 
				this.pos.unshift( {"x":this.pos[0].x-1,"y":this.pos[0].y}); //添加元素
			}
            break;
        case 38: //上方向
            if( this.pos[0].y <= 0 ){ 
				this.over(); 
				return; 
			}else{ 
				this.pos.unshift( {"x":this.pos[0].x,"y":this.pos[0].y-1}); 
			}
            break;
        case 39://右方向
            if( this.pos[0].x >= this.cols-1 ){ 
				this.over(); 
				return; 
			}else{ 
				this.pos.unshift( {"x":this.pos[0].x+1,"y":this.pos[0].y}); 
			}
            break;
        case 40: //下方向
            if( this.pos[0].y >= this.rows-1 ){ 
				this.over(); 
				return; 
			}else{ 
				this.pos.unshift( {"x":this.pos[0].x,"y":this.pos[0].y+1}); 
			}
            break;
    }
    if( this.pos[0].x == this.foodPos.x && this.pos[0].y == this.foodPos.y ){//蛇头位置与食物重叠
        this.food();//生成食物
    }else if( this.curKey != 0 ){
        this.dom.rows[this.pos[this.pos.length-1].y].cells[this.pos[this.pos.length-1].x].className="";
        this.pos.pop();//删除蛇尾
    }
    for(i=3;i<this.pos.length;i++){//从蛇身的第四节开始判断是否撞到自己
        if( this.pos[i].x == this.pos[0].x && this.pos[i].y == this.pos[0].y ){ 
            this.over();//游戏结束
            return;
        }
    }
    this.dom.rows[this.pos[0].y].cells[this.pos[0].x].className="snakehead";//画新蛇头
    this.dom.rows[this.pos[1].y].cells[this.pos[1].x].className="snakebody";//原蛇头变为蛇身
}
Snake.prototype.over = function(){
    alert("游戏结束");
    window.clearInterval(this.timer);//停止
    this.init();//重置游戏
}
window.onload = function(){
    var snake = new Snake();//创建对象实例
    snake.init();//调用初始化方法
    document.onkeydown = function(e){ 
		snake.trigger(e); //按下按键时调用方法
	}
    document.getElementById("setSpeed").onchange = function(){ 
		this.blur(); 
		snake.init(this.value); 
	}
}

CSS源码–snake.css

  *                         { margin:0; padding:0; font-family:Verdana,宋体; font-size:12px;}
  table#map { width:auto; height:auto; margin:0 auto; border-collapse:collapse; border-spacing:0; background-color:#EAEAEA; clear:both; background:#74AFE0}
  td                 { width:10px; height:10px; border:1px solid black;}
  .snakehead         { background-color: orangered;}
  .snakebody         { background-color:#FFCC00;}
  .snakefood         { background-color: orangered;}
  .box        { width:310px; margin:0 auto; padding:3em 0; list-style:none;}
  .box>span{ float:left; height:30px; margin-right:1.5em; line-height:30px;}

注: 以上为本项目的所有源码,无图片素材

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1393312.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C++(12)——string

目录 1.insert: 1.1 string& insert (size_t pos, const string& str)&#xff1a; 1.2 string& insert (size_t pos, const char* s)&#xff1a; 1.3 string& insert (size_t pos, const char* s, size_t n)&#xff1a; 1.4 string& insert (…

【c++】栈(satck)和队列(queue)

目录 一、stack 1.stack的介绍 2.stack的使用 3.stack的模拟实现 二、queue 1.queue的介绍 2.queue的使用 3.queue的模拟实现 三、priority_queue 1.priority_queue的介绍 2.priority_queue的使用 一、stack 1.stack的介绍 &#xff08;1&#xff09;stack是一种容…

Baichuan2百川模型部署的bug汇总

1.4bit的量化版本最好不要在Windows系统中运行&#xff0c;大概原因报错原因是bitsandbytes不支持window&#xff0c;bitsandbytes-windows目前仅支持8bit量化。 2. 报错原因是机器没有足够的内存和显存&#xff0c;offload_folder设置一个文件夹来保存那些离线加载到硬盘的权…

包含广告或宣传性质的内容或参考资料不对应,百度百科词条怎么改

想要修改百度百科词条&#xff0c;却发现在编辑百度百科词条时经常提示“包含广告或宣传性质的内容”&#xff0c;又或者经常遇到“参考资料不对应”的情况&#xff0c;我们该如何正确修改百度百科词条才能推广&#xff0c;洛希爱做百科网为大家分享。 修改百科百度百科词条提示…

基于SSM的校园闲置物品交易平台设计与实现

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;采用JSP技术开发 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#x…

nexus3 npm-hosted仓库迁移

迁移背景&#xff1a; 从nexus 3.33 升级到 nexus 3.64 过程中&#xff0c;私服 npm-hosted 无法上传。由于这个 npm-hosted 和 npm-proxy 放的同一个 blob存储&#xff0c;无法单独拆除去&#xff0c;所以采用迁移的方式 迁移思路&#xff1a; down下来 npm-hosted 仓库&am…

e2studio开发三轴加速度计LIS2DW12(3)----检测活动和静止状态

e2studio开发三轴加速度计LIS2DW12.3--检测活动和静止状态 概述视频教学样品申请源码下载新建工程工程模板保存工程路径芯片配置工程模板选择时钟设置UART配置UART属性配置设置e2studio堆栈e2studio的重定向printf设置R_SCI_UART_Open()函数原型回调函数user_uart_callback ()…

【征服redis8】Redis的AOF持久化

Redis 支持多种持久化方式来保证数据的可靠性和持久性。前面我们介绍了RDB方式。我们我们介绍第二种方式——AOF&#xff08;Append Only File&#xff09;机制是一种常用的持久化方式&#xff0c;它记录了所有对 Redis 数据库进行修改的命令&#xff0c;在 Redis 重启时可以使…

【Java】HttpServlet类中前后端交互三种方式(query string、form表单、JSON字符串)

在前后端的交互中&#xff0c;前端通过以下三种方式来与后端进行交互&#x1f31f; ✅query string ✅form表单 ✅JSON字符串 下面我们将书写这三种方式的后端代码并进行讲解 1、Query String QueryString即在url中写入键值对&#xff0c;一般用doGet方法进行交互 代码如下 …

读AI3.0笔记02_起源

1. 起源 1.1. 1955年&#xff0c;28岁的麦卡锡进入了达特茅斯学院的数学系 1.2. 该领域的正式确立可以追溯到1956年由一位名叫约翰麦卡锡的年轻数学家在达特茅斯学院举办的一场小型研讨会 1.2.1. 在1956年&#xff0c;即便是最先进的计算机&#xff0c;其速度也达不到现代智…

HarmonyOS —— buildMode 设置(对比 Android Build Varient)

前言 在安卓中 Build Variant 主要依赖模块&#xff08;module&#xff09;中 build.gradle 的 BuildType 和 ProductFlavor 提供的属性和方法&#xff0c;我们可以使用 Build Type 可以配置不同的构建方式、ProductFlavor 主要用来进行多渠道打包。 在鸿蒙中要做到同样像效果…

用CHAT分析高校体育智慧教学体系构建与探索研究现状

CHAT回复&#xff1a;现阶段&#xff0c;高校体育智慧教学体系的构建与探索研究还处于初级阶段&#xff0c;但全球数字化转型大潮的推动下&#xff0c;一些较为前沿的研究和实践已经开始出现&#xff1a; 1.教学平台的建设&#xff1a;很多高校已经开始尝试使用在线教育平台进行…

web蓝桥杯真题--9、水果拼盘

介绍 目前 CSS3 中新增的 Flex 弹性布局已经成为前端页面布局的首选方案&#xff0c;本题可以使用 Flex 属性快速完成布局。 准备 开始答题前&#xff0c;需要先打开本题的项目代码文件夹&#xff0c;目录结构如下&#xff1a; ├── css │ └── style.css ├── im…

【计算机图形学】习题课:Viewing

【计算机图形学】Viewing 部分问题与解答 CS100433 Computer Graphics Assignment 21 Proof the composed transformations defined in global coordinate frame is equivalent to the composed transformations defined in local coordinate frame but in different composing…

2024年腾讯云轻量服务器和CVM云服务器性能如何?

腾讯云轻量服务器和云服务器有什么区别&#xff1f;为什么轻量应用服务器价格便宜&#xff1f;是因为轻量服务器CPU内存性能比云服务器CVM性能差吗&#xff1f;轻量应用服务器适合中小企业或个人开发者搭建企业官网、博客论坛、微信小程序或开发测试环境&#xff0c;云服务器CV…

进阶Docker4:网桥模式、主机模式与自定义网络

目录 网络相关 子网掩码 网关 规则 docke网络配置 bridge模式 host模式 创建自定义网络(自定义IP) 网络相关 IP 子网掩码 网关 DNS 端口号 子网掩码 互联网是由许多小型网络构成的&#xff0c;每个网络上都有许多主机&#xff0c;这样便构成了一个有层次的结构。 IP 地…

新品发布 | 思腾合力深思系列「IW4235-4GRc」4U机架式高性能服务器

新品发布 | 思腾合力深思系列「IW4235-4GRc」4U机架式高性能服务器 Sitonholy 思腾合力 2024-01-17 17:35 发表于北京 采用第4/5代Intel Xeon 可扩展处理器 4U标准的机架式高性能服务器 极致性能提升 支持第4/5代Intel Xeon 可扩展处理器&#xff0c;CPU 3 UPI性能高达16 GT/s…

重置aws上的ssh默认登录端口

aws上的ec2机器&#xff0c;默认ssh的登录都是22&#xff0c;为了防止被黑&#xff0c;记录下修改该默认端口的方法 修改/etc/ssh/sshd_config文件,将Port 22注释去掉在上面的文件中&#xff0c;加入一行&#xff0c;你想要增加的端口号&#xff0c;格式和22一致注意&#xff1…

云原生场景下,AIGC 模型服务的工程挑战和应对

作者&#xff1a;徐之浩、车漾 “成本”、“性能”和 “效率”正在成为影响大模型生产和应用的三个核心因素&#xff0c;也是企业基础设施在面临生产、使用大模型时的全新挑战。AI 领域的快速发展不仅需要算法的突破&#xff0c;也需要工程的创新。 大模型推理对基础设施带来…

2024.1.18每日一题

LeetCode 2171.拿出最少数目的魔法豆 2171. 拿出最少数目的魔法豆 - 力扣&#xff08;LeetCode&#xff09; 题目描述 给定一个 正整数 数组 beans &#xff0c;其中每个整数表示一个袋子里装的魔法豆的数目。 请你从每个袋子中 拿出 一些豆子&#xff08;也可以 不拿出&a…