Web前端项目-拼图游戏【附源码】

news2024/11/26 22:22:31

拼图游戏

拼图游戏是一种经典的益智游戏,通过HTMLCSSJavaScript等前端技术的综合运用来实现;拼图游戏可以锻炼玩家的观察能力、空间认知能力和逻辑思维能力。游戏开始时,一张图片会被切割成多个小块,并以随机顺序排列在游戏区域内。玩家需要通过点击并拖拽小块来移动它们的位置,以恢复原始图片

运行效果:
在这里插入图片描述
在这里插入图片描述

一:index.html

<!DOCTYPE html>
<html>
<head>
<meta name="viewport" content="user-scalable=no, width=device-width, initial-scale=1, maximum-scale=1">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>拼图</title>
<link type="text/css" rel="stylesheet" href="css/mgame2.css" />
<script src="js/jquery.js"></script>
<script src="js/mgame2.js"></script>
</head>

<body>
<div class="cover">
    <div class="cover_bg"></div>
    <div class="cover_inner">
        <p style="margin-bottom: 10px;">
            <button class="startGame">开始游戏</button>
        </p>
        <p class="choice-level">
            <select>
                <option value="3">简单</option>
                <option value="4">中等难度</option>
                <option value="5">高难</option>
                <option value="6">令人发疯的</option>
                <option value="7">使人癫狂的</option>
            </select>
        </p>
    </div>
</div>
<div class="piece_container" points="1">
</div>
<div class="rule-description">
    <p>在10秒内完成拼图会有奖励的哦</p>
    <p>移动<span class="over-step">0</span></p>
    <p>用时<span class="over-time">0</span></p>
    <p><button>恢复</button></p>
</div>
</body>
</html>

二:mgame2.css

@charset "utf-8";
* {
  margin: 0;
  padding: 0;
}

body {
	font-family: "微软雅黑", "宋体", "黑体";
	font-size: 13px;
}

.piece_container {
	width: 320px;
    height: 310px;
	margin: auto;
    text-align: center;
    overflow: hidden;
}
.piece_container div {
    float: left;
    margin: 1px;
}

.cover {
    position: relative;
    z-index: 998;
}

.cover_bg {
    position: absolute;
    width: 100%;
    opacity: 0.7;
    z-index: 999;
    background: #000;
}
.cover_inner {
    position: absolute;
    z-index: 1000;
}

.rule-description {
    text-align: center;
}
.rule-description .over-time {
    color: red;
}
.rule-description p {
    text-align: center;
    margin: auto;
}
.rule-description .over-step {
    color: green;
}

三:mgame2.js

var points = 1,
    timeCount = 0,//设置起始游戏时间
    timer = null,
    stepCount = 0,
    level = 3;//规定拼图的方块数3*3或者4*4
