HTML5实现字母记忆配对游戏

news2024/11/18 20:20:42

HTML5实现字母记忆配对游戏

这个小游戏具有重新开始功能和难度设置功能。

“重新开始“按钮,点击它或完成一局游戏后,会自动开始新游戏。

下拉列表框,,难度设置,包含简单、中等和困难三个选项。

简单:8张卡片(4对)

中等:12张卡片(6对)

困难:16张卡片(8对)

运行界面:

源码如下:

<!DOCTYPE html>
<html lang="zh">
<head>
    <meta charset="UTF-8">
    <title>记忆配对游戏</title>
    <style>
        #gameBoard {
            display: grid;
            gap: 10px;
        }
        .card {
            width: 100px;
            height: 100px;
            background-color: #ddd;
            display: flex;
            justify-content: center;
            align-items: center;
            font-size: 24px;
            cursor: pointer;
        }
        .flipped {
            background-color: #fff;
        }
        #controls {
            margin-bottom: 20px;
        }
    </style>
</head>
<body>
    <h1>字母记忆配对游戏</h1>
    <!-- 游戏控制区 -->
    <div id="controls">
        <button onclick="restartGame()">重新开始</button>
        难度:
        <select id="difficulty" onchange="restartGame()">
            <option value="easy">简单</option>
            <option value="medium">中等</option>
            <option value="hard">困难</option>
        </select>
    </div>
    <!-- 游戏板 -->
    <div id="gameBoard"></div>

    <script>
        // 全局变量
        let cards = [];
        let flippedCards = [];
        let matchedPairs = 0;

        // 洗牌函数
        function shuffle(array) {
            for (let i = array.length - 1; i > 0; i--) {
                const j = Math.floor(Math.random() * (i + 1));
                [array[i], array[j]] = [array[j], array[i]];
            }
            return array;
        }

        // 创建游戏板
        function createBoard() {
            const gameBoard = document.getElementById('gameBoard');
            gameBoard.innerHTML = ''; // 清空游戏板
            const difficulty = document.getElementById('difficulty').value;
            
            // 根据难度设置游戏
            if (difficulty === 'easy') {
                cards = ['A', 'A', 'B', 'B', 'C', 'C', 'D', 'D'];
                gameBoard.style.gridTemplateColumns = 'repeat(4, 100px)';
            } else if (difficulty === 'medium') {
                cards = ['A', 'A', 'B', 'B', 'C', 'C', 'D', 'D', 'E', 'E', 'F', 'F'];
                gameBoard.style.gridTemplateColumns = 'repeat(4, 100px)';
            } else {
                cards = ['A', 'A', 'B', 'B', 'C', 'C', 'D', 'D', 'E', 'E', 'F', 'F', 'G', 'G', 'H', 'H'];
                gameBoard.style.gridTemplateColumns = 'repeat(4, 100px)';
            }

            // 洗牌并创建卡片元素
            const shuffledCards = shuffle(cards);
            shuffledCards.forEach((card, index) => {
                const cardElement = document.createElement('div');
                cardElement.classList.add('card');
                cardElement.dataset.cardValue = card;
                cardElement.dataset.index = index;
                cardElement.addEventListener('click', flipCard);
                gameBoard.appendChild(cardElement);
            });

            // 重置游戏状态
            matchedPairs = 0;
            flippedCards = [];
        }

        // 翻牌函数
        function flipCard() {
            if (flippedCards.length < 2 && !this.classList.contains('flipped')) {
                this.classList.add('flipped');
                this.textContent = this.dataset.cardValue;
                flippedCards.push(this);
                
                // 如果翻开了两张牌,检查是否匹配
                if (flippedCards.length === 2) {
                    setTimeout(checkMatch, 500);
                }
            }
        }

        // 检查匹配
        function checkMatch() {
            const [card1, card2] = flippedCards;
            if (card1.dataset.cardValue === card2.dataset.cardValue) {
                // 匹配成功
                matchedPairs++;
                if (matchedPairs === cards.length / 2) {
                    alert('恭喜你赢了!');
                }
            } else {
                // 匹配失败,翻回去
                card1.classList.remove('flipped');
                card2.classList.remove('flipped');
                card1.textContent = '';
                card2.textContent = '';
            }
            flippedCards = [];
        }

        // 重新开始游戏
        function restartGame() {
            createBoard();
        }

        // 初始化游戏
        createBoard();
    </script>
