js实现的彩虹汉诺塔游戏

news/2024/11/8 20:24:47 标签: javascript, 游戏, 开发语言

一个七层的汉诺塔,对应彩虹七色,选中每层来移动到对应塔柱。
在这里插入图片描述

javascript"><!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <title>彩虹汉诺塔游戏</title>
    <style>
        #game-container{display: flex; /* 使用Flexbox布局 */
            justify-content: center; /* 水平居中 */
            align-items: center; /* 垂直居中 */
            height: 100vh; /* 设置容器高度为视口高度 */
            margin: 0; /* 移除默认外边距 */}
        .pillar {
            display: inline-block;
            width: 100px; /* 设置柱子的宽度 */
            height: 300px; /* 设置柱子的高度 */
            background-color: #bcd; /* 设置柱子的背景颜色 */
            margin: 0 10px; /* 设置柱子之间的间隔 */
            display: flex; /* 使用Flexbox布局,使盘子垂直堆叠 */
            flex-direction: column; /* 盘子垂直堆叠 */
            justify-content: flex-end; /* 盘子底部对齐 */
            border: 2px solid black;
            position: relative;
            cursor: pointer;
        }
        .disk {
            width: 80px;
            height: 20px;
            position: absolute;
            left: 50%;
            transform: translateX(-50%);
            bottom: 0;
            cursor: pointer;
        }
        .selected {
            opacity: 0.5;
        }
    </style>
</head>
<body>
<div id="game-container">
    <div id="pillarA" class="pillar"></div>
    <div id="pillarB" class="pillar"></div>
    <div id="pillarC" class="pillar"></div>
    <div id="moves">0</div> <!-- 显示移动次数的元素 -->
</div>
<script>
    var selectedDisk = null;
    var moves = 0;
    var disks = [10,20,30,40,50,60,70]; // 盘子宽度
    var disksColor = ['#F00','#FF7F00','#FF0','#0F0','#0FF','#00F','#8B00FF']; // 七色彩虹
    var n = disks.length;
    function init() {
        disks.forEach(function(width, index) {
            var disk = document.createElement('div');
            disk.className = 'disk';
            disk.style.width = width + 'px';
            disk.style.backgroundColor = disksColor[index];
            disk.setAttribute('data-size', String(index + 1)); // 设置data-size属性,从"1"开始
            disk.style.bottom = (disks.length - disks.indexOf(width)) * 20 + 'px';
            document.getElementById('pillarA').appendChild(disk);
            disk.addEventListener('click', diskClick);
        });
        var pillars = document.querySelectorAll('.pillar');
        pillars.forEach(function(pillar) {
            pillar.addEventListener('click', pillarClick);
        });
    }
    function diskClick(event) {
        var disk = event.target;
        var pillar = disk.parentElement; // 获取盘子的父元素,即柱子
        var disksOnPillar = Array.from(pillar.children); // 获取柱子上的所有盘子

        // 找到柱子上的最顶层盘子(尺寸最小的)
        var topDisk = null;
        var minSize = Number.MAX_SAFE_INTEGER;
        disksOnPillar.forEach(function(disk) {
            var size = parseInt(disk.getAttribute('data-size'), 10);
            if (size < minSize) {
                minSize = size;
                topDisk = disk;
            }
        });
        // 检查点击的盘子是否是最顶层的盘子
        if (disk === topDisk) {
            if (!disk.classList.contains('selected')) {
                // 如果没有选中的盘子,则选中当前点击的盘子
                if (selectedDisk) {
                    selectedDisk.classList.remove('selected');
                }
                selectedDisk = disk;
                disk.classList.add('selected');
            } else {
                // 如果点击的是已经选中的盘子,则取消选中
                disk.classList.remove('selected');
                selectedDisk = null;
            }
        } else {
            // 如果点击的不是最顶层的盘子,则不做任何操作
            console.log("只能移动最顶层的盘子");
        }
    }
    function pillarClick(event) {
        if (!selectedDisk) return; // 如果没有选中的盘子,则不进行任何操作
        var targetPillar = event.target;
        // 确保目标是一个柱子并且不是当前选中盘子的父元素
        if (targetPillar.classList.contains('pillar') && selectedDisk.parentElement !== targetPillar) {
            var lastDisk = targetPillar.lastElementChild;
            // 检查移动是否合法(目标柱子上没有盘子,或者最顶端的盘子比选中的盘子大)
            if (!lastDisk || parseInt(lastDisk.style.width) > parseInt(selectedDisk.style.width)) {
                // 移动盘子到目标柱子
                targetPillar.appendChild(selectedDisk);
                // 更新盘子的位置
                selectedDisk.style.bottom = (targetPillar.childElementCount * 20) + 'px';
                selectedDisk.classList.remove('selected');
                selectedDisk = null;
                moves++;
                document.getElementById('moves').innerText = moves;
                checkWin();
            }
        }
    }
    function checkWin() {
        if (document.getElementById('pillarC').childElementCount === n) {
            setTimeout(function() {alert('恭喜完成!移动步数:' + moves + ',最优步数:' + (Math.pow(2, n)-1));}, 100);
        }
    }
    init();