var puzzleGame = function(){
    var square,sort=0;
    for(var i = 0; i < level; i++){
        for(var j = 0; j < level; j++){
            square = document.createElement("div");
            $(square).css({
                "width": 300/level,
                "height": 300/level,
                "background": "url(img/1.gif) no-repeat",
                "backgroundPosition": -j*300/level +"px "+(-i)*300/level + "px"
            })
            sort++;
            $(square).attr({
                "sort": sort//给各个小方格加上正确的顺序
            })
            $(".piece_container").append(square);
        }
    }
    init();
}
init = function(){
    var pageLeft = 0,
        pageTop = 0,
        getStartX = 0,
        getStartY = 0,
        floatLayer = "",
        getSort = "",
        getBkP="",
        nextCheck = "<button class='nextcheck'>下一关</button>",
        playAgain = "<button class='playagain'>再来一次</button>";
    //按下方格触发方法
    $("div[sort]").on("touchstart mousedown",function(e){
        e.preventDefault();
        if(floatLayer != ""){
            floatLayer.remove();
        }
        var getEvent = window.event || arguments.callee.caller.arguments[0];//获取触发事件的元素
        thisE = getEvent.target;//获取鼠标按下时的方格
        if(getEvent.changedTouches){//手机情况下
            if(getEvent.changedTouches.length == 1){
                var thisElement = getEvent.target;
                getSort = $(thisElement).attr("sort");//获取触摸时的元素的sort
                getBkP = $(thisElement).css("backgroundPosition");
                var getBkImg = $(thisElement).css("backgroundImage");

                var getPoints = parseInt($(thisElement).parents(".piece_container").attr("points"));
                floatLayer = $(document.createElement("div")).attr({"sort": getSort}).css({"backgroundPosition":getBkP, "backgroundImage": getBkImg, "position": "fixed", "width": 300/level,"height": 300/level});//创建浮层并加上样式

                //取得手指相对于文档的边距
                getStartX = getEvent.changedTouches[0].pageX;
                getStartY =  getEvent.changedTouches[0].pageY;

                pageLeft = $(thisElement).offset().left;
                pageTop = $(thisElement).offset().top;

                floatLayer.css({top: pageTop+1, left: pageLeft+1});
                floatLayer.appendTo("body");
            }
        }else {//电脑情况下
            var thisElement = getEvent.target;
            getSort = $(thisElement).attr("sort");//获取点击时的元素的sort
            getBkP = $(thisElement).css("backgroundPosition");
            var getBkImg = $(thisElement).css("backgroundImage");

            var getPoints = parseInt($(thisElement).parents(".piece_container").attr("points"));
            floatLayer = $(document.createElement("div")).attr({"sort": getSort}).css({"backgroundPosition":getBkP, "backgroundImage": getBkImg, "position": "fixed", "width": 300/level,"height": 300/level});//创建浮层并加上样式

            //取得手指相对于文档的边距
            getStartX = getEvent.pageX;
            getStartY =  getEvent.pageY;

            pageLeft = $(thisElement).offset().left;
            pageTop = $(thisElement).offset().top;

            floatLayer.css({top: pageTop+1, left: pageLeft+1});
            floatLayer.appendTo("body");
        }
        return true;
    })

    //移动手指或鼠标触发事件
    $(document).on("touchmove mousemove",function(e){
        e.preventDefault();
        //获取触发touchmove的对象
        var getEvent = window.event || arguments.callee.caller.arguments[0];
        if(getEvent.changedTouches){
            if(getEvent.changedTouches.length == 1){//确保只有一个手指
                //获取手指的位置
                var getCurrentX = getEvent.changedTouches[0].pageX;
                var getCurrentY = getEvent.changedTouches[0].pageY;
            }
        }else{
            //获取鼠标的位置
            var getCurrentX = getEvent.pageX;
            var getCurrentY = getEvent.pageY;
        }
        if(floatLayer){
            floatLayer.css({top: getCurrentY - (getStartY - pageTop), left: getCurrentX - (getStartX - pageLeft)});//决定图层的样式
        }
    })

    //手指离开触发事件
    $(document).on("touchend mouseup",function(e){
        e.preventDefault();
        var getEvent = window.event || arguments.callee.caller.arguments[0];//获取触发事件的元素
        if(floatLayer){
            //取得浮层的位置
            var getLayerX = floatLayer.offset().left;
            var getLayerY = floatLayer.offset().top;

            var layerValX = parseInt(getLayerX);
            var layerValY = parseInt(getLayerY);

            var layerCenterX = layerValX + floatLayer.width()/2;
            var layerCenterY = layerValY + floatLayer.height()/2;

            floatLayer.remove();//删除浮层
            var piece = $("div[sort]");
            for(var i=0; i<piece.length; i++){
                //取得每一个小方格的位置
                var getPieceX = $(piece[i]).offset().left;
                var getPieceY = $(piece[i]).offset().top;

                var pieceValX = parseInt(getPieceX);
                var pieceValY = parseInt(getPieceY);

                var pieceEndX = pieceValX+$(thisE).width();
                var pieceEndY = pieceValY+$(thisE).height();

                if(stepCount <= 40){//限制最多移动的步数
                    if((pieceValX < layerCenterX && pieceValY < layerCenterY) && (pieceEndX > layerCenterX && pieceEndY > layerCenterY)){
                        var getEndSort = $(piece[i]).attr("sort");//手指或鼠标松开时所在的方格
                        var getEndBkP = $(piece[i]).css("backgroundPosition");
                        if(getEndSort != getSort){//确定把浮层移动到了另外一个方格
                            stepCount++;
                            $(thisE).attr("sort",getEndSort).css("backgroundPosition",getEndBkP);
                            $(piece[i]).attr("sort",getSort).css("backgroundPosition",getBkP);
                            $(".over-step").text(stepCount);
                        }
                    }
                }else{
                    $("p.choice-level").remove();//移除选择关卡
                    $(".cover").find("button").remove();
                    $(".cover .cover_inner").prepend(playAgain);
                    $(".cover").show().css("opacity",1);
                    alert("真笨!都N步了,还弄不完???");
                    clearInterval(timer);
                    break;
                }
            }
            pageLeft = 0;
            pageTop = 0;
            getStartX = 0;
            getStartY = 0;
            floatLayer = "";
            getSort = "";
            getBkP = "";

            for(var i=0; i < piece.length; i++){//如果排序正确,继续往下执行!否则返回
                var getSortVal = parseInt($(piece[i]).attr("sort"));
                var number = i+1;

                if(getSortVal == number){
                    continue;
                }else{
                    return;
                }
            }
            if(timeCount <= 70){
                alert("♡♡♡♡♡♡大神!用时" + $(".rule-description .over-time").text() +"秒 "+"♡♡♡♡♡♡!我好崇拜你啊!");
                $(".cover").find("button.startGame").text("再来一次");

                $(".cover_inner button.startGame").remove();//移除开始游戏按钮
                $("p.choice-level").remove();//移除选择关卡
                //下一关
                if($(".nextcheck").length == 0){//如果没有下一关按钮,就加上一个
                    $(".cover .cover_inner").prepend(nextCheck);
                }
                if($(".playagain").length == 0){
                    $(".cover .cover_inner").prepend(playAgain);
                }

                $(".cover_inner button.playagain").one("touchstart click", function(){//再来一次
                    timeCount = 0;
                    stepCount = 0;
                    $(".rule-description .over-time").text(timeCount);
                    $(".rule-description .over-step").text(stepCount);
                    $(this).parents(".cover").animate({"opacity": 0},2000,function(){$(this).hide();});
                    setTimeout(upsetPiece, 2000);
                })

                if(!$._data($(".cover_inner button.nextcheck")[0], "events")){//判断是否绑定了事件,如果绑定了,就不再继续绑定
                    $(".cover_inner button.nextcheck").one("touchstart click", function(){
                        if(points == 10){//设定通关的关数
                            alert("你已经通关了。这个世界已经没有什么可以阻止你了!去做任何你想做的事情吧!");
                            return;
                        }
                        $(this).parents(".cover").animate({"opacity": 0},2000,function(){$(this).hide()});
                        points++;
                        timeCount = 0;
                        stepCount = 0;
                        $(".rule-description .over-time").text(timeCount);
                        $(".rule-description .over-step").text(stepCount);
                        $(".piece_container").attr("points", points);
                        $(".piece_container div[sort]").css("backgroundImage","url(img/" + points + ".gif)");//去掉上一关卡的样式,加上本关卡的样式
                        var cover2 = "<div id='white-cover' style='width: 100%; height: 100%; position: fixed; top: 0; left: 0; text-align: center'><h1 style='margin-top: 120px; opacity: 0.6; background: #fff; padding: 8px;'>请记住这张图,点击屏幕任意位置开始游戏</h1></div>"
                        $("body").append(cover2);
                        $("#white-cover").on("touchstart click", function(){
                            $(this).remove();
                            upsetPiece();
                        })
                        $(this).off("touchstart click");//解除点击事件,防止冒泡
                    })
                }
                $(".cover").show().css("opacity",1);
            }else{//时间过长则不能进入下一关
                alert("用这么长时间?太慢了!!等得我花都谢了!");
                $("p.choice-level").remove();
                $(".cover").find("button").remove();
                $(".cover .cover_inner").prepend(playAgain);
                $(".cover").show().css("opacity",1);
            }
            clearInterval(timer);
        }else{
            return;
        }
    })
}

