【前端客栈】基于HTML、CSS、JavaScript的羊了个羊静态仿写页面小游戏

这篇具有很好参考价值的文章主要介绍了【前端客栈】基于HTML、CSS、JavaScript的羊了个羊静态仿写页面小游戏。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

🏜哈喽,大家好,我是小浪。前段时间羊了个羊火遍了大江南北,大家是否都通过第二关了呢?哈哈,没关系,既然通不过,那咋们不如自己来做一个这样的羊了个羊的仿写页面,学会了赶紧拿去在同学面前展示展示;OK,接下来,我们开始仿写这种游戏规则模式,写一个我们自己做出来的游戏——🍅果了个果🍅;

💡声明:本游戏只涉及到一个html文件+几张图片即可完成,不要配置其他任何的东西,如果你在寻找简单好运行的代码,那么本文将是您的不二之选。

【前端客栈】基于HTML、CSS、JavaScript的羊了个羊静态仿写页面小游戏

🌄那么,学习制作这个游戏之前,你需要掌握前端三剑客的相关知识点:前端客栈。

🎑如果你之前掌握了相关前端的知识点,或者你大概只需要获取这个游戏的源码,知道如何给这个游戏换换背景,换换图片等,那么你可以直接翻到本篇博客最后获取源码即可,每个地方的细节博主都描述的很清楚哈!

📲目录

一、大概游戏思想

二、具体实现方法及代码

三、运行结果展示

四、完整代码


一、大概游戏思想

📠我们要制作的游戏规则很简单,就是仿照羊了个羊的规则,选取三个相同的图片就可以进行消除,用来放置图片的格子我这里给的是七个,如果填满了七个格子还没有进行消除的话那么游戏就失败了,进行一个"游戏失败"的弹窗提示。

【前端客栈】基于HTML、CSS、JavaScript的羊了个羊静态仿写页面小游戏

🏟这里博主给的是20*20的方格,也就是可以放置四百个图片,那么图片太小的话我们不太看的清楚,这里我们可以设置成四个方格大小存放一张图片,那样就减少了存放图片的数量,同时游戏的界面也会更加好看,因为图片的尺寸要大一些,看起来也清楚许多。

二、具体实现方法及代码

首先我们需要创建一个坐标系:

        // 坐标系的创建
        let scene = document.querySelector(".scene");
        let obj = {};
        for (let i = 0; i < 20; i++) {
            for (let j = 0; j < 20; j++) {
                let block = document.createElement("div");
                block.className = "block";
                scene.appendChild(block);
                obj[j + "-" + i] = block;
            }
        }

设置背景:

可以根据自己的喜好来设置喜欢的背景颜色;

【前端客栈】基于HTML、CSS、JavaScript的羊了个羊静态仿写页面小游戏

设置整体坐标系大小:

        .scene {
            width: 500px;
            height: 500px;
            margin: 0 auto;
        }

设置每个格子:

        .block {
            width: 25px;
            height: 25px;
            float: left;
            position: relative;
        }

设置7个格子用来存放选择的卡片:

【前端客栈】基于HTML、CSS、JavaScript的羊了个羊静态仿写页面小游戏

        .choose {
            width: 357px;
            height: 51px;
            border-top: 1px solid red;
            border-left: 1px solid red;
            margin: 30px auto;

        }

注意这里用来存放卡片的格子我们首先构建的格子的上、左两条边的样式,还需要设置格子的右、下两条边的格式;

        .item {
            width: 50px;
            height: 50px;
            border-right: 1px solid red;
            border-bottom: 1px solid red;
            float: left;
            position: relative;

        }

设置卡片的样式:

        .card {
            width: 50px;
            height: 50px;
            background-color: rgb(23, 228, 43);
            position: absolute;
            left: 0;
            top: 0;
            border-bottom: 3px solid #1cd241;
            box-shadow: 0 0 3px #000;
            background-size: 70%;
            background-position: center;
            background-repeat: no-repeat;
            cursor: pointer;
        }

卡片的背景和底色我们都是可以调的,直接修改background-color:rgb()即可。

【前端客栈】基于HTML、CSS、JavaScript的羊了个羊静态仿写页面小游戏

