当前位置: 首页 > news >正文

天津做网站报价一个网站包括

天津做网站报价,一个网站包括,wordpress ssh,适合小学生摘抄的新闻2022年大家都玩过贪吃蛇小游戏#xff0c;控制一条蛇去吃食物#xff0c;然后蛇在吃到食物后会变大。本篇博客将会实现贪吃蛇小游戏的功能。 1.实现效果 2.整体布局 /*** 游戏区域样式*/ const gameBoardStyle {gridTemplateColumns: repeat(${width}, 1fr),gridTemplateRows: re…        大家都玩过贪吃蛇小游戏控制一条蛇去吃食物然后蛇在吃到食物后会变大。本篇博客将会实现贪吃蛇小游戏的功能。 1.实现效果 2.整体布局 /*** 游戏区域样式*/ const gameBoardStyle {gridTemplateColumns: repeat(${width}, 1fr),gridTemplateRows: repeat(${height}, 1fr),display: grid,border: 1px solid #000,width: 500px,height: 500px,backgroundColor: #488cfa };/*** 小蛇样式*/ const snakeBodyStyle (segment) ({gridRowStart: segment.y,gridColumnStart: segment.x,backgroundColor: green })/*** 食物样式*/ const foodStyle {gridRowStart: food.current.y,gridColumnStart: food.current.x,backgroundColor: red }div className{snake-game}div className{game-board} style{gameBoardStyle}{/*蛇身体*/}{snake.map((segment, idx) div key{idx} className{snake-body} style{snakeBodyStyle(segment)}/)}{/*食物*/}div className{food} style{foodStyle}/div/div/div 采用grid 布局整个游戏区域划分为width*height个小块小蛇身体的每一部分对应一小块食物对应一小块。 3.技术实现 a.数据结构 小蛇的数据结构是个坐标数组snake[0]是蛇头snake[snake.length-1]是蛇尾巴。snake[i].x表示第i块位置的x坐标snake[i].y表示第i块位置的y坐标。 食物的数据结构是坐标。 游戏区域是一个width*height的虚拟空间。 b.场景 一、小蛇如何移动以及移动方式 1. 通过设置监听键盘的上下左右事件来触发小蛇的移动。 2. 通过定时器实现小蛇沿着当前方向移动 // 移动方向上下左右 const directions [[0, -1], [0, 1], [-1, 0], [1, 0]]; // 当前移动方向 const [currentDirection, setCurrentDirection] useState(3);// 小蛇移动 function move() {const direction directions[currentDirection];// 更新上一次蛇尾巴lastTail.current {x: snake[snake.length - 1].x, y: snake[snake.length - 1].y};const head snake[0];// 移动小蛇将数组后移动for (let i snake.length - 1; i 0; i--) {snake[i].x snake[i - 1].x;snake[i].y snake[i - 1].y;}// 更新蛇头head.x direction[0];head.y direction[1];// 触发渲染setSnake([...snake]); }const [click, setClick] useState(0) // 设置键盘监听函数 useEffect(() {document.addEventListener(keydown, function (event) {const key event.key;if (key ArrowUp) {// 监听到了向上箭头键的按下操作setCurrentDirection(0)setClick((c)c1);} else if (key ArrowDown) {// 监听到了向下箭头键的按下操作setCurrentDirection(1)setClick((c)c1);} else if (key ArrowLeft) {// 监听到了向左箭头键的按下操作setCurrentDirection(2)setClick((c)c1);} else if (key ArrowRight) {// 监听到了向右箭头键的按下操作setCurrentDirection(3)setClick((c)c1);}}); }, [])/*** 设定定时器每1s向当前方向移动小蛇* 如果敲键盘或者吃到食物需要更新定时器* tips: 吃到食物更新是因为定时器晚执行可能会有并发问题*/ useEffect(() {console.log(click)move()const timer setInterval(() {move();}, 1000);return () {clearInterval(timer);}; }, [click, snake.length]); 二、游戏结束判断 1.游戏成功判断若无发生成新的食物则游戏成功 2.游戏失败判断若小蛇出边界或者小蛇撞到自己则游戏失败。 // 每次渲染后判断小蛇状态 useEffect(() {// 判断小蛇撞出边界if (head.x 0 || head.x width || head.y 0 || head.y height) {console.log(游戏失败)alert(出界游戏失败);reset();return;}// 判断小蛇撞到自己for (let i 1; i snake.length; i) {if (head.x snake[i].x head.y snake[i].y) {console.log(游戏失败)console.log(snake: JSON.stringify(snake))alert(撞到自己了游戏失败);reset();return;}}}) 三、食物生成以及吃食物操作 1.食物需要在区域内随机生成并且不能生成在小蛇身体上若无地方生成则游戏通关。 2.吃食物操作会增长小蛇的长度在小蛇的尾巴添加一截需要存储前一个路径的尾巴位置。 // 随机生成食物 function generateFood(snake) {const x Math.floor(Math.random() * width);const y Math.floor(Math.random() * height);// 如果蛇长等于宽高说明蛇占满了整个区域已成功if (snake.length width * height) {return null;}// 判断食物是否在蛇身上for (let node of snake) {if (node.x x node.y y) {// 重新生成食物return generateFood(snake);}}return {x, y}; }// 蛇尾巴 const lastTail useRef(null);// 每次渲染后判断小蛇状态 useEffect(() {const head snake[0];// 小蛇吃到食物if (head.x food.current.x head.y food.current.y) {console.log(eat food!)// 添加上次蛇尾巴let nTail {...lastTail.current};snake.push(nTail);lastTail.current nTail;// 重新生成食物food.current generateFood(snake);if (food.current null) {console.log(恭喜已通过)alert(恭喜已经通关);reset();return;}// 发起渲染console.log(newsnake: JSON.stringify(snake))setSnake([...snake]);return;} }); c.整体代码 const {useState, useRef, useEffect} require(react);const Snake ({width, height}) {// 移动方向上下左右const directions [[0, -1], [0, 1], [-1, 0], [1, 0]];// 当前移动方向const [currentDirection, setCurrentDirection] useState(3);// 初始小蛇const initialSnake [{x: 0, // pos xy: 0, // pos y}];// 蛇身体const [snake, setSnake] useState(initialSnake);// 食物const food useRef(null);// 初始化食物if (food.current null) {food.current generateFood(snake);}// 随机生成食物function generateFood(snake) {const x Math.floor(Math.random() * width);const y Math.floor(Math.random() * height);// 如果蛇长等于宽高说明蛇占满了整个区域已成功if (snake.length width * height) {return null;}// 判断食物是否在蛇身上for (let node of snake) {if (node.x x node.y y) {// 重新生成食物return generateFood(snake);}}return {x, y};}// 蛇尾巴const lastTail useRef(null);// 小蛇移动function move() {const direction directions[currentDirection];// 更新蛇尾巴lastTail.current {x: snake[snake.length - 1].x, y: snake[snake.length - 1].y};const head snake[0];for (let i snake.length - 1; i 0; i--) {snake[i].x snake[i - 1].x;snake[i].y snake[i - 1].y;}head.x direction[0];head.y direction[1];setSnake([...snake]);}// 游戏结束后重置function reset() {setSnake([...initialSnake]);setCurrentDirection(3);lastTail.current null;}// 判断是否游戏结束useEffect(() {const head snake[0];// 判断小蛇撞出边界if (head.x 0 || head.x width || head.y 0 || head.y height) {console.log(游戏失败)alert(出界游戏失败);reset();return;}// 判断小蛇撞到自己for (let i 1; i snake.length; i) {if (head.x snake[i].x head.y snake[i].y) {console.log(游戏失败)console.log(snake: JSON.stringify(snake))alert(撞到自己了游戏失败);reset();return;}}})// 判断是否吃到食物useEffect((){const head snake[0];// 小蛇吃到食物if (head.x food.current.x head.y food.current.y) {console.log(eat food!)// 添加上次蛇尾巴let nTail {...lastTail.current};snake.push(nTail);lastTail.current nTail;// 重新生成食物food.current generateFood(snake);if (food.current null) {console.log(恭喜已通过)alert(恭喜已经通关);reset();return;}// 发起渲染console.log(newsnake: JSON.stringify(snake))setSnake([...snake]);return;}})const [click, setClick] useState(0)// 设置键盘监听函数useEffect(() {document.addEventListener(keydown, function (event) {const key event.key;if (key ArrowUp) {// 监听到了向上箭头键的按下操作setCurrentDirection(0)setClick((c)c1);} else if (key ArrowDown) {// 监听到了向下箭头键的按下操作setCurrentDirection(1)setClick((c)c1);} else if (key ArrowLeft) {// 监听到了向左箭头键的按下操作setCurrentDirection(2)setClick((c)c1);} else if (key ArrowRight) {// 监听到了向右箭头键的按下操作setCurrentDirection(3)setClick((c)c1);}});}, [])/*** 设定定时器每1s向当前方向移动小蛇* 如果敲键盘或者吃到食物需要更新定时器* tips: 吃到食物由于定时器晚执行可能会用老的state覆盖*/useEffect(() {console.log(click)move()const timer setInterval(() {move();}, 1000);return () {clearInterval(timer);};}, [click, snake.length]);/*** 游戏区域样式*/ const gameBoardStyle {gridTemplateColumns: repeat(${width}, 1fr),gridTemplateRows: repeat(${height}, 1fr),display: grid,border: 1px solid #000,width: 500px,height: 500px,backgroundColor: #488cfa };/*** 小蛇样式*/ const snakeBodyStyle (segment) ({gridRowStart: segment.y,gridColumnStart: segment.x,backgroundColor: green })/*** 食物样式*/ const foodStyle {gridRowStart: food.current.y,gridColumnStart: food.current.x,backgroundColor: red }// 小蛇组成return (div className{snake-game}div className{game-board} style{gameBoardStyle}{/*蛇身体*/}{snake.map((segment, idx) div key{idx} className{snake-body} style{snakeBodyStyle(segment)}/)}{/*食物*/}div className{food}style{foodStyle}/div/div/div/) }export default Snake
http://www.yayakq.cn/news/2602/

