HTML5实现字母记忆配对游戏

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实例,即可开始游戏。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

《梦醒蝶飞:释放Excel函数与公式的力量》5.4 Match函数

5.4 Match函数 5.4.1 match函数的概念 MATCH函数是Excel中的一个查找和引用函数&#xff0c;它用于在数据表或数组中搜索指定项&#xff0c;并返回该项在数组中的相对位置。以下是MATCH函数的几个关键概念&#xff1a; 1)查找值&#xff08;Lookup Value&#xff09; 这是…

Web 权限管理最佳实践:如何提升用户满意度与应用安全性?

引言 在当今数字化时代&#xff0c;Web应用的功能和复杂性不断增加&#xff0c;用户对在线服务的期望也在不断提升。为了提供丰富的用户体验&#xff0c;许多Web应用需要访问用户的个人信息或设备功能&#xff0c;如地理位置、摄像头和麦克风等。这些权限访问在提升应用功能的…

移动Web开发实战内容要点!!!

移动web开发 目录 移动web开发 第一章、Web开发标准与网页网站制作介绍 1.1Web开发标准 1.2网页基本构成元素 第二章、Web开发技术基础 2.1HTML的主要特点&#xff1a; 2.2HTML基本知识 2.3CSS样式 2.4JavaScript 第三章、打造移动Web应用程序 3.1为什么Android会成…

AI-智能体基础设施

个性化记忆需要世界模型来协助构建 业界有一个精简的Agent表达公示&#xff0c;即&#xff1a;Agent大模型&#xff08;LLM&#xff09;记忆&#xff08;Memory&#xff09;主动规划&#xff08;Planning&#xff09;工具使用&#xff08;Tool Use&#xff09;。基于该公式&am…

植物大战僵尸杂交版v2.1最新直装版,苹果+安卓+PC+防闪退工具+修改工具+高清工具+通关存档整合包更新

今天我要和各位聊聊一款让全网疯狂的游戏——《植物大战僵尸杂交版》。这可不是简单的游戏&#xff0c;它可是让B站的UP主“潜艇伟伟迷”一夜成名的大作&#xff0c;让无数玩家为之疯狂的魔改神作&#xff01; 记得2009年&#xff0c;《植物大战僵尸》横空出世&#xff0c;那时…

单片机学习记录

一&#xff0c;单片机及开发板介绍 1&#xff0c;基本介绍 单片机&#xff0c;英文Micro Controller Unit&#xff0c;简称MCU内部集成了CPU、RAM、ROM、定时器、中断系统、通讯接口等一系列电脑的常用硬件功能单片机的任务是信息采集(依靠传感器)、处理(依靠CPU)和硬件设备(…

深度相机辅助导航避障(三):地面点云滤除

前面的章节介绍了坐标变换,以及如何设置深度相机的坐标变换。那就可以很直观从机器人的坐标系对深度相机扫描到的障碍物点云进行处理。 在实际应用中,机器人正确估计周围地形,对于道路的可通过性、路径规划和障碍物检测等方面都很重要。那么在获取深度相机点云数据后就得准…

Qt入门小项目 | 实现腾讯会议登陆界面

文章目录 一、手写代码实现腾讯会议登陆界面二、使用UI设计器实现腾讯会议登陆界面 一、手写代码实现腾讯会议登陆界面 使用Qt控件与布局实现腾讯会议登陆界面。 示例&#xff1a; loginInCode.h&#xff1a; #pragma once#include <QtWidgets/QDialog> #include <QV…

安装zabbix时报错Could not resolve host: mirrors.huaweicloud.com;Unknown error解决办法

目录 1、问题原因 2、解决办法 3、知识拓展 DNS的区别 DNS配置文件解析 域名解析过程 4、书籍推荐 当安装Zabbix server&#xff0c;Web前端&#xff0c;agent时出现&#xff1a; [rootsc-zabbix-server ~]# yum install zabbix-server-mysql zabbix-agent安装过程中会出…

Token详解

一&#xff1a;Token是什么 token是具有访问权限的令牌&#xff0c;其本质是一串字符串。 如何创建token 用户在登录页面&#xff0c;输入账号和密码能够成功登录后&#xff1b;由后端签发并返回 token作用 用来判断用户当前的登录状态&#xff0c;根据当前用户登录状态给…