创建卡片的代码:

       // 创建卡片
        let cardarr = []; //放置所有卡片的数组
        function draw(level = 1) {
            let posarr = [];
            for (let i = 0; i < 20; i++) {
                posarr.push([]);
                for (let j = 0; j < 20; j++) {
                    posarr[i][j] = 0;
                }
            }

            for (let i = level; i < 19 - level; i++) {
                for (let j = 1; j < 10; j++) {
                    if (Math.random() < 0.2 && check(i, j, posarr)) {
                        posarr[i][j] = 1;
                        posarr[i][18 - j] = 1;
                    }
                }

            }
            for (let i = 0; i < 20; i++) {
                for (let j = 0; j < 20; j++) {
                    if (posarr[i][j] === 1) {
                        let card = document.createElement("div");
                        card.className = "card";
                        card.style.zIndex = 10 - level;
                        obj[j + "-" + i].appendChild(card);
                        cardarr.push(card);
                        // if (level > 1) {
                        //     let mask = document.createElement("div");
                        //     mask.className = "mask";
                        //     mask.style.zIndex = 10 - level;
                        //     obj[j + "-" + i].appendChild(mask);
                        // }
                    }

                }

            }
        }

我们这里设置的七个格子,也就是图片的叠加层数是七层,既然有叠加,所以我们需要渲染叠加的遮罩;

       // 渲染遮罩
        function renderMask() {
            let masks = document.querySelectorAll(".mask");
            for (let i = 0; i < masks.length; i++)
                masks[i].parentNode.removeChild(masks[i]);
            for (let i = 0; i < cardarr.length; i++) {
                let item = cardarr[i];
                let rect = item.getBoundingClientRect();
                let { x, y } = rect;
                let one = document.elementFromPoint(x, y);
                let two = document.elementFromPoint(x + 49, y);
                let three = document.elementFromPoint(x, y + 49);
                let four = document.elementFromPoint(x + 49, y + 49);
                if (!(item.isSameNode(one) && item.isSameNode(two) && item.isSameNode(three) && item.isSameNode(four))) {
                    let mask = document.createElement("div");
                    mask.className = "mask";
                    mask.style.zIndex = getComputedStyle(cardarr[i]).zIndex;
                    cardarr[i].parentNode.appendChild(mask);
                }
                cardarr[i].index = i;
            }
        }

style中代码:

        .mask {
            width: 50px;
            height: 50px;
            background-color: #000000ae;
            position: absolute;
            left: 0;
            top: 0;
        }

图片渲染:

        // 图片渲染
        let imgarr = [];
        for (let i = 0; i < cardarr.length / 3; i++) {
            let n = Math.floor(Math.random() * 10);
            imgarr.push(n);
        }
        let allimg = [...imgarr, ...imgarr, ...imgarr];
        allimg.sort(function () {
            if (Math.random() > 0.5) {
                return 1;
            }
            else {
                return -1;
            }
        });
        for (let i = 0; i < cardarr.length; i++) {
            cardarr[i].style.backgroundImage = "url(" + allimg[i] + ".png)";
            cardarr[i].n=allimg[i];
        }

触发点击事件:

       // 点击事件
        let choosedarr = [];
        let items = document.querySelectorAll(".item");
        scene.onclick = function (e) {
            if (e.target.className === "card") {
                let item = e.target;
                // 删除页面的卡片
                item.parentNode.removeChild(item);
                // 从cardarr当中也去进行删除
                cardarr.splice(item.index, 1);
                if(cardarr.length===0){
                    alert("游戏成功");
                    location.reload();
                }
                // 重新绘制所有的遮罩
                renderMask();
                // 将当前被删除的卡片对象添加到choosedarr中
                if(choosedarr.length===7){
                    alert("游戏失败");
                    location.reload();
                }
                choosedarr.push(item);
                choosedarr.sort((a,b)=>a.n-b.n);
                let count={};
                for(let i=0;i<choosedarr.length;i++){
                    if(!count[choosedarr[i].n]){
                        count[choosedarr[i].n]=1;
                    }else{
                        count[choosedarr[i].n]+=1;
                    }
                }
                for(let i in count){
                    if(count[i]===3){
                        let length=choosedarr.length;
                        for(let j=0;j<choosedarr.length;j++){
                            if(choosedarr[j].n==i){
                                choosedarr.splice(j,1);
                                j--;
                            }
                        }
                    }
                }
                // 向item中添加卡片标签
                for(let i=0;i<items.length;i++){
                    items[i].innerHTML="";
                }
                for (let i = 0; i < choosedarr.length; i++) {
                    items[i].appendChild(choosedarr[i]);
                }
            }
        }