//创建一个没有重复数字的随机数组,并打乱方格的顺序
function upsetPiece(){
    if(timeCount >= 0){
        timer = setInterval(setTime,1000);
    }
    var pieceArr = $(".piece_container div[sort]"),
        randomArr = [],//创建一个随机数数组
        bkPArr = [];//创建一个数组,用来存储每个方格背景的定位!

    //取得每个方格的背景元素的定位
    for(var i=0; i< pieceArr.length; i++){
        bkPArr.push($(pieceArr[i]).css("backgroundPosition"));
    }

    for(var i=0; i< pieceArr.length; i++){
        var random = Math.floor(Math.random()*(level*level+1));
        if(random != 0){
            if(randomArr.length == 0){
                randomArr.push(random);
            }else{
                var la = 0;
                for(var j=0; j < randomArr.length; j++){
                    if(randomArr[j] == random){
                        i--;
                        break;
                    }
                    la++;
                }
                if(la == randomArr.length){
                    randomArr.push(random);
                }
            }
        }else{
            i--;
            continue;
        }
    }

    //打乱方格的顺序
    for(var i=0; i<randomArr.length; i++){
        $(pieceArr[i]).css("backgroundPosition",bkPArr[parseInt(randomArr[i])-1]);
        $(pieceArr[i]).attr("sort",randomArr[i]);
    }
}

