整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:

手把手教大家编写贪吃蛇小游戏(前端:html+css+javascript)

始之前大家最好掌握前端最基本的一些语法如:html、css、javascript等课程知识点。

好吧!!!因为开发前端的东西无须安装任何开发工具,就算啥也不懂也没关系,那么赶紧瓜子花生板凳准备好快跟着老师来体验一下编程的魅力吧!:)

真实效果图如下:

程序思维

开发的大概思路是首先在Body中定义一个div作为容器,然后使用样式定义界面游戏场景,角色(贪吃蛇)以及食物,然后编写javascript脚本对游戏地图,角色以及食物进行初始化的渲染,再编写move函数完成蛇身移动,蛇身在移动的过程当中判断蛇头和蛇身是否重叠,促使蛇身增长,假如蛇头在移动的过程当中碰到身体的其它部位,或者超出地图编写视作游戏结束Game Over,当蛇身长度达到某个长度值我们可以设置通关条件可以增加移动速度。

废话不多说直接按步骤撸代码!!!

第一步:编写游戏地图/贪吃蛇/食物样式

第二步:定义初始化数据(并定义功能函数)

第三步:创建地图(函数)

第四步:创建/擦除蛇身(函数)

第五步:蛇身移动(函数)

第五步中调用的函数:吃到食物(函数)

由于是否吃到食物和控制方向函数都是蛇身移动过程当中需要反复调用,所以最后单独写成了独立函数在蛇身移动函数中调用,好了代码到此结束!最后大家可以来试试啦!

如果有小伙伴在编写代码过程当中碰到问题欢迎大家添加关注私信我来咨询,或找我获取录制的经典小游戏之贪吃蛇游戏录制的视频和代码。

或点击下面的“了解更多”,进入在线视频链接进行学习。好了感谢大家的观看再见!


家好,我是你们的章鱼猫。

扫雷大家都玩过吧,Windows 里面的经典游戏。我记得上初中那会,上计算机课,都是偷偷玩这个游戏,怀念呀。但是不得不说,扫雷相比纸牌难度还是大一点的,毕竟还要费一点脑子的。

今天要推荐的项目就是重温经典,只通过 HTML/CSS(没有任何 JavaScript)来实现的扫雷游戏。

这个游戏另外一个很有趣的地方就是,为了强调没有使用 JavaScript,扫雷游戏中的雷就是 JS,哈哈哈。

整个项目使用最核心的技术就是 CSS 里面的是 Space Toggle,感兴趣的同学可以了解一下哦。

通过如下网站可以试玩上面的扫雷游戏:

https://propjockey.github.io/css-sweeper/

更多项目详情请查看如下链接。

开源项目地址:

https://github.com/propjockey/css-sweeper

前言

CSS 中有这样一个模块:Motion Path 运动模块,它可以使元素按照自定义的路径进行移动。本文将为你讲解这个模块属性的使用,并且利用它实现我小时候电脑课经常玩的一个打字游戏:金山打字的《生死时速》。

Motion Path 使用教程

css中有这样一个模块:Motion Path ,它可以实现元素按不规则路径移动。

Motion Path模块包含 offset 的一系列属性,包括以下几个:

  • offset-path:设置元素运动路径;
  • offset-distance:控制当前元素基于 offset-path 运动的距离;
  • offset-anchor:定义元素在路径上移动时的锚点。 简单来说就是,运动元素可能不是一个点,那么就需要指定元素中的哪个点附着在路径上进行运动
  • offset-position:指定运动的初始位置;
  • offset-rotate:定义沿 offset-path 运动路径移动时元素的朝向;

1. offset-path

offset-path 属性可以取以下几个值来设置元素的运动路径:

  • ray()函数ray([<angle> && <size> && contain?]),设置以射线状路线偏移;
  • url()函数:用id选择器绑定页面内联SVG元素中任意图形元素的路径;
  • <basic-shape>:一些css的基本形状函数,例如:circle(), ellipse(), inset(), path(), polygon(), rect()等,对于可以设置position位置的circle(), ellipse(),如果没有设置position的话,就会应用offset-position的值;
  • box-edge:设置以相对的父元素的边缘为运动路径,例如设置content-box、border-box、fill-box等,可以设置按内容区的边缘还是边框边缘等;

看下面例子就懂了:

下面代码中ray射线运动是设置元素朝70度方向运动200px; 按svg路径运动是让电车以一个五角星的svg的路线运动; shape图形是让电车以polygon()绘制的菱形运动; box是在其父盒子边缘运动;