</script>
</body>
</html>


http://www.niftyadmin.cn/n/5744391.html

相关文章

第六章:DNS域名解析服务器

第六章&#xff1a;DNS域名解析服务器 一、DNS简介 DNS是互联网商的一项服务&#xff0c;它作为将域名和IP地址相互映射的一个分布式数据库&#xff0c;能够使人更方便的访问互联网。DNS系统使用的网络查询&#xff0c;有监听的prot&#xff0c;端口为53域名可分为三大类&…

Java8新特性/java

1.lambda表达式 区别于js的箭头函数&#xff0c;python、cpp的lambda表达式&#xff0c;java8的lambda是一个匿名函数&#xff0c;java8运行把函数作为参数传递进方法中。 语法格式 (parameters) -> expression 或 (parameters...) ->{ statements; }实战 替代匿名内部类…

【论文阅读】火星语义分割的半监督学习

【论文阅读】火星语义分割的半监督学习 文章目录 【论文阅读】火星语义分割的半监督学习一、介绍二、联系工作3.1Deep Learning for Mars3.2 数据集可以分为三类&#xff1a;3.3 半监督学习 三、提出的火星图像分割数据集四、方法四、实验 S 5Mars: Semi-Supervised Learning …

【ArcGISPro】单次将自己建立的工具箱添加至Arcpy中

新建工具箱 添加至Arcpy中 调用刚添加的工具箱

将vscode的终端改为cygwin terminal

现在终端是默认的power shell&#xff0c;没有显示cygwin 接下来选择默认配置文件 找到cygwin的选项即可 然后提示可能不安全什么的&#xff0c;点是&#xff0c;就有了

智能量化投资:中阳模型的多维创新与前景

一、中阳智能模型在量化投资中的优势 在日益复杂的金融市场环境中&#xff0c;量化投资正逐步引领金融科技的潮流。中阳智能模型以其创新的数据处理和分析能力脱颖而出&#xff0c;依托先进的算法及大数据分析&#xff0c;建立起动态、精准的投资策略。这一模型的优势不仅表现…

PHP露营地管理平台小程序系统源码

⛺️【露营新风尚】露营地管理平台系统全攻略⛺️ &#x1f3d5;️一、露营热潮下的管理难题&#xff1a;如何高效运营露营地&#xff1f;&#x1f914; 随着露营文化的兴起&#xff0c;越来越多的人选择在大自然中享受宁静与自由。然而&#xff0c;露营地的管理却面临着诸多…

基于STM32的实时时钟(RTC)教学

引言 实时时钟&#xff08;RTC&#xff09;是微控制器中的一种重要功能&#xff0c;能够持续跟踪当前时间和日期。在许多应用中&#xff0c;RTC用于记录时间戳、定时操作等。本文将指导您如何使用STM32开发板实现RTC功能&#xff0c;通过示例代码实现当前时间的读取和显示。 环…