//倒计时方法
function setTime(){
    timeCount++;
    $(".rule-description .over-time").text(timeCount);
}

$(document).ready(function(){
    $(".cover_bg").css("height",$(document).height());//黑色背景高度
    $(".cover_inner").css({//将按钮放在屏幕中央
        "left": $(document).width()/2 - $(".cover_inner").width()/2,
        "top": $(document).height()/2 - $(".cover_inner").height()/2
    });

    //点击 开始按钮
    $(".cover_inner button.startGame").on("touchstart click", function(e){
        level = $(".choice-level").find("option:selected").val();
        puzzleGame();
        clearInterval(timer);
        $(this).parents(".cover").animate({"opacity": 0},2000,function(){$(this).hide();});

        var cover2 = "<div id='white-cover' style='width: 100%; height: 100%; position: fixed; top: 0; left: 0; text-align: center'><h1 style='margin-top: 120px; opacity: 0.5; background: #fff; padding: 8px;'>请记住这张图,点击屏幕任意位置开始游戏</h1></div>"
        $("body").append(cover2);
        $("#white-cover").on("touchstart click", function(){
            $(this).remove();
            upsetPiece();
        })
    })

    //恢复按钮
    $(".rule-description button").on("touchstart click",function(){
        clearInterval(timer);
        upsetPiece();
        timeCount = 0;
        stepCount = 0;
        $(".rule-description .over-time").text(timeCount);
        $(".rule-description .over-step").text(stepCount);
    })
})

注意:

由于博客字数限制,本篇文章所展示的代码并不全面(其实在导入一个jquery.js和图片就可以运行啦)。关于本项目的完整代码随后会上传资源(记得关注哦),大家可以自行去下载~ ~ ~

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

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

相关文章

脑白金咖啡首辆快闪咖啡车亮相上海,瞄准年轻健康饮品市场

近日&#xff0c;巨人集团旗下脑白金快闪咖啡车现身上海外滩BFC中心&#xff0c;这是继脑白金咖啡在上海地标建筑武康大楼开设快闪店以来&#xff0c;首次以咖啡车形式亮相大众视野。 据「TMT星球」了解&#xff0c;此次快闪活动为期一个月&#xff0c;与合作伙伴共同打造潮流…

