day50-Insect Catch Game(捉虫游戏)

news2025/1/21 15:31:40

50 天学习 50 个项目 - HTMLCSS and JavaScript

day50-Insect Catch Game(捉虫游戏)

效果

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

index.html

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Catch The Insect</title>
    <link rel="stylesheet" href="style.css" />
</head>

<body>
    <!-- 第一屏 -->
    <div class="screen">
        <h1>消灭昆虫游戏</h1>
        <button class="btn" id="start-btn">开始</button></button>
    </div>
    <!-- 第二屏 -->
    <div class="screen">
        <h1>你"最想消灭"的昆虫是什么?</h1>
        <ul class="insects-list">
            <li>
                <button class="choose-insect-btn">
                    <p>苍蝇</p>
                    <img src="http://pngimg.com/uploads/fly/fly_PNG3946.png" alt="fly">
                </button>
            </li>
            <li>
                <button class="choose-insect-btn">
                    <p>蚊子</p>
                    <img src="http://pngimg.com/uploads/mosquito/mosquito_PNG18175.png" alt="mosquito" />
                </button>
            </li>
            <li>
                <button class="choose-insect-btn">
                    <p>蜘蛛</p>
                    <img src="http://pngimg.com/uploads/spider/spider_PNG12.png" alt="spider" />
                </button>
            </li>
            <li>
                <button class="choose-insect-btn">
                    <p>蟑螂</p>
                    <img src="http://pngimg.com/uploads/roach/roach_PNG12163.png" alt="roach" />
                </button>
            </li>
        </ul>
    </div>
    <!-- 第三屏 -->
    <div class="screen game-container" id="game-container">
        <h3 id="time" class="time">时间: 00:00</h3>
        <h3 id="score" class="score">得分: 0</h3>
        <h5 id="message" class="message">
            你生气了吗? <br>
            你在玩一个不可能的游戏!!
        </h5>
    </div>

    <script src="script.js"></script>
</body>

</html>

style.css

@import url('https://fonts.googleapis.com/css?family=Press+Start+2P&display=swap');

* {
    box-sizing: border-box;
}

body {
    background-color: #516dff;
    color: #fff;
    font-family: 'Press Start 2P', sans-serif;
    height: 100vh;
    overflow: hidden;
    margin: 0;
    text-align: center;
}

a {
    color: #fff;
}

/* 标题 */
h1 {
    line-height: 1.4;
}

/* 按钮 */
.btn {
    border: 0;
    background-color: #fff;
    color: #516dff;
    padding: 15px 20px;
    font-family: inherit;
    cursor: pointer;
    outline: 0;
}

.btn:hover {
    opacity: 0.9;
}

/* 每块屏 */
.screen {
    /* 子元素竖直居中 */
    display: flex;
    flex-direction: column;
    align-items: center;
    justify-content: center;
    height: 100vh;
    width: 100vw;
    transition: margin 0.5s ease-out;
}

/* 向上隐藏 */
.screen.up {
    margin-top: -100vh;
}

/* 第二屏 昆虫容器 */
.insects-list {
    display: flex;
    flex-wrap: wrap;
    justify-content: center;
    list-style-type: none;
    padding: 0;
}

.insects-list li {
    margin: 10px;
}

/* 每一项昆虫 */
.choose-insect-btn {
    background-color: transparent;
    border: 2px solid #fff;
    color: #fff;
    cursor: pointer;
    font-family: inherit;
    width: 150px;
    height: 150px;
}

.choose-insect-btn:hover {
    background-color: #fff;
    color: aqua;
}

.choose-insect-btn:active {
    background-color: rgba(255, 255, 255, 0.7);
}

/* 图片 */
.choose-insect-btn img {
    width: 100px;
    height: 100px;
    object-fit: contain;
}

/* 第三屏 */
.game-container {
    /* 子绝父相,用于昆虫的定位 */
    position: relative;
}

/* 时间 分数 */
.time,
.score {
    position: absolute;
    top: 20px;
}

.time {
    left: 20px;
}

.score {
    right: 20px;
}

