用JavaScript做一个拼图游戏

这篇具有很好参考价值的文章主要介绍了用JavaScript做一个拼图游戏。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

喜欢的可以复制下面完整代码查看效果在自己本地查看效果
实现难度:不算大,毕竟是小游戏
开发工具:html,css,js,jquery

版本更新

新增严谨模式判定(2023.06.04)

  1. 非严谨判定:数字按顺序排即可例:1,2,3,【空卡槽】,4,5,6,7,8
  2. 严谨判定:数字按顺序排,且空卡槽必须在最后一个卡位才算通关例:1,2,3,4,5,6,7,8,【空卡槽】

效果截图

用JavaScript做一个拼图游戏文章来源地址https://www.toymoban.com/news/detail-467304.html

完整代码



<!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>Document</title>
    <script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.6.4/jquery.min.js"></script>
    <link
        rel="stylesheet"
        href="https://cdnjs.cloudflare.com/ajax/libs/animate.css/4.1.1/animate.min.css"
    />
    <style>
        html,body{
            width: 100%;
            height: 100%;
            padding: 0;
            margin: 0;
            /* background-color: #000; */
            color: #424242;
        }
        body{
            padding: 20px;
            box-sizing: border-box;
        }
        *{
        }
        .main-outer{
        }
        .main{
            width: max-content;
            border: 8px solid #feffa3;
            box-shadow: 0 0 20px 0 #666;
        }
        .row{
            display: flex;
        }
        /* 卡位 */
        .col{
            width: 60px;
            height: 60px;
            line-height: 50px;
            border-radius: 2px;
            font-size: 20px;
            font-weight: 700;
            text-align: center;
            position: relative;
            border: 1px solid;
        }
        /* 卡位上的拼图 */
        .box{
            height: 100%;
            transition: .2s;
            cursor: pointer;
        }
        .col.red{
            color: #f34949;
            border-color: #f34949;
        }
        .col.red:hover .box{
            color: #fff;
            background: #f34949;
        }
        .col.blue{
            color: #6aabff;
            border-color: #6aabff;
        }
        .col.blue:hover .box{
            color: #fff;
            background: #6aabff;
        }
        
        .top-control{
            /* max-width: 400px; */
            font-size: 14px;
            font-weight: 700;
            padding-bottom: 30px;
        }
        .label{
            display: inline-block;
            width: 70px;
            text-align: right;
        }
        .status.active{
            color: #2f93f6;
        }
        .top-control>div{
            height: 50px;
            display: flex;
            align-items: center;
        }
        .top-control input{
            border: 1px solid #c7ecff;
            border-radius: 6px;
            padding: 2px 6px;
            height: 26px;
            outline: none;
        }
        .top-control input:focus,
        .top-control input:hover{
            border-color: #2ab7ff;
        }
        .button{
            margin-left: 10px;
            padding: 4px 12px;
            border: 1px solid #ccc;
            font-weight: 600;
            transition: .1s;
            display: inline-block;
            cursor: pointer;
        }
        .button:hover{
            color: #fff;
            background-color: #6aabff;
            border-color: transparent;
        }
        /* 提示 */
        .tip{
            color: #ccc;
            font-size: 12px;
        }
        /* 小标签 */
        .tag{
            border: 1px solid;
            padding: 2px 4px;
            font-size: 12px;
            box-shadow: 0 0 4px 0;
        }
        .top-control div .tip{
            margin-left: 4px;
        }
        .status-text.active{
            color: #fe8f8f;
        }
        .enter-text{
            color: #73aee1;
        }
        .enter-text.active{
            color: #fe8f8f;
        }
    </style>
</head>
<body>
    <!-- 控制器 -->
    <div class="top-control">
        <div>
            <span class="label">行:</span>
            <input class="row-input" value="3" type="number" min="3">
            <span class="tip row-val-tip"></span>
        </div>
        <div>
            <span class="label">列:</span>
            <input class="col-input" value="3" type="number" min="3">
            <span class="tip col-val-tip"></span>
        </div>
        <div class="status">
            <span class="label">状态:</span>
            <span class="status-text tag"></span>
            <span class="chang-button button">重置</span>
        </div>
        <div class="enter">
            <span class="label">模式判定:</span>
            <span class="enter-text tag"></span>
            <span class="enter-type-button button">切换并重置</span>
        </div>
        <span class="tip">
            非严谨判定:数字按顺序排即可
            <br/>
            (比如1,2,3,【空卡槽】,4,5,6,7,8)
            <br/>
            严谨判定:数字按顺序排,且空卡槽必须在最后一个卡位才算通关
            <br/>
            (比如1,2,3,4,5,6,7,8,【空卡槽】)
        </span>
    </div>
    <!-- 容器 -->
    <div class="main-outer">
        <div class="main"></div>
    </div>