Mac 开发vscode常用命令

1 打开vscode settting配置 commandshiftp 输入&#xff1a;Open User Setting 2

如何优雅的了解OpenHarmony-v4.1-Release的init启动流程

一、启动概述 在产品代码成功编译通过后&#xff0c;开始进行下一步的运行调测阶段&#xff0c;而运行调测第一步便需要了解系统的启动过程。对于 OpenHarmony 来说&#xff0c;系统启动流程如下&#xff1a; ---> uboot启动---> uboot启动内核---> 内核挂载根文件系…

深入理解@EnableAspectJAutoProxy的力量

个人名片 &#x1f393;作者简介&#xff1a;java领域优质创作者 &#x1f310;个人主页&#xff1a;码农阿豪 &#x1f4de;工作室&#xff1a;新空间代码工作室&#xff08;提供各种软件服务&#xff09; &#x1f48c;个人邮箱&#xff1a;[2435024119qq.com] &#x1f4f1…

怎么用AI绘画完成设计创作?

AI绘画工具为设计师提供了强大的功能和便利性&#xff0c;用AI绘画进行艺术创作能够使设计师能够更快地迭代和优化设计方案&#xff0c;提高设计效率。那么怎么用AI绘画完成设计创作? 要使用AI绘画完成设计创作&#xff0c;首先需要选择一个合适的工具。目前市场上有很多优秀的…

大话设计模式解读03-装饰模式

本篇文章&#xff0c;来解读《大话设计模式》的第6章——装饰模式。并通过C代码实现实例代码的功能。 注&#xff1a;第3~6章讲的是设计模式中的一些原则&#xff08;第3章&#xff1a;单一职责原则&#xff1b;第4章&#xff1a;开放-封闭原则&#xff1b;第5章&#xff1a;依…

吴恩达2022机器学习专项课程C2W3:2.26 机器学习发展历程

目录 开发机器学习系统的过程开发机器学习案例1.问题描述2.创建监督学习算法3.解决问题4.小结 误差分析1.概述2.误差分析解决之前的问题3.小结 增加数据1.简述2.增加数据案例一3.增加数据案例二4.添加数据的技巧5.空白创建数据6.小结 迁移学习1.简述2.为什么迁移学习有作用3.小…

考勤机如何选购

考勤机如何选购 选购目的&#xff1a;为强化管理&#xff0c;保证公司考勤工作顺利开展&#xff0c;拟在我司采用指纹识别技术进行员工考勤&#xff0c;如此可有效提升工作效率&#xff0c;而指纹识别考勤技术又是最为便捷、可靠且非侵入性的考勤方式。 指纹考勤…

Python Django 实现教师、学生双端登录管理系统

文章目录 Python Django 实现教师、学生双端登录管理系统引言Django框架简介环境准备模型设计用户认证视图和模板URL路由前端设计测试和部署获取开源项目参考 Python Django 实现教师、学生双端登录管理系统 引言 在当今的教育环境中&#xff0c;数字化管理系统已成为必不可少…

Hi3861 OpenHarmony嵌入式应用入门--点灯

本篇实现对gpio的控制&#xff0c;通过控制输出进行gpio的点灯操作。 硬件 我们来操作IO2&#xff0c;控制绿色的灯。 软件 GPIO API API名称 说明 hi_u32 hi_gpio_deinit(hi_void); GPIO模块初始化 hi_u32 hi_io_set_pull(hi_io_name id, hi_io_pull val); 设置某个IO…

一文教你使用sql快速查询1对多数据关系,生成一个多维数据!

本篇文章主要讲解&#xff1a;利用mysql的sql特性&#xff0c;实现对多表查询下&#xff0c;一个用户对应多条记录数据查询为一条数据并以列表形式显示的教程。 日期&#xff1a;2024年6月17日 作者&#xff1a;任聪聪 一、创建数据库表 创建test_a表&#xff0c;内容如下&…