/* 结束语 默认隐藏 */
.message {
    line-height: 1.7;
    background-color: rgba(0, 0, 0, 0.5);
    width: 100%;
    padding: 20px;
    z-index: 100;
    text-align: center;
    /* 隐藏 */
    opacity: 0;
    position: absolute;
    top: 0;
    left: 50%;
    transform: translate(-50%, -150%);
    transition: transform 0.4s ease-in;
}

/* 显示 */
.message.visible {
    transform: translate(-50%, 150%);
    opacity: 1;
}

/* 昆虫 */
.insect {
    cursor: pointer;
    display: flex;
    align-items: center;
    justify-content: center;
    width: 100px;
    height: 100px;
    /* 绝对定位 */
    position: absolute;
    transform: translate(-50%, -50%) scale(1);
    transition: transform 0.3s ease-in-out;
}

/* 被抓住 隐藏 */
.insect.caught {
    transform: translate(-50%, -50%) scale(0);
}

/* 昆虫图片 */
.insect img {
    width: 100px;
    height: 100px;
}

script.js

// 重点 flex position transform: translate(-50%, -50%) scale(0); transition 函数
// setTimeout setInterval
// 1.获取元素节点
const screens = document.querySelectorAll('.screen');//三块屏
const choose_insect_btns = document.querySelectorAll('.choose-insect-btn');//选择昆虫按钮们
const start_btn = document.getElementById('start-btn')//开始按钮
const game_container = document.getElementById('game-container')//第三屏
const timeEl = document.getElementById('time')//时间
const scoreEl = document.getElementById('score')//分数
const message = document.getElementById('message')//结束语
let seconds = 0//秒
let score = 0
let selected_insect = {}//存储选中的昆虫项
let timer = 0 //记录时间的间歇期
// 2.绑定点击 事件 第一屏向上移动,隐藏
start_btn.addEventListener('click', () => screens[0].classList.add('up'))
// 遍历所有昆虫,绑定点击事件
choose_insect_btns.forEach(btn => {
    btn.addEventListener('click', () => {
        const img = btn.querySelector('img')
        const src = img.getAttribute('src')
        const alt = img.getAttribute('alt')
        // 存储当前的昆虫选项
        selected_insect = { src, alt }
        // 第二屏向上移动,隐藏
        screens[1].classList.add('up')
        // 一秒后,创建一个昆虫
        setTimeout(createInsect, 1000)
        // 开始游戏
        startGame()
    })
})
// 函数 开始游戏
function startGame() {
    // 开启间歇期 每过一秒记录时间
    timer =setInterval(increaseTime, 1000)
}
// 函数,记录时间
function increaseTime() {
    let m = Math.floor(seconds / 60)
    let s = seconds % 60
    m = m < 10 ? `0${m}` : m
    s = s < 10 ? `0${s}` : s
    timeEl.innerHTML = `Time: ${m}:${s}`
    seconds++
}
// 函数:在第三屏中创建昆虫
function createInsect() {
    const insect = document.createElement('div')
    insect.classList.add('insect')
    // 设置昆虫位置
    const { x, y } = getRandomLocation()
    insect.style.top = `${y}px`
    insect.style.left = `${x}px`
    // 随机设置昆虫角度
    insect.innerHTML = `<img src="${selected_insect.src}" alt="${selected_insect.alt}" style="transform: rotate(${Math.random() * 360}deg)" />`
    // 点击,即触发捕捉昆虫
    insect.addEventListener('click', catchInsect)
    // 显示昆虫
    game_container.appendChild(insect)
}
// 函数:随机获取位置
function getRandomLocation() {
    const width = window.innerWidth
    const height = window.innerHeight
    const x = Math.random() * (width - 200) + 100
    const y = Math.random() * (height - 200) + 100
    return { x, y }
}
// 函数:捕捉昆虫
function catchInsect() {
    // 分数+
    increaseScore()
    // 隐藏
    this.classList.add('caught')
    // 移除昆虫
    setTimeout(() => this.remove(), 2000)
    // 添加昆虫
    addInsects()
}
// 函数:添加昆虫,再次开启两个定时器,即捕捉成功1只之后,创建两只昆虫。源源不断
function addInsects() {
    setTimeout(createInsect, 1000)
    setTimeout(createInsect, 1500)
}
// 函数:分数增加
function increaseScore() {
    score++
    // 大于19分。游戏结束。结束语显示
    if (score > 19) {
        clearInterval(timer)
        message.classList.add('visible')
    }
    scoreEl.innerHTML = `Score: ${score}`
}

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

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

