用js代码实现贪吃蛇小游戏

js已经学了大部分了,现在就利用我所学的js知识试试做贪吃蛇小游戏吧

以下部分相关图片以及思路笔记均出自渡一陈老师的视频

首先制作简单的静态页面,添加贪吃蛇移动的背景和相关图片,比如开始游戏等等

将各个功能均封装在函数中,利用主函数调用分函数会使结构更清晰

初始化游戏

初始化地图

地图坐标

 

  //1.初始化地图for(let i=0;i<tr;i++){for(let j=0;j<td;j++){gridData.push({x:j,y:i})}}

绘制蛇

  • 在游戏相关配置文件(js文件)中定义蛇的身体大小,以及蛇的相关位置信息(位置坐标,对应身体还是头部标志,身体元素相关元素标签)
  • 在index.js文件中遍历snake的位置信息,若domContent(身体元素相关元素标签)为空,就添加元素标签,给标签设置定位,并设置每个元素的left和top为身体大小*x或者*y,并且判断身体元素是蛇头还是身体,是蛇头就添加蛇头的背景,是身体就添加背景颜色并设置圆角边框
  • 判断是否第一次创建蛇后,在容器中append创建的元素
// 蛇的身体大小
let snakeBody=20
// 蛇相关的配置信息
let snake={// 蛇的初始位置snakePos:[//domContent为蛇的相应dom元素 flag根据身体还是蛇头分别渲染{x:0,y:0,domContent:"",flag:'body'},{x:1,y:0,domContent:"",flag:'body'},{x:2,y:0,domContent:"",flag:'body'},{x:3,y:0,domContent:"",flag:'head'}]
}
/***绘制蛇的方法*  @param {*} snake* */
function drawSnake(snake){for(let i=0;i<snake.snakePos.length;i++){if(!snake.snakePos[i].domContent){// 如果进入此if,说明是第一次创建蛇snake.snakePos[i].domContent=document.createElement("div")snake.snakePos[i].domContent.style.position="absolute"snake.snakePos[i].domContent.style.width=snakeBody+"px"snake.snakePos[i].domContent.style.height=snakeBody+"px"snake.snakePos[i].domContent.style.left=snake.snakePos[i].x*snakeBody+"px"snake.snakePos[i].domContent.style.top=snake.snakePos[i].y*snakeBody+"px"if(snake.snakePos[i].flag==='head'){// 说明当前是蛇头snake.snakePos[i].domContent.style.background=`url("../images/snake.png") center/contain no-repeat`}else{// 说明是蛇身snake.snakePos[i].domContent.style.background="#9ddbb1"snake.snakePos[i].domContent.style.borderRadius='50%'}}// 需要将创建的DOM元素添加到container 容器上面document.querySelector(".container").append(snake.snakePos[i].domContent)}
}

添加几个蛇身后效果如图所示:

绘制食物

  • 其过程和绘制蛇过程基本类似,先在配置文件中声明食物的相关配置信息,食物对象中不需要标志元素
  • 要求食物不可出现在蛇头蛇身以及container外面区域,生成随机数在while中循环无限循环,直到坐标符合条件退出循环,利用一个变量判断是否需要退出循环
  • 生成正确的坐标后,就创建一个新的变量,设置绝对定位,宽高,背景,最后append到container中,当然,要先判断food.domContent是否为空,为空才可创建,创建之后只是改变食物的位置,不会再继续创建元素,故设置食物的elft和top要在判断条件外执行
// 整个网格的行与列
const tr=30
const td=30// 食物相关的配置信息
let food={x:0,y:0,domContent:""
}function drawFood(){// 食物的坐标是随机的 但食物不可生成在蛇头 蛇身 以及container之外的区域while(true){// 构成一个死循环,直到生成符合要求的坐标才能退出该循环let isRepeat=false //默认生成的坐标符合要求// 随机生成一个坐标food.x=Math.floor(Math.random()*tr)food.y=Math.floor(Math.random()*td)// 查看坐标是否符合要求(遍历蛇)for(let i=0;i<snake.snakePos.length;i++){if(snake.snakePos[i].x===food.x&&snake.snakePos[i].y===food.y){// 进入此if 说明当前生成的食物坐标和蛇的位置冲突isRepeat=truebreak}}if(!isRepeat){break}}// 整个while 循环跳出之后,食物的坐标一定是OK的if(!food.domContent){food.domContent=document.createElement("div")food.domContent.style.width=snakeBody+"px"food.domContent.style.height=snakeBody+"px"food.domContent.style.position="absolute"food.domContent.style.background=`url("../images/food.png") center/contain no-repeat`document.querySelector('.container').append(food.domContent)}food.domContent.style.left=food.x*snakeBody+"px"food.domContent.style.top=food.y*snakeBody+"px"
}

绑定事件

  • 按下键盘的上下左右时,蛇会上下左右移动,此时要添加相关配置信息,明确新蛇头和旧蛇头之间的位置关系,在确定新的蛇头坐标时,会用一个对象和旧蛇头进行计算
  • 绑定事件keydown
  • 同时在蛇的相关配置信息中添加方向
// 要明确新的蛇头和旧的蛇头之间的位置关系
// 我们在确定新的蛇头坐标的时候,会那下面的对象和旧蛇头做一个计算const directionNum={left:{x:-1,y:0,flag:'left'},right:{x:1,y:0,flag:'right'},top:{x:0,y:-1,flag:'top'},bottom:{x:0,y:1,flag:'bottom'}
}
// 蛇相关的配置信息
let snake={// 蛇一开始移动的方向direction:directionNum.right,//一开始向右边移动// 蛇的初始位置snakePos:[//domContent为蛇的相应dom元素 flag根据身体还是蛇头分别渲染{x:0,y:0,domContent:"",flag:'body'},{x:1,y:0,domContent:"",flag:'body'},{x:2,y:0,domContent:"",flag:'body'},{x:3,y:0,domContent:"",flag:'head'}]
}
/*** 绑定事件*/function bindEvent(){document.addEventListener('keydown',function(e){// console.log(e.key)if(e.key==='ArrowUp'||e.key.toLocaleLowerCase()==='w'){// 用户按的是上snake.direction=directionNum.top}if(e.key==='ArrowDown'||e.key.toLocaleLowerCase()==='s'){// 用户按的是下snake.direction=directionNum.bottom}if(e.key==='ArrowLeft'||e.key.toLocaleLowerCase()==='a'){// 用户按的是左snake.direction=directionNum.left}if(e.key==='ArrowRight'||e.key.toLocaleLowerCase()==='d'){// 用户按的是右snake.direction=directionNum.right}snakeMove()})
}

移动蛇

  • 声明一个新蛇头,新蛇头对象中包含snakePos中的所有,移动时要将新蛇头添加至snake.snakePos中,将旧蛇头变为蛇身,即把flag变为body,并将其相关属性变为身体的属性,最后重新绘制蛇即可
  • 注意,蛇头会随着方向的变化而变化,在drawSnack中添加switch,若方向为上,蛇头逆时针旋转90deg,其余以此类推
  • 碰撞检测:声明一个判断对象,里面包含两个判断,一个为是否吃到食物,一个判断是否碰撞墙壁或者碰到蛇身
  • 碰到墙壁即为新蛇头的位置坐标越界,碰到蛇身即为判断新蛇头是否和蛇身位置坐标冲突,冲突就说明碰到自己,吃到东西则为新蛇头的坐标和食物的坐标一致,吃到食物之后就重新生成食物的位置坐标
  • 蛇整体移动的过程为:每次触发键盘事件,蛇头改变,旧蛇头变为蛇身,若吃到苹果,不删除最后一个蛇身,若没有吃到苹果,则删除最后一个蛇身,即为snake.snakePos[0].domContent。
/**** 碰撞检测*/
function isCollide(newHead){let collideCheckInfo={isCollide:false,//是否碰撞墙壁 蛇身isEat:false//是否吃到食物}// 1.检测是否碰到墙壁if(newHead.x<0||newHead.x>=td||newHead.y<0||newHead.y>=tr){collideCheckInfo.isCollide=truereturn collideCheckInfo}// 检测是是否碰到自己for(let i=0;i<snake.snakePos.length;i++){if(snake.snakePos[i].x===newHead.x&&snake.snakePos[i].y===newHead.y){collideCheckInfo.isCollide=truereturn collideCheckInfo}}// 检测是否吃到东西if(newHead.x===food.x&&newHead.y===food.y){collideCheckInfo.isEat=truescore++}return collideCheckInfo
}/*** 蛇的移动方法*/
function snakeMove(){let oldHead=snake.snakePos[snake.snakePos.length-1]// 根据方向计算出新的蛇头的坐标let newHead={domContent:"",x:oldHead.x+snake.direction.x,y:oldHead.y+snake.direction.y,flag:'head'}// 接下来我们首先要做碰撞检测// 看计算出来的蛇头有没有碰上食物let collideCheckResult=isCollide(newHead)if(collideCheckResult.isCollide){//进入此if 说明撞墙了window.confirm(`游戏结束,您当前的得分为${score}分,是否要重新开始游戏`)alert("撞墙了")}// 将旧的头修改为身体oldHead.flag='body'oldHead.domContent.style.background="#9ddbb1"oldHead.domContent.style.borderRadius="50%"snake.snakePos.push(newHead)// 判断是否吃到东西if(collideCheckResult.isEat){// 1.重新生成新的食物drawFood()}else{// 说明没有吃到食物// 移除最后一个元素document.querySelector(".container").removeChild(snake.snakePos[0].domContent)snake.snakePos.shift();//删除第一个元素}drawSnake(snake)
}
  • 当游戏开始时,要让蛇自动沿着当前方向移动,使用间歇函数定时器来决定蛇移动的速度
  • 给用户选择当游戏结束时,是继续游戏还是结束游戏,继续游戏就初始化游戏,结束游戏就取消键盘事件,并停止计时器
  • 游戏进行中若点击container区域就先暂停游戏,暂停游戏时,要用到事件委托,因为当用户点击确定重新开始游戏时,会将container里的内容重置,此时的绑定事件已经不存在了,通过父亲找到儿子进行相关操作可避免直接给儿子添加绑定事件的缺点,暂停游戏时记得清除定时器,开始时再打开

相关效果如下所示:

代码:

index.html

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><link rel="stylesheet" href="../css/index.css"><title>Document</title>
</head>
<body><!-- 整个游戏按钮 --><div class="container"><!-- 开始按钮 --><button class="startBtn"></button><!-- 暂停按钮 --><button class="pauseBtn"></button></div><script src="../js/config.js"></script><script src="../js/index.js"></script>
</body>
</html>

index.css

*{/* 去除内外边距 */margin: 0;padding: 0;
}
/* 整体游戏容器样式 */
.container {position: relative;display: flex;justify-content: center;align-items: center;width: 600px;height: 600px;background-color: #225675;border: 20px solid #7dd9ff;margin: 20px auto;
}
.container button {border: none;outline: none;
}
/* 开始按钮 */
.startBtn {width: 200px;height: 80px;background: url(../images/startGame.png) center/contain no-repeat;display: block;
}
/* 暂停按钮 */
.pauseBtn {width: 70px;height: 70px;background: url(../images/start.png) center/contain no-repeat;display: none;
}

index.js

/***绘制蛇的方法*  @param {*} snake* */
function drawSnake(snake){for(let i=0;i<snake.snakePos.length;i++){if(!snake.snakePos[i].domContent){// 如果进入此if,说明是第一次创建蛇snake.snakePos[i].domContent=document.createElement("div")snake.snakePos[i].domContent.style.position="absolute"snake.snakePos[i].domContent.style.width=snakeBody+"px"snake.snakePos[i].domContent.style.height=snakeBody+"px"snake.snakePos[i].domContent.style.left=snake.snakePos[i].x*snakeBody+"px"snake.snakePos[i].domContent.style.top=snake.snakePos[i].y*snakeBody+"px"if(snake.snakePos[i].flag==='head'){// 说明当前是蛇头snake.snakePos[i].domContent.style.background=`url("../images/snake.png") center/contain no-repeat`// 根据方向进行一个旋转switch(snake.direction.flag){case 'top':{snake.snakePos[i].domContent.style.transform=`rotate(-90deg)`break}case 'bottom':{snake.snakePos[i].domContent.style.transform=`rotate(90deg)`break}case 'left':{snake.snakePos[i].domContent.style.transform=`rotate(-180deg)`break}case 'right':{snake.snakePos[i].domContent.style.transform=`rotate(0deg)`break}}}else{// 说明是蛇身snake.snakePos[i].domContent.style.background="#9ddbb1"snake.snakePos[i].domContent.style.borderRadius='50%'}}// 需要将创建的DOM元素添加到container 容器上面document.querySelector(".container").append(snake.snakePos[i].domContent)}
}
function drawFood(){// 食物的坐标是随机的 但食物不可生成在蛇头 蛇身 以及container之外的区域while(true){// 构成一个死循环,直到生成符合要求的坐标才能退出该循环let isRepeat=false //默认生成的坐标符合要求// 随机生成一个坐标food.x=Math.floor(Math.random()*tr)food.y=Math.floor(Math.random()*td)// 查看坐标是否符合要求(遍历蛇)for(let i=0;i<snake.snakePos.length;i++){if(snake.snakePos[i].x===food.x&&snake.snakePos[i].y===food.y){// 进入此if 说明当前生成的食物坐标和蛇的位置冲突isRepeat=truebreak}}if(!isRepeat){break}}// 整个while 循环跳出之后,食物的坐标一定是OK的if(!food.domContent){food.domContent=document.createElement("div")food.domContent.style.width=snakeBody+"px"food.domContent.style.height=snakeBody+"px"food.domContent.style.position="absolute"food.domContent.style.background=`url("../images/food.png") center/contain no-repeat`document.querySelector('.container').append(food.domContent)}food.domContent.style.left=food.x*snakeBody+"px"food.domContent.style.top=food.y*snakeBody+"px"
}
/**** 碰撞检测* @param {*} newHead 新计算出来的蛇头坐标*/
function isCollide(newHead){let collideCheckInfo={isCollide:false,//是否碰撞墙壁 蛇身isEat:false//是否吃到食物}// 1.检测是否碰到墙壁if(newHead.x<0||newHead.x>=td||newHead.y<0||newHead.y>=tr){collideCheckInfo.isCollide=truereturn collideCheckInfo}// 检测是是否碰到自己for(let i=0;i<snake.snakePos.length;i++){if(snake.snakePos[i].x===newHead.x&&snake.snakePos[i].y===newHead.y){collideCheckInfo.isCollide=truereturn collideCheckInfo}}// 检测是否吃到东西if(newHead.x===food.x&&newHead.y===food.y){collideCheckInfo.isEat=truescore++}return collideCheckInfo
}
function move(e){console.log(e.key)if((e.key==='ArrowUp'||e.key.toLocaleLowerCase()==='w')&&snake.direction.flag!=="bottom"){// 用户按的是上snake.direction=directionNum.top}if((e.key==='ArrowDown'||e.key.toLocaleLowerCase()==='s')&&snake.direction.flag!=="top"){// 用户按的是下snake.direction=directionNum.bottom}if((e.key==='ArrowLeft'||e.key.toLocaleLowerCase()==='a')&&snake.direction.flag!=="right"){// 用户按的是左snake.direction=directionNum.left}if((e.key==='ArrowRight'||e.key.toLocaleLowerCase()==='d')&&snake.direction.flag!=="left"){// 用户按的是右snake.direction=directionNum.right}snakeMove()
}
/*** 蛇的移动方法*/
function snakeMove(){let oldHead=snake.snakePos[snake.snakePos.length-1]// 根据方向计算出新的蛇头的坐标let newHead={domContent:"",x:oldHead.x+snake.direction.x,y:oldHead.y+snake.direction.y,flag:'head'}// 接下来我们首先要做碰撞检测// 看计算出来的蛇头有没有碰上食物let collideCheckResult=isCollide(newHead)if(collideCheckResult.isCollide){//进入此if 说明撞墙了if(window.confirm(`游戏结束,您当前的得分为${score}分,是否要重新开始游戏`)){// 重新开始游戏document.querySelector('.container').innerHTML=`<!-- 开始按钮 --><button class="startBtn" style="display:none"></button><!-- 暂停按钮 --><button class="pauseBtn" style="display:none"></button>`score=0console.log(score)// gridData=[]snake={// 蛇一开始移动的方向direction:directionNum.right,//一开始向右边移动// 蛇的初始位置snakePos:[//domContent为蛇的相应dom元素 flag根据身体还是蛇头分别渲染{x:0,y:0,domContent:"",flag:'body'},{x:1,y:0,domContent:"",flag:'body'},{x:2,y:0,domContent:"",flag:'body'},{x:3,y:0,domContent:"",flag:'head'}]}food={x:0,y:0,domContent:""}console.log("已初始化")initGame()return// drawSnake(snake)}else {// 结束游戏document.removeEventListener('keydown',move)// console.log("取消")clearInterval(timerStop)return}// alert("撞墙了")}// 将旧的头修改为身体oldHead.flag='body'oldHead.domContent.style.background="#9ddbb1"oldHead.domContent.style.borderRadius="50%"snake.snakePos.push(newHead)// 判断是否吃到东西if(collideCheckResult.isEat){// 1.重新生成新的食物drawFood()}else{// 说明没有吃到食物// 移除最后一个元素document.querySelector(".container").removeChild(snake.snakePos[0].domContent)snake.snakePos.shift();//删除第一个元素}drawSnake(snake)
}/*** 初始化游戏方法*/
function initGame(){//1.初始化地图for(let i=0;i<tr;i++){for(let j=0;j<td;j++){gridData.push({x:j,y:i})}}// 2.绘制蛇drawSnake(snake)// 3.绘制食物drawFood()
}
function startGame(){timerStop=setInterval(function(){snakeMove()},time)
}
/*** 绑定事件*/function bindEvent(){// 1.键盘事件document.addEventListener('keydown',move)// 2.计时器自动调用蛇移动的方法startGame();// 3.点击整个容器的时候,可以暂停和重新开始游戏document.querySelector('.container').addEventListener('click',function(e){// 通过事件委托的形式,判断用户点击的是container还是暂停按钮if(e.target.className ==="container"){document.querySelector('.pauseBtn').style.display='block'clearInterval(timerStop)}else {document.querySelector('.pauseBtn').style.display='none'startGame()}})// 4.给暂停按钮绑定事件// 点击子元素事件,冒泡后也会触发父元素点击事件
//   document.querySelector('.pauseBtn').addEventListener('click',function(e){
//     e.stopPropagation()//   })
}
/*** 游戏的主方法*/
function main(){// 用户点击了开始游戏之后,再做后续工作document.querySelector('.startBtn').addEventListener('click',function(e){e.stopPropagation()document.querySelector('.startBtn').style.display="none"// 1.首先初始化游戏initGame()// 2.绑定事件bindEvent()})
}main()

config.js

// 游戏相关配置文件
let gridData=[]//存储地图对象
// 整个网格的行与列
const tr=30
const td=30
// 蛇的身体大小
let snakeBody=20// 要明确新的蛇头和旧的蛇头之间的位置关系
// 我们在确定新的蛇头坐标的时候,会那下面的对象和旧蛇头做一个计算const directionNum={left:{x:-1,y:0,flag:'left'},right:{x:1,y:0,flag:'right'},top:{x:0,y:-1,flag:'top'},bottom:{x:0,y:1,flag:'bottom'}
}// 蛇相关的配置信息
let snake={// 蛇一开始移动的方向direction:directionNum.right,//一开始向右边移动// 蛇的初始位置snakePos:[//domContent为蛇的相应dom元素 flag根据身体还是蛇头分别渲染{x:0,y:0,domContent:"",flag:'body'},{x:1,y:0,domContent:"",flag:'body'},{x:2,y:0,domContent:"",flag:'body'},{x:3,y:0,domContent:"",flag:'head'}]
}
// 食物相关的配置信息
let food={x:0,y:0,domContent:""
}
// 游戏分数
let score=0
// 停止计时器
let timerStop=null
// 计时器事件
let time=300

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

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

相关文章

react【实用教程】 搭建开发环境(2024版)Vite+React (官方推荐)

以项目名 reactDemo为例 1. 下载脚手架 在目标文件夹中打开命令行 npm create vite2. 安装项目依赖 cd reactDemo npm i若安装失败&#xff0c;则修改下载源重试 npm config set registry https://registry.npmmirror.com3. 启动项目 npm run dev4. 预览项目 浏览器访问 http…

iPhone 数据恢复软件 – 恢复丢失的 iPhone 数据

恢复丢失的 iPhone 数据&#xff0c;奇客数据恢复iPhone版。如今的 iPhone 用户在他们的设备上存储了大量数据&#xff0c;从照片和与亲人的文本对话到商业和医疗信息。其中一些是保密的&#xff1b;其中大部分内容都是非常个人化的&#xff1b;而且大多数一旦丢失就无法替代。…

vmware虚拟机内删除文件后宿主机空间不释放

问题描述 linux下&#xff0c;vmware内虚拟机删除文件&#xff0c;宿主机空间不释放&#xff0c;D盘快满了 解决方法 通过vmware-toolbox进行空间回收 安装 在虚拟机内操作 yum install -y open-vm-tools 清理 在虚拟机内操作 #查看磁盘的挂载点 sudo /usr/bin/vmware…

Agent AI智能体:塑造未来社会的智慧力量

&#x1f525; 个人主页&#xff1a;空白诗 文章目录 &#x1f916; Agent AI智能体&#xff1a;塑造未来社会的智慧力量&#x1f3af; 引言&#x1f331; 智能体的未来角色预览&#x1f4bc; 行业革新者&#x1f31f; 创意合作者&#x1f6e1;️ 公共安全与环保&#x1f680; …

鸿蒙 Next 模拟器 体验

参加华为社区相关Next 的活动&#xff0c;只要申请通过就可以下载模拟器。整个过程稍微慢些&#xff0c;大家可以根据活动相关信息&#xff0c;加入微信群。跟踪催促进度。争取早日体验 next 。 目前模拟器里边还是空空的&#xff0c;没有什么内置 APP &#xff0c;但是足够大…

FTP-自用

一、登录 1、ftp服务器搭建 liunx&#xff1a;FTP服务器的搭建&#xff08;Linux&#xff09;_linux搭建ftp服务器-CSDN博客windows&#xff1a;搭建FTP服务器_ftp服务器搭建-CSDN博客 2、连接ftp服务器 ftp ip地址ftp 域名 注&#xff1a;长时间不操作自动退出 二、常用命…

重生奇迹MU获取宝石方法

1、商城&#xff1a;商场分为钻石商城和绑钻商城&#xff0c;钻石是直接充值的&#xff0c;绑钻是系统赠送的&#xff0c;两个地方所出售的道具都不一样&#xff0c;绑钻不能在钻石商城中购买。钻石商城中有各个等级的宝石出售&#xff0c;越高级的钻石越贵&#xff0c;不建议平…

AI换脸原理(3)——人脸对齐介绍

人脸对齐简介 人脸对齐其实包含两个步骤:人脸关键点检测、人脸对齐,英文术语有facial landmark和face alignment,主要用于精确标识眉毛、眼睛、鼻子、嘴巴以及人脸轮廓等特征部位。不同数据集对于关键点的数量有不同的设定,最少的是标记5个关键点,通常包括两只眼睛的瞳孔…

Python 中 “yield“ 的不同行为

在我们使用Python编译过程中&#xff0c;yield 关键字用于定义生成器函数&#xff0c;它的作用是将函数变成一个生成器&#xff0c;可以迭代产生值。yield 的行为在不同的情况下会有不同的效果和用途。 1、问题背景 在 Python 中&#xff0c;“yield” 是一种生成器&#xff0…

css--控制滚动条的显示位置

各种学习后的知识点整理归纳&#xff0c;非原创&#xff01; ① direction属性 滚动条在左侧显示② transform:scaleY() 滚动条在上侧显示 正常的滚动条会在内容超出规定的范围后在区域右侧和下侧显示在有些不正常的需求下会希望滚动条在上侧和左侧显示自己没有想到好的解决方案…

美国硅谷裸机云大宽带服务器在哪些行业中应用最广泛?

美国硅谷裸机云大宽带服务器在视频流媒体、实时数据分析和金融交易等行业中应用最广泛。关于美国硅谷裸机云大带宽服务器的各行业应用&#xff0c;rak部落小编为您做出详细的阐述。 美国硅谷裸机云大宽带服务器因其结合了高性能物理服务器和大带宽网络连接的特点&#xff0c;成…

【影片欣赏】【指环王】【魔戒:双塔奇谋 The Lord of the Rings: The Two Towers】

2003年发行&#xff0c;Special Extended DVD Edition Part One 1. The Foundations of Stone 2. Elven Rope 3. The Taming of Smeagol 4. The Uruk-hai 5. The Three Hunters 6. The Burning of the Westfold 7. Massacre at the Fords of Isen 8. The Banishment of Eomer …

页面嵌套,界面套娃,除了用iframe,还有其他方式吗?

UIOTOS可以了解下&#xff0c;uiotos.net&#xff0c;通过连线来代替脚本逻辑开发&#xff0c;复杂的交互界面&#xff0c;通过页面嵌套轻松解决&#xff0c;是个很新颖的思路&#xff0c;前端零代码&#xff01; 蓝图连线尤其是独创的页面嵌套和属性继承技术&#xff0c;好家…

上海亚商投顾:沪指窄幅震荡 两市成交额跌破万亿

上海亚商投顾前言&#xff1a;无惧大盘涨跌&#xff0c;解密龙虎榜资金&#xff0c;跟踪一线游资和机构资金动向&#xff0c;识别短期热点和强势个股。 一.市场情绪 沪指昨日缩量震荡&#xff0c;深成指、创业板指小幅调整&#xff0c;黄白二线分化明显。合成生物概念反复活跃…

【数据结构】基于顺序表实现通讯录

世界会向那些有目标和远见的人让路。&#x1f493;&#x1f493;&#x1f493; 目录 •&#x1f319;说在前面 &#x1f34b;基于顺序表的通讯录 • &#x1f330;1.技术要点 • &#x1f330;2.通讯录流程设计 &#x1f34b;通讯录基本量设计 • &#x1f330;1.定义联系…

MySQL·内置函数

目录 函数 日期函数 案例1&#xff1a;创建一张表&#xff0c;记录生日 案例2&#xff1a;创建一个留言表 案例3&#xff1a;请查询在2分钟内发布的帖子 字符串函数 案例1&#xff1a; 获取emp表的ename列的字符集 案例2&#xff1a;要求显示exam_result表中的信息&am…

第二证券|为什么指数涨回来了钱没回来?

在a股市场上&#xff0c;常常会呈现指数涨回来了钱没回来的状况&#xff0c;呈现这种状况的原因如下&#xff1a; 1、大盘上涨是权重股所造成的 大盘上涨或许是受一些权重比较大的职业所影响&#xff0c;比方证券职业、钢铁职业、银行职业等等&#xff0c;这些职业的大涨&…

json-server的安装和使用

json-server介绍 json-server是可以把本地当做服务器&#xff0c;然后axios向本地区发送请求&#xff0c;并且不会出现跨域的问题&#xff0c;若是等不及后端数据&#xff0c;可以用这个模拟假数据 json-server安装及使用 【json-server网址】https://www.npmjs.com/package/…

不盖CNAS的证书就是无效的?证书哪些信息是“非必要”?

做设备校准的企业&#xff0c;大多数都是为了拿到仪器校准证书&#xff0c;而说起校准证书&#xff0c;很多人优先就是想到CNAS&#xff0c;CNAS作为校准行业重要的核心资质&#xff0c;无论是校准机构实力的证明&#xff0c;还是满足企业年审的需要&#xff0c;基本上都是关键…

OpenAI的搜索引擎要来了!

最近的报道和业界泄露信息显示&#xff0c;OpenAI正秘密研发一款新的搜索引擎&#xff0c;可能叫SearchGPT或Sonic&#xff0c;目标是挑战Google的搜索霸权。预计这款搜索引擎可能在5月9日即将到来的活动中正式亮相。 SearchGPT的蛛丝马迹 尽管OpenAI对SearchGPT尚未表态&…