Python 全栈系列250 数据流实践

说明 之前好几个企业都提过飞机在飞的时候换发动机的例子&#xff0c;来比喻变革是多么无奈和危险。还有的说法更直接&#xff1a;不变等死&#xff0c;变就是找死&#xff0c;总得选一样。 后来我自己的体会也差不多是这样&#xff0c;总有一些窘境让你抉择&#xff1a;是忽忽…

在Qt编写的exe或者dll中设置版本号

1.背景 在别人编写的exe或者动态库中&#xff0c;通过右键–》属性–》详细信息中&#xff0c;通常都有版本信息&#xff1a; 那我们自己编译出来的Qt程序&#xff0c;如何设置这些版本号呢&#xff1f; 2.解决方案 参考【.pro文件中设置版本等信息】&#xff0c;只要在工…

【完结】无代码网页爬虫软件——八爪鱼采集器入门基础教程

《八爪鱼采集器入门基础教程》大纲如下&#xff1a; 课程所提软件&#xff0c;八爪鱼采集器下载&#xff1a; 1.软件分享[耶]八爪鱼&#xff0c;爬取了几百条网站上的公开数据&#xff0c;不用学代码真的很方便。[得意]2.发现了一个很棒的软件&#xff0c;?不用学python也可…

【UEditorPlus】后端配置项没有正常加载,上传插件不能正常使用

接上文【UEditorPlus】后端配置项没有正常加载&#xff0c;上传插件不能正常使用_ueditor ruoyi vue后端配置项没有正常加载,上传插件不能正常使用!-CSDN博客 成功解决图片、视频上传问题后&#xff0c;当服务部署在公网时&#xff0c;会存在大文件无法正常上传的问题。 出现…

微软修复Wi-Fi驱动高危漏洞 影响Windows所有版本 可通过局域网发起攻击

微软修复 WiFi 驱动程序中的高危安全漏洞&#xff0c;该漏洞影响 Windows 所有版本&#xff0c;可以通过公共 WiFi 等发起攻击。如果攻击者能够接入到目标设备所处的网络中&#xff0c;则可以悄无声息完成攻击&#xff0c;不需要用户进行任何交互。 在本月例行安全更新中微软修…

比特币的共识协议

目录 前言 一、铸币交易 1.铸币权 2.铸币交易&#xff08;coinbase tx&#xff09; 3.输入和输出 二、小型的区块链 1.见下图所示 2.哈希指针 3.双花攻击 三、块头块身&#xff0c;全节点轻节点 1.块头(block head) 2.块身 3.全节点full node(fully validating node…

操作系统入门系列-MIT6.828(操作系统工程)学习笔记(六)---- 初窥操作系统启动流程(xv6启动)

系列文章目录 操作系统入门系列-MIT6.S081&#xff08;操作系统&#xff09;学习笔记&#xff08;一&#xff09;---- 操作系统介绍与接口示例 操作系统入门系列-MIT6.828&#xff08;操作系统工程&#xff09;学习笔记&#xff08;二&#xff09;----课程实验环境搭建&#x…

数据库系统概论(个人笔记)(第四部分)

数据库系统概论&#xff08;个人笔记&#xff09; 文章目录 数据库系统概论&#xff08;个人笔记&#xff09;4、中间的SQL4.1 连接表达式4.2 视图4.3 事务4.4 完整性约束4.5 SQL数据类型和模式4.6 SQL中的索引定义4.7 授权 4、中间的SQL 4.1 连接表达式 Join Expressions Join…

10.无代码爬虫软件做网页数据抓取流程——工作流程设置与数据预览

首先&#xff0c;多数情况下免费版本的功能&#xff0c;已经可以满足绝大多数采集需求&#xff0c;想了解八爪鱼采集器版本区别的详情&#xff0c;请访问这篇帖子&#xff1a;https://blog.csdn.net/cctv1123/article/details/139581468 八爪鱼采集器免费版和个人版、团队版下…