相关文章

基于SpringBoot+Vue的大学生租房系统设计与实现(源码+LW+部署文档等)

博主介绍&#xff1a; 大家好&#xff0c;我是一名在Java圈混迹十余年的程序员&#xff0c;精通Java编程语言&#xff0c;同时也熟练掌握微信小程序、Python和Android等技术&#xff0c;能够为大家提供全方位的技术支持和交流。 我擅长在JavaWeb、SSH、SSM、SpringBoot等框架…

第 356 场力扣周赛题解

A 满足目标工作时长的员工数目 签到题 class Solution { public:int numberOfEmployeesWhoMetTarget(vector<int> &hours, int target) {int res 0;for (auto x: hours)if (x > target)res;return res;} };B 统计完全子数组的数目 枚举子数组&#xff1a;枚举子数…

小研究 - 主动式微服务细粒度弹性缩放算法研究(四)

微服务架构已成为云数据中心的基本服务架构。但目前关于微服务系统弹性缩放的研究大多是基于服务或实例级别的水平缩放&#xff0c;忽略了能够充分利用单台服务器资源的细粒度垂直缩放&#xff0c;从而导致资源浪费。为此&#xff0c;本文设计了主动式微服务细粒度弹性缩放算法…

溟㠭篆刻艺术……“瀚1”

每个人生犹如一颗颗繁星&#xff0c;在时空交错中汇聚成一条星汉灿烂的银河&#xff0c;在静谧深邃的宇宙中清澈回响&#xff0c;熠熠生辉。妻晓蕾题注溟㠭刊…… 溟㠭 篆刻作品“瀚1” 溟㠭 篆刻作品“瀚1” 溟㠭 篆刻作品“瀚1” 文/晓蕾

质效卓越,科技前沿—QECon北京站线下盛会成功落幕

7月28日-29日&#xff0c;第八届QECon质量效能大会在北京成功召开&#xff0c;这是质量效能领域备受期待的一场盛会&#xff0c;从2020年第一届QECon开启以来&#xff0c;历经四年QECon北京站终于首次线下落地。本次大会的核心主旨为“数生智慧&#xff0c;高质量发展新引擎”&…

虚拟局域网VLAN

概述 广播域 使用一个或多个以太网交换机互连接起来的交互式以太网&#xff0c;其所有站点都属于同一个广播域&#xff0c;随着交换式以太网规模的扩大&#xff0c;广播域响应扩大&#xff0c;从而形成一个巨大的广播域。 但是巨大的广播域会带来很多的弊端&#xff1a; 广…

JUC中其他常用类

1.CopyOnWriteArrayList ArrayList是线程不安全的&#xff0c;Vector是线程安全的(方法被Synchronized修饰)&#xff0c;CopyOnWriterArrayList是在Vector的基础上再做优化&#xff0c;因为当读取操作较多时&#xff0c;Vector的效率不高。CopyOnWriterArrayList中读操作并没有…

C++ 类和对象篇(一) 类的引入

目录 一、类的概念 二、类的引入 三、类的定义 1.定义一个类 2.struct 和 class 的区别 3.类中成员函数的声明、实现分离 四、封装及类的访问限定符 1.封装 2.类的访问限定符 五、类的作用域和生命周期 六、类的实例化 七、类存储方法 八、计算类的大小 一、类的概念 1…

Gazebo打不开