OceanBase 4.X-2F1A 仲裁高可用方案初探

作者&#xff1a;郑增权&#xff0c;爱可生 DBA 团队成员&#xff0c;OceanBase 和 MySQL 数据库技术爱好者。 爱可生开源社区出品&#xff0c;原创内容未经授权不得随意使用&#xff0c;转载请联系小编并注明来源。 本文约 1500 字&#xff0c;预计阅读需要 5 分钟。 背景 对…

CS与MSF的权限互相传递/mimikatz抓取windows 2012明文密码

目录 CS和MSF的简单介绍 Metasploit Cobalt Strike 1、CS权限传递到MSF 2、MSF权限传递到CS 3、使用mimikatz抓取明文密码 通过修改注册表用户重新登录后抓取明文密码 今天的任务是两个 一个是CS与MSF的权限互相传递一个是抓取windows2012的明文密码 那就分别来完成 …

printf趣味代码,打印图案

文章目录 1.打印佛祖2.打印猫猫 (闪烁效果) 1.打印佛祖 #include <stdio.h>void budda_bless(){printf("///\n\ // _ooOoo_ //\n\ // o8888888o //\n\ // …

SpringBoot全局配置文件里的配置项

SpringBoot核心配置文件里可以配置的配置项&#xff0c;非常非常多&#xff01;Spring Boot Reference Guide靠后的附件里看到所有配置项和说明. 有关配置项&#xff0c;我们除了知道在哪里查询具体配置项以外&#xff0c;我们还应该知道一些细节知识点: ① SpringBoot给我们…

2024广东省职业技能大赛云计算赛项实战——集群部署GitLab

集群部署GitLab 前言 题目是这样的&#xff1a; 在Kubernetes集群中新建命名空间gitlab-ci&#xff0c;将GitLab部署到该命名空间下&#xff0c;Deployment和Service名称均为gitlab&#xff0c;以NodePort方式将80端口对外暴露为30880&#xff0c;设置GitLab服务root用户的密…

Python 高级编程:文件操作与错误处理

在前几篇文章中&#xff0c;我们介绍了Python的基本语法、函数和模块以及面向对象编程。这些知识对于大部分日常编程问题已经足够&#xff0c;但对于需要分析大数据的人来说&#xff0c;这些还不够。本章将介绍Python的文件操作以及错误处理与调试。 目录 文件操作读文件写文…

制造业采购堡垒机的四大必要性看这里!

制造业包括的行业广泛&#xff0c;与大家的生活息息相关&#xff0c;例如食品制造业、汽车制造业、纺织业、服装制造业等等。但大家对于制造业不是很了解&#xff0c;不知道制造业也是需要采购堡垒机的&#xff0c;今天我们就来聊聊制造业采购堡垒机的必要性。 制造业采购堡垒机…

node mySql 实现数据的导入导出,以及导入批量插入的sql语句

node 实现导出, 在导出excel中包含图片&#xff08;附件&#xff09; node 实现导出, 在导出excel中包含图片&#xff08;附件&#xff09;-CSDN博客https://blog.csdn.net/snows_l/article/details/139999392?spm1001.2014.3001.5502 一、效果 如图&#xff1a; 二、导入 …

AI商品图生成企业定制服务,广州这家公司走在了行业前头

&#x1f680; 最强AI绘图设计企业定制服务出炉 —— 触站A&#xff0c;智能艺术的革新者 &#x1f31f; &#x1f3a8; 触站AI&#xff0c;绘制未来的智能艺术 &#x1f3a8;在AI技术的浪潮中&#xff0c;触站AI以其前沿技术&#xff0c;为艺术与设计领域注入了新的活力。 &a…

【SkiaSharp绘图11】SKCanvas属性详解

文章目录 SKCanvas构造SKCanvas构造光栅 Surface构造GPU Surface构造PDF文档构造XPS文档构造SVG文档SKNoDrawCanvas 变换剪裁和状态构造函数相关属性DeviceClipBounds获取裁切边界(设备坐标系)ClipRect修改裁切区域IsClipEmpty当前裁切区域是否为空IsClipRect裁切区域是否为矩形…