三、运行结果展示

整体样式:

【前端客栈】基于HTML、CSS、JavaScript的羊了个羊静态仿写页面小游戏

 消除展示:

【前端客栈】基于HTML、CSS、JavaScript的羊了个羊静态仿写页面小游戏

失败演示:

【前端客栈】基于HTML、CSS、JavaScript的羊了个羊静态仿写页面小游戏

四、完整代码

1、文件设置格式

把ylgy.html文件和10张图片都放到一个文件夹下面,注意图片的格式修改为数字.png;这样才能保证正常运行;

【前端客栈】基于HTML、CSS、JavaScript的羊了个羊静态仿写页面小游戏

如果你想修改图片的话,可以自行下载后放在该文件夹下面即可。

源码以及图片素材获取地址github:羊了个羊仿写页面;

源代码:

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>羊了个羊</title>
    <style>
        body {
            background-color: rgb(31, 146, 199);
        }

        .scene {
            width: 500px;
            height: 500px;
            margin: 0 auto;
        }

        .block {
            width: 25px;
            height: 25px;
            float: left;
            position: relative;
        }

        .choose {
            width: 357px;
            height: 51px;
            border-top: 1px solid red;
            border-left: 1px solid red;
            margin: 30px auto;

        }

        .item {
            width: 50px;
            height: 50px;
            border-right: 1px solid red;
            border-bottom: 1px solid red;
            float: left;
            position: relative;

        }

        .card {
            width: 50px;
            height: 50px;
            background-color: rgb(23, 228, 43);
            position: absolute;
            left: 0;
            top: 0;
            border-bottom: 3px solid #1cd241;
            box-shadow: 0 0 3px #000;
            background-size: 70%;
            background-position: center;
            background-repeat: no-repeat;
            cursor: pointer;
        }

        .mask {
            width: 50px;
            height: 50px;
            background-color: #000000ae;
            position: absolute;
            left: 0;
            top: 0;
        }
    </style>
</head>