</body>
<script>
    let maxVal = 20//最大输入限制
    let minVal = 3//最小输入限制
    $('.row-val-tip').html(`最小${minVal}行,最大${maxVal}`)
    $('.col-val-tip').html(`最小${minVal}列,最大${maxVal}`)

    let rowSize = 0 //行
    let colSize = 0 //列
    let counts = []// 生成卡位数字列表
    let messycounts = []// 使用的卡位列表
    let enterType = false//是否开启严谨判定

    run()
    $('.chang-button').click(function(){
        $('.main').html('')

        run()
    })

    // 切换判定依据
    $('.enter-text').html(enterType?'严格':'非严格')
    
    enterType ?$('.enter-text').addClass('active') :$('.enter-text').removeClass('active');
    
    $('.enter-type-button').click(function(){
        enterType = !enterType
        $('.enter-text').html(enterType?'严格':'非严格')
        
        enterType ?$('.enter-text').addClass('active') :$('.enter-text').removeClass('active');

        $('.chang-button').click()

    })
    
    function run(){
        rowSize = Number($('.row-input').val())
        colSize = Number($('.col-input').val())
        rowSize = rowSize>minVal?rowSize:minVal
        colSize = colSize>minVal?colSize:minVal
        rowSize = rowSize<maxVal?rowSize:maxVal
        colSize = colSize<maxVal?colSize:maxVal

        counts = Array(rowSize*colSize-1).fill(null).map((e, index)=>index+1)
        
        messycounts = [...counts]
        // 打乱卡位顺序
        messycounts.sort(()=>Math.random()-.5)
    
        Array(rowSize).fill(null).map((item, index)=>{
            const row = $('<div class="row"></div>')
            Array(colSize).fill(null).map((im, ix)=>{
                // ${index*colSize+ix+1} 序号
                const num = messycounts.shift()
                const box = $(`<div class="box" num="${num}">
                    ${num}
                </div>`)
                const col = $(`<div class="col blue" row="${index}" col="${ix}"></div>`)
                if(num){
                    box.appendTo(col)
                }else{
                    col.attr('isnull', '1')
                }
                col.appendTo(row)
            })
            row.appendTo($('.main'))
        })
        
        $('.status-text').html('未通过').removeClass('active')
    }
    // 拼图移动事件
    $(document).on('click', '.box', function(){
        const start = $(this).parent('.col')//当前点击卡位
        const startRow = Number(start.attr('row'))
        const startCol = Number(start.attr('col'))

        const target = $(`[isnull="1"]`)//目标卡位
        const targetRow = Number(target.attr('row'))
        const targetCol = Number(target.attr('col'))

        let flag = false
        // 同行
        if(startRow==targetRow){
            // 目标卡位上移1或下移1可以和当前点击卡位重合
            if((targetCol+1==startCol) || (targetCol-1==startCol)){
                flag = true
            }
        }
        // 同列
        if(startCol==targetCol){
            // 目标卡位左移1或右移1可以和当前点击卡位重合
            if((targetRow+1==startRow) || (targetRow-1==startRow)){
                flag = true
            }
        }
        if(flag){
            target.attr('isnull', '0')//目标卡位取消空标记
            start.attr('isnull', '1')//当前卡位添加空标记
            $(this).appendTo(target)//当前卡位的数据转移到目标卡位

            const nums = []
            $('.col .box').each((index, item)=>{
                nums.push($(item).attr('num'))
            })
            // 开启严谨判定后,空卡槽必须在最后一个格子
            if(enterType){
                $(`[isnull="1"]`).attr('row')==(rowSize-1) &&
                $(`[isnull="1"]`).attr('col')==(colSize-1) &&
                counts.join(',') == nums.join(',')&&

                $('.status-text').html('通过').addClass('active');
            }else{
                counts.join(',') == nums.join(',') &&

                $('.status-text').html('通过').addClass('active');
            }
        }
    })
</script>
</html>