相关文章:

  • 网站域名如何备案信息wordpress 耗时
  • 宁波免费网站建站模板手机创建微信公众号
  • 西安网站建设公司排行榜网站开发用什么写得比较好
  • 网站建设平台seo网络优化平台
  • 备案网站建设书哈尔滨做网站的价格
  • 网站优化技巧做电影网站放抢先版
  • flash网站设计师怎样新建网站
  • 可以自己做网站服务器不网站备案更改
  • 教做详情页的网站wordpress小工具编辑
  • 持续推进网站建设php做网站难么
  • 成都彩票网站建设重庆市建设工程安全管理信息网
  • 和镜像网站做友链环保局网站建设
  • WordPress修改网站背景网站建设 php 企业网站
  • 网站企业备案资料长治怎么做平台软件
  • 信息网站模板广东建设信息网安全员查询
  • 游戏网站建设计划书网站灰色 代码
  • 长春网站制作费用2022年近期重大新闻事件
  • 英文网站定制公司新余公司做网站
  • 旅游网站设计总结网站建设平台合同
  • 提高企业网站的访问率淘宝网站边上的导航栏怎么做
  • 建设网站需要注意什么问题营销策划方案范文
  • 购物网站中加减数目的怎么做苏州建站免费模板
  • 网站后台自动退出十堰优化网站哪家好
  • 华为官方网站大连开发区天气预报
  • 黄页大全18勿看2000网站网站开发团队简介
  • python做视频网站网站关键词排名提高
  • 做的好的公司网站洛阳建设银行网站
  • 上海网站原型设计移动互联网站开发
  • 企业门户网站登录知名网站排名
  • 福田做商城网站建设哪家效益快天津建筑工程公司有哪些