<body>
    <div class="scene">
    </div>
    <div class="choose">
        <div class="item"></div>
        <div class="item"></div>
        <div class="item"></div>
        <div class="item"></div>
        <div class="item"></div>
        <div class="item"></div>
        <div class="item"></div>
    </div>
    <script>
        // 坐标系的创建
        let scene = document.querySelector(".scene");
        let obj = {};
        for (let i = 0; i < 20; i++) {
            for (let j = 0; j < 20; j++) {
                let block = document.createElement("div");
                block.className = "block";
                scene.appendChild(block);
                obj[j + "-" + i] = block;
            }
        }
        // 创建卡片
        let cardarr = []; //放置所有卡片的数组
        function draw(level = 1) {
            let posarr = [];
            for (let i = 0; i < 20; i++) {
                posarr.push([]);
                for (let j = 0; j < 20; j++) {
                    posarr[i][j] = 0;
                }
            }

            for (let i = level; i < 19 - level; i++) {
                for (let j = 1; j < 10; j++) {
                    if (Math.random() < 0.2 && check(i, j, posarr)) {
                        posarr[i][j] = 1;
                        posarr[i][18 - j] = 1;
                    }
                }

            }
            for (let i = 0; i < 20; i++) {
                for (let j = 0; j < 20; j++) {
                    if (posarr[i][j] === 1) {
                        let card = document.createElement("div");
                        card.className = "card";
                        card.style.zIndex = 10 - level;
                        obj[j + "-" + i].appendChild(card);
                        cardarr.push(card);
                        // if (level > 1) {
                        //     let mask = document.createElement("div");
                        //     mask.className = "mask";
                        //     mask.style.zIndex = 10 - level;
                        //     obj[j + "-" + i].appendChild(mask);
                        // }
                    }

                }

            }
        }
        for (let i = 7; i > 0; i--) {
            draw(i);
        }
        // 把多余的卡片删除
        let length = cardarr.length;
        for (let i = 0; i < length % 3; i++) {
            let card = cardarr.pop();
            card.parentNode.removeChild(card);
        }
        function check(i, j, posarr) {
            if (posarr[i][j - 1] || posarr[i - 1][j - 1] || posarr[i - 1][j] || posarr[i - 1][j + 1]) {
                return false;
            }
            else {
                return true;
            }
        }
        // scene.getboundingClientRect;
        // scene.isSameElement;
        // 渲染遮罩
        function renderMask() {
            let masks = document.querySelectorAll(".mask");
            for (let i = 0; i < masks.length; i++)
                masks[i].parentNode.removeChild(masks[i]);
            for (let i = 0; i < cardarr.length; i++) {
                let item = cardarr[i];
                let rect = item.getBoundingClientRect();
                let { x, y } = rect;
                let one = document.elementFromPoint(x, y);
                let two = document.elementFromPoint(x + 49, y);
                let three = document.elementFromPoint(x, y + 49);
                let four = document.elementFromPoint(x + 49, y + 49);
                if (!(item.isSameNode(one) && item.isSameNode(two) && item.isSameNode(three) && item.isSameNode(four))) {
                    let mask = document.createElement("div");
                    mask.className = "mask";
                    mask.style.zIndex = getComputedStyle(cardarr[i]).zIndex;
                    cardarr[i].parentNode.appendChild(mask);
                }
                cardarr[i].index = i;
            }
        }
        renderMask()
        // 图片渲染
        let imgarr = [];
        for (let i = 0; i < cardarr.length / 3; i++) {
            let n = Math.floor(Math.random() * 10);
            imgarr.push(n);
        }
        let allimg = [...imgarr, ...imgarr, ...imgarr];
        allimg.sort(function () {
            if (Math.random() > 0.5) {
                return 1;
            }
            else {
                return -1;
            }
        });
        for (let i = 0; i < cardarr.length; i++) {
            cardarr[i].style.backgroundImage = "url(" + allimg[i] + ".png)";
            cardarr[i].n=allimg[i];
        }
        // 点击事件
        let choosedarr = [];
        let items = document.querySelectorAll(".item");
        scene.onclick = function (e) {
            if (e.target.className === "card") {
                let item = e.target;
                // 删除页面的卡片
                item.parentNode.removeChild(item);
                // 从cardarr当中也去进行删除
                cardarr.splice(item.index, 1);
                if(cardarr.length===0){
                    alert("游戏成功");
                    location.reload();
                }
                // 重新绘制所有的遮罩
                renderMask();
                // 将当前被删除的卡片对象添加到choosedarr中
                if(choosedarr.length===7){
                    alert("游戏失败");
                    location.reload();
                }
                choosedarr.push(item);
                choosedarr.sort((a,b)=>a.n-b.n);
                let count={};
                for(let i=0;i<choosedarr.length;i++){
                    if(!count[choosedarr[i].n]){
                        count[choosedarr[i].n]=1;
                    }else{
                        count[choosedarr[i].n]+=1;
                    }
                }
                for(let i in count){
                    if(count[i]===3){
                        let length=choosedarr.length;
                        for(let j=0;j<choosedarr.length;j++){
                            if(choosedarr[j].n==i){
                                choosedarr.splice(j,1);
                                j--;
                            }
                        }
                    }
                }
                // 向item中添加卡片标签
                for(let i=0;i<items.length;i++){
                    items[i].innerHTML="";
                }
                for (let i = 0; i < choosedarr.length; i++) {
                    items[i].appendChild(choosedarr[i]);
                }
            }
        }


    </script>
</body>

</html>

🏖🏖OK,那么今天的前端知识分享就到这里啦,原来前端这么有意思,后续会持续更新,感谢关注;最近也是在做测开+Java方向的面试真题+投递链接,感兴趣的小伙伴可参考->

📑本专栏:大厂直通车!有任何问题可以下方VX联系到博主喔!!文章来源地址https://www.toymoban.com/news/detail-441696.html