到了这里,关于用JavaScript做一个拼图游戏的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • Python编写游戏——拼图游戏

    Python编写游戏需要用到pgzrun模块。但不能用pip install pgzrun进行安装,正确的库名是pgzero,pip install pgzero。  Python版本:Python 3.6.4或以上版本。 pgzrun模块以及一些Python自带的标准模块。 安装Python并添加到环境变量,pip安装需要的相关模块即可。 Python在各个领域都有着丰富的第

    2024年01月17日
    浏览(26)
  • 推荐一个可以提高生产力的在线游戏

    很久没推荐好玩的工具了,今天给家推荐一个非常有意思的游戏:Habitica Habitica除了是个游戏之外,居然还是一个生产力应用! 为什么说Habitica还是个生产力应用呢?因为它还可以帮助我们养成习惯! 通过Habitica,我们可以用它的每日目标和代办事项列表功能来跟踪和管理你

    2023年04月25日
    浏览(42)
  • 小学生python游戏编程4----拼图游戏

    主要内容是设计开发一个趣味拼图游戏,其功能是对加载的图片进行分割(如分割5×5矩阵或其他类型矩阵),上篇文章讲了,具体可看小学生python游戏编程3----拼图游戏-准备(https://blog.csdn.net/fqfq123456/article/details/127173684),把分隔的图片加载到游戏界面,随机打乱顺序,用户

    2023年04月10日
    浏览(31)
  • Qt实现简单拼图游戏

    自己简单实现了下拼图功能.本来开始只是想显示个图片的。 ![请添加图片描述](https://img-blog.csdnimg.cn/c71922e2babf4404bf2805129f13ff76.gif 提示:以下是本篇文章正文内容,下面案例可供参考 代码如下(示例): 代码如下(示例): 代码如下(示例): 代码如下(示例): 源码下载

    2024年02月12日
    浏览(34)
  • Java实战---拼图游戏

    目录 1:拼图游戏的介绍 2:实战演示 (1)整体的窗体搭建 (2)菜单的搭建 (3)加载图片 (4)图片顺序的打乱 (5)实现图片的移动以及可以创建一些快捷键 (6)点击事件的实现 3:拼图游戏完整代码的演示 Java实战拼图游戏,我大致分为六个部分。 (1)整体的窗体搭建

    2024年02月08日
    浏览(28)
  • Unity小游戏——迷你拼图

    拼图演示 资源:  链接:https://pan.baidu.com/s/1BGeSmRCO_WZRUyl3MxefGw  提取码:0n4a 排列拼图碎片,拼出最后的图案。可以点住碎片的任意位置拖动;点击\\\"重来\\\"按钮,可以回到最初状态重新开始。 有很多电脑游戏的原型来自于现实世界中的玩具,拼图游戏就是其中的一个代表。 本

    2024年02月14日
    浏览(32)
  • python小游戏 拼图小游戏设计与实现

    🔥 Hi,各位同学好呀,这里是L学长! 🥇今天向大家分享一个今年(2022)最新完成的毕业设计项目作品 python小游戏毕设 拼图小游戏设计与实现 (源码) 🥇 学长根据实现的难度和等级对项目进行评分(最低0分,满分5分) 难度系数:3分 工作量:3分 创新点:4分 游戏规则: 将图像

    2024年02月08日
    浏览(38)
  • 拼图小游戏(实现游戏主界面)(未连接数据库)

    基于IDEA,创建窗体进行游戏 默认的用户名和密码为:zhangsan,123                                         lisi,1234

    2024年01月16日
    浏览(38)
  • Java实现简单的登录,注册拼图游戏

    1.登录页面 点击验证码可更换验证码,点击查看密码可查看输入的密码 2.注册界面 点击注册即可以新用户身份进入游戏 注: 初始用户信息为 用户名:hangman 密码:123456 点击重置即可重新输入密码账号重新注册 3.游戏界面 按下键盘上下左右即可进行移动操作并计算移动的步数.

    2024年02月09日
    浏览(26)
  • 前端技术搭建拼图小游戏(内含源码)

    上周我们实通过前端基础实现了俄罗斯方块游戏,今天还是继续按照我们原定的节奏来带领大家完成一个拼图游戏,功能也比较简单简单,也是想借助这样一个简单的功能,然后来帮助大家了解我们JavaScript在前端中的作用, 在前面的文章当中我们也提及到我们在本系列的专

    2024年02月08日
    浏览(45)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包