</body>
</html>

上面JS代码使用面向过程风格的版本,下面改为为使用面向对象风格的版本。源码如下:

<!DOCTYPE html>
<html lang="zh">
<head>
    <meta charset="UTF-8">
    <title>记忆配对游戏</title>
    <style>
        #gameBoard {
            display: grid;
            gap: 10px;
        }
        .card {
            width: 100px;
            height: 100px;
            background-color: #ddd;
            display: flex;
            justify-content: center;
            align-items: center;
            font-size: 24px;
            cursor: pointer;
        }
        .flipped {
            background-color: #fff;
        }
        #controls {
            margin-bottom: 20px;
        }
    </style>
</head>
<body>
 <h1>字母记忆配对游戏</h1>
    <div id="controls">
        <button id="restartBtn">重新开始</button>
        难度:
        <select id="difficulty">
            <option value="easy">简单</option>
            <option value="medium">中等</option>
            <option value="hard">困难</option>
        </select>
    </div>
    <div id="gameBoard"></div>

    <script>
        class MemoryGame {
            constructor() {
                this.cards = [];
                this.flippedCards = [];
                this.matchedPairs = 0;
                this.gameBoard = document.getElementById('gameBoard');
                this.restartBtn = document.getElementById('restartBtn');
                this.difficultySelect = document.getElementById('difficulty');
                this.restartBtn.addEventListener('click', this.restartGame.bind(this));
                this.difficultySelect.addEventListener('change', this.restartGame.bind(this));
                this.createBoard();
            }

            shuffle(array) {
                // 洗牌函数
                for (let i = array.length - 1; i > 0; i--) {
                    const j = Math.floor(Math.random() * (i + 1));
                    [array[i], array[j]] = [array[j], array[i]];
                }
                return array;
            }

            createBoard() {
                // 创建游戏板
                this.gameBoard.innerHTML = '';
                const difficulty = this.difficultySelect.value;
                if (difficulty === 'easy') {
                    this.cards = ['A', 'A', 'B', 'B', 'C', 'C', 'D', 'D'];
                    this.gameBoard.style.gridTemplateColumns = 'repeat(4, 100px)';
                } else if (difficulty === 'medium') {
                    this.cards = ['A', 'A', 'B', 'B', 'C', 'C', 'D', 'D', 'E', 'E', 'F', 'F'];
                    this.gameBoard.style.gridTemplateColumns = 'repeat(4, 100px)';
                } else {
                    this.cards = ['A', 'A', 'B', 'B', 'C', 'C', 'D', 'D', 'E', 'E', 'F', 'F', 'G', 'G', 'H', 'H'];
                    this.gameBoard.style.gridTemplateColumns = 'repeat(4, 100px)';
                }
                const shuffledCards = this.shuffle(this.cards);
                shuffledCards.forEach((card, index) => {
                    const cardElement = document.createElement('div');
                    cardElement.classList.add('card');
                    cardElement.dataset.cardValue = card;
                    cardElement.dataset.index = index;
                    cardElement.addEventListener('click', this.flipCard.bind(this));
                    this.gameBoard.appendChild(cardElement);
                });
                this.matchedPairs = 0;
                this.flippedCards = [];
            }

            flipCard(event) {
                const selectedCard = event.target;
                if (this.flippedCards.length < 2 && !selectedCard.classList.contains('flipped')) {
                    selectedCard.classList.add('flipped');
                    selectedCard.textContent = selectedCard.dataset.cardValue;
                    this.flippedCards.push(selectedCard);
                    if (this.flippedCards.length === 2) {
                        setTimeout(this.checkMatch.bind(this), 500);
                    }
                }
            }

            checkMatch() {
                const [card1, card2] = this.flippedCards;
                if (card1.dataset.cardValue === card2.dataset.cardValue) {
                    this.matchedPairs++;
                    if (this.matchedPairs === this.cards.length / 2) {
                        alert('恭喜你赢了!');
                    }
                } else {
                    card1.classList.remove('flipped');
                    card2.classList.remove('flipped');
                    card1.textContent = '';
                    card2.textContent = '';
                }
                this.flippedCards = [];
            }

            restartGame() {
                this.createBoard();
            }
        }

        // 实例化 MemoryGame 类
        const game = new MemoryGame();
    </script>
    </script>