到了这里,关于【前端客栈】基于HTML、CSS、JavaScript的羊了个羊静态仿写页面小游戏的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 前端随笔:HTML/CSS/JavaScript和Vue

    最近因为工作需要,需要接触一些前端的东西。之前虽然大体上了解过 HTML 、 CSS 和 JavaScript ,也知道 HTML 定义了内容、 CSS 定义了样式、 JavaScript 定义了行为,但是却没有详细的学习过前端三件套的细节。而最近的工作中需要使用 Vue ,并且想到未来的工作中使用 Vue 能够更

    2024年02月16日
    浏览(41)
  • [前端开发] 常见的 HTML CSS JavaScript 事件

    代码示例指路 常见的 HTML、CSS、JavaScript 事件代码示例 在 Web 开发中,事件是用户与网页交互的重要方式之一。通过事件,用户可以与页面元素进行交互,触发相应的功能或效果。本文将介绍常见的 HTML、CSS、JavaScript 事件,以及事件对象和事件代理的概念。 鼠标事件 鼠标事

    2024年02月19日
    浏览(54)
  • 前端:运用HTML+CSS+JavaScript实现拼图游戏

    前一段时间突然来了一个想法,就是运用前端知识实现一个拼图游戏,但是不知道具体怎样实现。今天,想到既然实现不了现实中我们看到的那种拼块,那么就用正方形来代替吧! 效果如下: 想到就是当小的图片块放到合适的位置上时,表示拼图完成。 1. 前端布局 运用cs

    2024年02月08日
    浏览(57)
  • 前端三剑客 HTML+CSS+JavaScript ② HTML相关概念

    他们这样形容我 是暴雨浇不灭的火                                                       —— 24.4.18 学习目标         理解                 HTML的概念                 HTML的分类                 HTML的关系                 HTML的语义化         应用

    2024年04月23日
    浏览(55)
  • 前端(html+css+javascript)作业--展现家乡的网页

    期末期间,老师布置了前端作业,现在放到这里,给各位同志参考。 桂平市是广西壮族自治区的一个美丽的城市,拥有丰富的历史文化和自然景观,属于贵港市管辖,那为什么是看起来是市级而不是县级,其实他就是个 市级县,比县大一些人口多一些就叫做市了。 此网页不

    2024年01月17日
    浏览(48)
  • 前端技术Html,Css,JavaScript,Vue3

    1.基本标签 2.文本格式化 3.链接 4.图片 5.无序列表 6.有序列表 7.表格 8.表单 1.选择器 2.文本和字体 3.链接 4.隐藏 5.定位position 6.浮动 7.对齐 8.图像 1.输出 2.函数 3.常用事件 4.DOM 5.改变Html 6.DOM 元素 (节点) 尾部创建新的 HTML 元素 (节点) - appendChild() 头部创建新的 HTML 元素 (节点)

    2024年02月13日
    浏览(50)
  • 建站系列(五)--- 前端开发语言之HTML、CSS、JavaScript

    建站系列(一)— 网站基本常识 建站系列(二)— 域名、IP地址、URL、端口详解 建站系列(三)— 网络协议 建站系列(四)— Web服务器之Apache、Nginx 建站系列(五)— 前端开发语言之HTML、CSS、JavaScript 建站系列(六)— 后端开发语言 建站系列(七)— 常用前后端框架

    2024年02月09日
    浏览(52)
  • 【前端】javascript+html+css 家具销售网站(代码+报告)

    👉博__主👈:米码收割机 👉技__能👈:C++/Python语言 👉公众号👈:测试开发自动化【获取源码+商业合作】 👉荣__誉👈:阿里云博客专家博主、51CTO技术博主 👉专__注👈:专注主流机器人、人工智能等相关领域的开发、测试技术。 整个网页在头部部分,定义了字符编码、

    2024年02月14日
    浏览(46)
  • Web前端大作业制作个人网页(html+css+javascript)

    🧑个人网页设计、🙋‍♂️个人简历制作、👨‍💼简单静态HTML个人网页作品、👨‍🏭个人介绍网站模板 、等网站的设计与制作。 ⭐个人网页设计网站模板采用DIV CSS布局制作,网页作品有多个页面,如 :个人介绍(文字页面)、我的作品(图片列表)、个人技能(图文页

    2024年02月10日
    浏览(53)
  • 前端面试:常见的HTML、CSS和JavaScript问题解答

    前端开发面试中,HTML、CSS和JavaScript是必考点。以下是常见的HTML、CSS和JavaScript问题的解答,希望能对前端开发者的面试有所帮助。 文档类型(doctype)的作用是什么? 文档类型用来告诉浏览器当前页面使用哪种HTML标准进行渲染。不同的HTML标准支持的标签和属性有所差异,因

    2024年02月08日
    浏览(73)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包