问题&#xff1a;启动Gazebo半天打不开&#xff0c;无反应 原因&#xff1a;启动Gazebo&#xff0c;会优先从网络上下载模型 解决方案&#xff1a; 1.断网&#xff0c;然后再启动Gazebo 2.把模型下载下来 模型下载链接&#xff1a;GitHub - osrf/gazebo_models: Gazebo da…

简要理清计算机的发展(从硬件和软件)

1.计算机硬件和其他板块的关系 2.什么是计算机系统 可以简单理解计算机系统 硬件 软件。 3.硬件、软件的发展 3.1.硬件发展 逻辑元件的发展&#xff1a; 发展时间逻辑原件速度&#xff08;次/秒&#xff09;内存外存其他第一代1946-1957电子管几千-几万汞延迟线、磁鼓穿…

从源程序到可执行文件的四个过程

从源程序到可执行文件的四个过程 预处理编译汇编链接 程序要运行起来&#xff0c;必须要经过四个步骤&#xff1a;预处理、编译、汇编和链接&#xff0c;如下图所示&#xff1a; -E选项&#xff1a;提示编译器执行完预处理就停下来&#xff0c;后边的编译、汇编、链接就先不执…

Flowable基础

简介 Flowable 是 BPMN 的一个基于 java 的软件实现&#xff0c;不过 Flowable 不仅仅包括 BPMN &#xff0c;还有 DMN 决策表和 CMMN Case 管理引擎&#xff0c;并且有自己的用户管理、微服务 API 等一系列功能&#xff0c; 是一个服务平台。 官方手册&#xff1a; https://…

百万数据快速导入导出

百万数据快速导入 pom <dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>3.2.0</version></dependency>Resourceprivate SalariesListener salariesListener;private ExecutorService…

01-微信小程序开发准备

文章目录 小程序的特点微信小程序开发小程序注册一些基础的设置查看日志开发设置&#xff08;AppID小程序ID&#xff09;服务器域名接口设置 开发者工具下载开发者工具安装开发者工具使用创建小程序 小程序的特点 小程序的特点 : ●小程序是一种不需要下载安装即可使用的应用,…

分享一个jquery重复绑定事件的问题

这篇文章主要分享一下前端在使用jQuery给元素绑定click事件时遇到的一点小问题。 今天在通过JS代码动态绑定元素的点击事件时遇到一点问题&#xff0c;如上图所示&#xff0c;需要实现动态控制低级内丹格子的解锁&#xff0c;每种宠物造型都有一个内丹数量。如图&#xff0c;忘…

快速学会MyBatis映射关系一对一

文章目录 映射关系一对一映射关系-官方文档映射关系1对1-基本介绍基本介绍注意细节 映射关系1 对1-映射方式映射方式配置Mapper.xml 的方式方式1方式2 注解的方式实现应用实例总结 映射关系一对一 映射关系-官方文档 文档地址: https://mybatis.org/mybatis-3/zh/sqlmap-xml.…

用C语言实现堆排序算法

1.设计思路 排序的思想将一个数组按递增的顺序进行排序&#xff0c;将数组的第一个位置空下&#xff08;下标为0&#xff09;&#xff0c;因为会导致子节点和本身同一个结点&#xff08;i和2i一致&#xff09;&#xff0c;每次堆排序在下标1的位置放上了最大值&#xff0c;然后…

PyTorch - GPU入门教程1

1. 安装GPU版本的PyTorch 登录PyTorch官网https://pytorch.org/&#xff0c;下载对应CUDA版本的PyTorch【不能直接pip install&#xff0c;否则安装上的是CPU版本的】 2. 查看GPU信息 &#xff08;1&#xff09;重要信息 !nvidia-smi我的GPU版本很垃圾&#xff0c;本blog仅…

Qgis二次开发-加载本地离线瓦片地图

1.使用详情 准备离线瓦片地图数据&#xff1a;首先&#xff0c;需要获取离线瓦片地图数据。可以从一些开源地图提供商&#xff08;如OpenStreetMap&#xff09;下载地图切片数据&#xff0c;或者使用一些工具&#xff08;如MapTiler&#xff09;将自己的地图数据切片成瓦片格式…