</body>
</html>

在这个重构后的代码中,我们引入了一个MemoryGame类来管理游戏的状态和行为。在初始化游戏时,只需创建一个MemoryGame实例,即可开始游戏。

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

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

相关文章

【5G射频基本架构】

平台框架 平台演进及搭配 5G NR频谱 NSA/SA/ENDC

鸿蒙星河NEXT学习笔记

1.1 字符串 // 变量的存储和修改&#xff08;string number boolean&#xff09; // 1. 变量存储 // 1.1 字符串 string 类型 // 注意点1&#xff1a;字符串需要用引号引起来&#xff08;单引双引号&#xff09;字符串 "字符串" // 注意点2&#xff1a;存储的时候&a…

云计算基础技术

云计算基础技术概览 计算类产品主要提供算力&#xff0c;支持业务运行&#xff0c;例如网站、办公软件、数据分析等计算能力&#xff0c;目前典型的产品主要是虚拟化和容器&#xff0c;在公有云上的云主机本质也是虚拟机。网络类产品主要满足资源的网络连通性和隔离&#xff0c…

ChatGPT国内中文版镜像网站整理(2024/6/25)

一、国内外模型大对比 1.交互式对话测评 用同样一个问题问文言一心3.5模型和ChatGPT3.5模型&#xff0c;以下是得到的两个结果&#xff1a; 文言一心3.5模型的回答 文言一心的这个回答显然非常愚蠢&#xff0c;虽然回答了很长一段话&#xff0c;但是“一斤土豆的重量和土豆的…

学习记录698@基带传输和频带传输基础

还是在学习计算机网络物理层时遇到这些知识点&#xff0c;这里简单的记录一下&#xff0c;主要都是通信专业的知识 基带传输 信源发出的原始信号叫做基带信号&#xff0c;基带信号分为模拟基带信号与数字基带信号。基带信号一般是低频成分&#xff0c;适合在具有低通特性的有…

基于weixin小程序智慧物业系统的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;管理员管理&#xff0c;用户管理&#xff0c;员工管理&#xff0c;房屋管理&#xff0c;缴费管理&#xff0c;车位管理&#xff0c;报修管理 工作人员账号功能包括&#xff1a;系统首页&#xff0c;维修…

pycharm工具回退键调出

pycharm工具调出回退键。 View->Appearance->Toolbar,即可调出 调不出的可以使用快捷键&#xff1a;ctrlalt向左箭头 但是这个快捷键容易和电脑屏幕旋转冲突。可将电脑的快捷键关掉&#xff0c;即可。 ctrlalt向上箭头&#xff1a;将屏幕旋转到正常&#xff08;横向&am…

记录一个80端口被占用导致软件打不开的问题

今天有个电脑&#xff0c;安装完我们的软件后&#xff0c;在浏览器上面打不开。但是我看虚拟机里面的配置啥的都很正常&#xff0c;我感觉不是软件挂了&#xff0c;应该是系统哪里的配置出了问题&#xff0c;导致软件打不开。 跟做软件的联系了&#xff0c;他让我直接访问虚拟机…

SiLM59xx系列SiLM5991SHCG-DG 带有主动保护和高 CMTI 的单通道隔离门极驱动芯片

SiLM59xx系列SiLM5991SHCG-DG是一款单通道隔离驱动器&#xff0c;提供12A源电流和12A灌电流。主动保护功能包括退饱和过流检测、UVLO、隔离故障报警和 4A 米勒钳位。输入侧电源的工作电压为3V至5.5V&#xff0c;输出侧电源的工作电压范围为13V至30V。所有电源电压引脚都有欠压锁…