2. offset-distance

设置运动的距离,可以是值,也可以是百分比,例如设置0%处于初始位置,100%就是移动到路径的终点。所以一般实现元素按不规则路径移动,就是通过animation修改offset-distance实现的。

3. offset-anchor

设置元素的哪个点沿着路径运动,例如设置offset-anchor: center bottom为元素的底部中心点沿路径移动,其他就不多说了,使用方式和background-position一样。

4. offset-position

设置运动的起始位置,只能作用于可以设置position的路线.

例如 ray() 射线运动,可以设置起点位置,或者ellipse()、circle()等这些需要设置position的图形元素。而且如果在定义路径时已经写明了position的话,offset-position是不会生效的,例如circle(50% at 25% 25%)

5. offset-rotate

offset-rotate定义元素沿偏移路径定位时的方向,默认的话是元素角度会一直和运动路径的水平角度保持一致,当然你也可以自定义固定角度,或者反向显示元素(reverse)。

看下面例子就明白了:

游戏开发

1. 游戏简介

游戏开始后,警察在3秒后开始出动,如果警察抓到小偷(位置重合)即游戏失败。 你需要根据页面底部的对话正确输入单词,即可让小偷不断运动,拉开与警察的距离,如果在输入全部对话前没有被警察逮到,即闯关成功。

整个游戏其实实现起来很简单,只需要在设置offset路径动画的基础上加一点点细节就完成了。

2. 利用offset属性实现运动路径

找个svg在线编辑网站,设计一个用来当道路等路径path,然后将两个位置重合的元素设置相同的运动路径,即可实现警察和小偷的运动路线。

3. 实现警察追小偷

如何实现警察小偷你追我赶的情景呢?很简单,警察是一直在运动的,只要小偷不要一直运动,两者错开即可。

只需要利用animation-play-state: paused属性控制小偷运动暂停即可,如果你输入正确的字符,则设置为animation-play-state: running继续运动。

如何制作打字控制小偷移动的效果呢?

很简单,监听键盘输入即可,如果输入正确,则将此字符推入答案中,并设置小偷animation-play-state: running让他继续运动,延时一小段时间再设置为paused暂停。 答案和题目重合,并且答案设置为了蓝色,在答案尾部还利用step逐帧动画,方便体现打字的进度。因为输入时,输入空格也需要光标移动,所以一定要在答案元素上设置white-space: pre以保留空白符的所有空白。另外,为了使要输入的字符永远显示出来,我在推入答案时会使光标调用scrollIntoView()方法使其滚动到可视区。

js复制代码document.addEventListener('keydown', function (event) {
    const myinput = answer.textContent
    if (event.key === words[myinput.length]) {
        timer && clearTimeout(timer)
        answer.textContent = myinput + event.key
        thief.style.setProperty('--paused', 'running');
        document.querySelector('.show').scrollIntoView(true)
        timer = setTimeout(() => {
            thief.style.setProperty('--paused', 'paused');
        }, 400);
    }
});
setTimeout(() => {
    checkCollision()
    police.style['animation-play-state'] = 'running'
}, 2000);

4. 判断结果

如果做碰撞检测呢并显示结果呢?

碰撞检测其实很简单,只需要利用getBoundingClientRect()方法获取警察和小偷的定位,判断是否几乎重合即可。判断输赢的方式为:如果你在打完所有文字之前不被逮捕则闯关成功,否则闯关失败。

js复制代码// 碰撞检测
function checkCollision() {
    const policeRect = police.getBoundingClientRect()
    const thiefRect = thief.getBoundingClientRect()
    if (answer.textContent.length >= words.length) {
        showResult(true)
        return
    }
    if (Math.abs(policeRect.x - thiefRect.x) < 2 && Math.abs(policeRect.y - thiefRect.y) < 2) {
        showResult()
        return
    }
    requestAnimationFrame(checkCollision)
}
// 结局判断
function showResult(flag) {
    if (flag) {
        document.querySelector('.success').style.display = 'grid'
    } else {
        document.querySelector('.fail h1').textContent =
            `你被逮捕了!${document.querySelector(".timing").textContent}`
        document.querySelector('.fail').style.display = 'grid'
    }
}

最后

学如逆水行舟,不进则退~

作者:前端阿彬 链接:https://juejin.cn/post/7349752708386553910 来源:稀土掘金 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。