小窗口大魔力,实况窗服务实时掌控重要信息变化

移动互联网时代&#xff0c;各种以用户为中心的App如春笋般涌现&#xff0c;满足了用户在购物、导航、娱乐等不同场景下的需求&#xff0c;不同程度上丰富了用户的日常生活。然而&#xff0c;随着App种类的激增&#xff0c;用户在享受多样化服务的同时&#xff0c;也面临着多任…

【面试干货】final、finalize 和 finally 的区别

【面试干货】final、finalize 和 finally 的区别 1、final1.1 修饰类1.2 修饰方法1.3 修饰变量 2、finally3、finalize4、总结 &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收藏不迷路&#x1f496; 在Java编程语言中&#xff0c;final、finalize和finally都是关键…

flask的基本使用1

【 一 】Flask介绍 python 界的web框架 -Django&#xff1a;大而全&#xff0c;使用率较高 &#xff1a;https://github.com/django/django -FastAPI&#xff1a;新项目选择使用它&#xff1a;https://github.com/tiangolo/fastapi -flask&#xff1a;公司一些小项目使用它&a…

12.xss之js输出

12.xss之js输出 后台源码文件 输出的源码 输入1111之后能看到心中所爱 查看页面代码元素&#xff0c;1111在js中&#xff0c;如图所示&#xff1a; 接下来将这段代码复制出来进行编辑攻击代码 <script>$msx</script><script>alert("Xss"…

电阻屏和电容屏

目录 一、电阻屏 1.欧姆定律 2.电阻屏原理 &#xff08;1&#xff09;测量 X 坐标 &#xff08;2&#xff09;测量 Y 坐标 3.电阻屏数据 二、电阻屏 1.原理 2.电容屏数据 &#xff08;1&#xff09;Type A &#xff08;2&#xff09;Type B 3.电容屏的实验数据 一、…

Vue 学习之 axios

目录 执行安装命令&#xff1a;npm install axios 使用的时候导入 axios以data&#xff0c;params&#xff0c;headers传参方式的区别 axios封装 是一个基于 promise 的 网络请求库&#xff0c;作用于浏览器和 node.js 中。使用Axios可以在前端项目中发送各种方式的HTTP请求…

【redis】redis安装

1、安装前准备 1.1环境准备 VMware安装 参考博文&#xff1a;【VMware】VMware虚拟机安装_配置_使用教程_选择虚拟机配置选项,设置dvd镜像为 点击启动虚拟机-CSDN博客 安装centOS的linux操作系统 xshell xftp 参考博文&#xff1a;【Linux】Xshell和Xftp简介_安装_VMwar…

经验分享,免费商标查询网站

有时候想快速查询商标状况&#xff0c;官方网站比较慢&#xff0c;这里分享一个免费快速的网站。 网址&#xff1a;https://www.sscha.com/ 截图&#xff1a;

《Redis设计与实现》阅读总结-3

第 12 章 事件 Redis服务器是一个事件驱动程序&#xff0c;服务器需要处理两类事件&#xff1a;文件事件和时间事件 一、文件事件 1. 文件处理器&#xff1a;Redis基于Reactor模式开发了自己的网络事件处理器被称为文件处理器 文件事件处理器使用I/O多路复用程序来同时监听多…

vue 中监听生命周期事件

vue 中监听生命周期事件 常见的添加自定义事件的写法希望在子组件挂载时通知父组件在模板上监听组件生命周期vue3 生命周期事件吗&#xff1f;jsx 中如何监听生命周期事件呢&#xff1f;通过 vNode 操作 html vue3 父子组件的生命周期的执行顺序是怎样的&#xff1f;小结 vue2 …

Swift中的二分查找:全面指南

Swift中的二分查找&#xff1a;全面指南 简介 二分查找是计算机科学中的经典算法&#xff0c;被广泛用于在已排序的数组中高效地搜索目标值。与线性查找逐个检查每个元素不同&#xff0c;二分查找不断将搜索区间减半&#xff0c;因此在处理大数据集时要快得多。 在这篇博客中…