前端搭建猜数字游戏(内附源码)

news2024/12/23 9:20:41

The sand accumulates to form a pagoda

  • ✨ 写在前面
  • ✨ 功能介绍
  • ✨ 页面搭建
  • ✨ 样式设置
  • ✨ 逻辑部分
  • ✨ 完整代码


✨ 写在前面

上周我们实通过前端基础实现了打字通,当然很多伙伴再评论区提出了想法,后续我们会考虑实现的,今天还是继续按照我们原定的节奏来带领大家完成一个猜数字的小游戏,功能也比较简单简单,也是想借助这样一个简单的功能,然后来帮助大家了解我们JavaScript在前端中的作用, 在前面的文章当中我们也提及到我们在本系列的专栏是循序渐进从简单到复杂的过程,后续会带领大家用前端实现翻卡片、扫雷、贪吃蛇等有趣的小游戏,纯前端语言实现,都会陆续带给大家。欢迎大家订阅我们这份前端小游戏的专栏。


✨ 功能介绍

在这里插入图片描述

要求我们猜出一个1-100之间的整数,用户可以在输入框输入自己猜测的数字点击提交,会根据我们的猜测给出提示,太大了/太小了,我们可以根据提示继续进行猜测,答对后提示我们答对了并且出现在玩一次的按钮,点击再玩一次重新开始;当然我们可以自己规定规则,大家可以自己修改变成更棒的小游戏!下面我们就按照前面的思路先来实现一下吧!


✨ 页面搭建

创建文件

首先呢我们创建我们的HTML文件,这里我就直接命名为 猜数字.html 了,大家可以随意命名, 文件创建生成后我们通过编辑器打开,这里我用的是VScode, 然后初始化我们的代码结构,那在这里告诉大家一个快捷键,就是我们敲上我们英文的一个 ! 我们敲击回车直接就会给我们生成基础版本的前端代码结构。

在这里插入图片描述

文档声明和编码设置: 在HTML文档的头部,使用<!DOCTYPE>声明HTML文档类型,确保浏览器以正确的方式渲染网页内容。同时,设置UTF-8编码,以确保浏览器能够正确地解析和显示中文字符。下面我就开始搭建我们的DOM结构了!

DOM结构搭建

游戏界面由以下元素组成:整体我们用一个类名为container的div标签来包裹;标题:<h1>标签,用于显示游戏的标题;输入框和提交按钮:<input>和<button>标签,用于接收用户输入并提交;提示信息:<div>标签,用于显示用户每次提交后的提示信息;结果显示:<div>标签,用于显示游戏的最终结果;再玩一次按钮:<button>标签,用于在游戏结束后再次开始游戏。

<div class="container">
    <h1>猜数字游戏</h1>
    <div class="input-group">
        <label for="guess">请猜一个1~100的整数:</label>
        <input type="text" id="guess">
        <button id="submit">提交</button>
    </div>
    <div class="result"></div>
    <div class="message"></div>
    <button id="play-again" 
    class="play-again" 
    style="display: none;">再玩一次</button>
</div>

在这里插入图片描述


✨ 样式设置

我们看到了上面的的DOM已经搭建好了,但是很显然样式比较随意了,我们简单的来配置一下样式吧,其实我们本专栏也是想带领大家掌握一些逻辑所以样式方面我们就一切从简;样式设置包括游戏界面的样式,主要涉及颜色、字体、边框、内边距等属性。下面是CSS样式的详细说明:*表示所有的标签:使用font-family属性设置默认字体,另外我们配置为标准盒子模型;container:设置游戏界面的样式,包括居中、背景色、圆角和内边距等属性。h1:设置游戏标题的样式,包括文字居中、字体大小和颜色等属性。label:设置输入框前面的提示文字的样式,包括字体大小和颜色等属性。input[type=“text”]:设置输入框的样式,包括宽度、高度、字体大小、字体颜色、边框、圆角和内边距等属性。button:设置提交按钮和再玩一次按钮的样式,包括字体大小、字体颜色、背景颜色,普通状态:设置按钮的背景色、字体颜色、边框、圆角和内边距等属性。悬停状态:设置鼠标悬停在按钮上时的背景色和边框样式。激活状态:设置鼠标点击按钮时的背景色和边框样式。

<style>
    * {
        font-family: Arial, sans-serif;
        box-sizing: border-box;
    }

    .container {
        margin: 50px auto;
        max-width: 600px;
        text-align: center;
        background-color: #d1d1d1;
        padding: 30px;
        border-radius: 10px;
    }

    h1 {
        font-size: 32px;
        margin-bottom: 20px;
    }

    .input-group {
        margin-bottom: 20px;
    }

    label {
        display: block;
        margin-bottom: 5px;
    }

    input[type="text"] {
        font-size: 18px;
        padding: 5px;
        width: 200px;
        border: 1px solid #ccc;
    }

    button {
        font-size: 18px;
        padding: 5px 10px;
        background-color: #007bff;
        color: #fff;
        border: none;
        cursor: pointer;
    }

    button:hover {
        background-color: #0062cc;
    }

    .result {
        font-size: 24px;
        margin-bottom: 20px;
    }

    .message {
        font-size: 18px;
        margin-bottom: 20px;
    }

    .play-again {
        font-size: 18px;
        padding: 5px 10px;
        background-color: #007bff;
        color: #fff;
        border: none;
        cursor: pointer;
        margin: 0 auto;
    }

    .play-again:hover {
        background-color: #0062cc;
    }
</style>

在这里插入图片描述


✨ 逻辑部分

首先,代码开头使用Math.floor(Math.random() * 100) + 1生成了一个1到100之间的随机数作为正确答案。然后,使用document.getElementById()、document.querySelector()等方法获取了页面中的元素,这些元素包括用户输入的数字、提交按钮、提示信息、结果信息以及再玩一次按钮。

// 生成随机数(1~100之间)
var answer = Math.floor(Math.random() * 100) + 1;

// 获取页面元素
var input = document.getElementById("guess");
var submitBtn = document.getElementById("submit");
var result = document.querySelector(".result");
var message = document.querySelector(".message");
var playAgainBtn = document.getElementById("play-again");

接下来,代码通过添加事件监听器来处理用户的输入和点击事件。当用户点击提交按钮时,代码会获取用户输入的数字,然后进行以下操作:验证用户输入的数字是否合法,如果不合法则在提示信息中显示错误提示,并结束函数执行。

// 处理提交事件
submitBtn.addEventListener("click", function () {
    // 获取用户输入的数字
    var guess = parseInt(input.value);

    // 验证用户输入的数字是否合法
    if (isNaN(guess) || guess < 1 || guess > 100) {
        result.textContent = "";
        message.textContent = "请输入1~100之间的整数!";
        return;
    }
});

如果用户输入内容为1-100之间的数,也就是这里的合法内容,我们下面就比较用户输入的数字和正确答案,如果相等则在结果信息中显示恭喜猜对,并显示再玩一次按钮,同时禁用提交按钮。如果用户输入的数字小于正确答案,则在提示信息中显示太小了,请继续猜!如果用户输入的数字大于正确答案,则在提示信息中显示太大了,请继续猜!。

// 处理提交事件
submitBtn.addEventListener("click", function () {
    // 获取用户输入的数字
    var guess = parseInt(input.value);

    // 验证用户输入的数字是否合法
    if (isNaN(guess) || guess < 1 || guess > 100) {
        result.textContent = "";
        message.textContent = "请输入1~100之间的整数!";
        return;
    }

    // 比较用户输入的数字和答案
    if (guess === answer) {
        result.textContent = "恭喜你,猜对了!";
        message.textContent = "";
        playAgainBtn.style.display = "block";
        submitBtn.disabled = true;
    } else if (guess < answer) {
        result.textContent = "";
        message.textContent = "太小了,请继续猜!";
    } else {
        result.textContent = "";
        message.textContent = "太大了,请继续猜!";
    }
});

当用户点击再玩一次按钮时,代码会重新生成一个1到100之间的随机数作为正确答案,并清空用户输入的数字、提示信息和结果信息。同时,隐藏再玩一次按钮,启用提交按钮。

// 处理再玩一次事件
playAgainBtn.addEventListener("click", function () {
    // 重新生成随机数
    answer = Math.floor(Math.random() * 100) + 1;

    // 清空输入框和提示信息
    input.value = "";
    result.textContent = "";
    message.textContent = "";

    // 隐藏再玩一次按钮,启用提交按钮
    playAgainBtn.style.display = "none";
    submitBtn.disabled = false;
});

在这里插入图片描述


✨ 完整代码

到这里呢我们的本节的大概逻辑就基本实现了,如果大家可以跟上的话我们可以附加一个小的功能,比如我们要求用户在6次机会内猜出来否则提示失败,很简单的功能大家可以尝试添加进去,如果遇到问题大家可以留言或者私信我,当然大家也可以将样式设置的非常漂亮,这里我们主要是针对前端的初学者来进行的讲解,对于样式的配置我们循序渐进,如果你有能力可以挑战更加漂亮的界面或者更有趣的功能哦,还是一样我们将源码放在下面:

<!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>
    <style>
        * {
            font-family: Arial, sans-serif;
            box-sizing: border-box;
        }

        .container {
            margin: 50px auto;
            max-width: 600px;
            text-align: center;
            background-color: #d1d1d1;
            padding: 30px;
            border-radius: 10px;
        }

        h1 {
            font-size: 32px;
            margin-bottom: 20px;
        }

        .input-group {
            margin-bottom: 20px;
        }

        label {
            display: block;
            margin-bottom: 5px;
        }

        input[type="text"] {
            font-size: 18px;
            padding: 5px;
            width: 200px;
            border: 1px solid #ccc;
        }

        button {
            font-size: 18px;
            padding: 5px 10px;
            background-color: #007bff;
            color: #fff;
            border: none;
            cursor: pointer;
        }

        button:hover {
            background-color: #0062cc;
        }

        .result {
            font-size: 24px;
            margin-bottom: 20px;
        }

        .message {
            font-size: 18px;
            margin-bottom: 20px;
        }

        .play-again {
            font-size: 18px;
            padding: 5px 10px;
            background-color: #007bff;
            color: #fff;
            border: none;
            cursor: pointer;
            margin: 0 auto;
        }

        .play-again:hover {
            background-color: #0062cc;
        }
    </style>
</head>

<body>
    <div class="container">
        <h1>猜数字游戏</h1>
        <div class="input-group">
            <label for="guess">请猜一个1~100的整数:</label>
            <input type="text" id="guess">
            <button id="submit">提交</button>
        </div>
        <div class="result"></div>
        <div class="message"></div>
        <button id="play-again" class="play-again" style="display: none;">再玩一次</button>
    </div>

    <script>

        // 生成随机数(1~100之间)
        var answer = Math.floor(Math.random() * 100) + 1;

        // 获取页面元素
        var input = document.getElementById("guess");
        var submitBtn = document.getElementById("submit");
        var result = document.querySelector(".result");
        var message = document.querySelector(".message");
        var playAgainBtn = document.getElementById("play-again");

        // 处理提交事件
        submitBtn.addEventListener("click", function () {
            // 获取用户输入的数字
            var guess = parseInt(input.value);

            // 验证用户输入的数字是否合法
            if (isNaN(guess) || guess < 1 || guess > 100) {
                result.textContent = "";
                message.textContent = "请输入1~100之间的整数!";
                return;
            }

            // 比较用户输入的数字和答案
            if (guess === answer) {
                result.textContent = "恭喜你,猜对了!";
                message.textContent = "";
                playAgainBtn.style.display = "block";
                submitBtn.disabled = true;
            } else if (guess < answer) {
                result.textContent = "";
                message.textContent = "太小了,请继续猜!";
            } else {
                result.textContent = "";
                message.textContent = "太大了,请继续猜!";
            }
        });

        // 处理再玩一次事件
        playAgainBtn.addEventListener("click", function () {
            // 重新生成随机数
            answer = Math.floor(Math.random() * 100) + 1;

            // 清空输入框和提示信息
            input.value = "";
            result.textContent = "";
            message.textContent = "";

            // 隐藏再玩一次按钮,启用提交按钮
            playAgainBtn.style.display = "none";
            submitBtn.disabled = false;
        });
    </script>
</body>
</html>

本期推荐

在这里插入图片描述

原创不易,还希望各位大佬支持一下 \textcolor{blue}{原创不易,还希望各位大佬支持一下} 原创不易,还希望各位大佬支持一下

👍 点赞,你的认可是我创作的动力! \textcolor{green}{点赞,你的认可是我创作的动力!} 点赞,你的认可是我创作的动力!

⭐️ 收藏,你的青睐是我努力的方向! \textcolor{green}{收藏,你的青睐是我努力的方向!} 收藏,你的青睐是我努力的方向!

✏️ 评论,你的意见是我进步的财富! \textcolor{green}{评论,你的意见是我进步的财富!} 评论,你的意见是我进步的财富!

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

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

相关文章

架构设计-数据库篇

大家好&#xff0c;我是易安&#xff01; 之前我们讲过架构设计的一些原则&#xff0c;和架构设计的方法论&#xff0c;今天我们谈谈高性能数据库集群的设计与应用。 读写分离原理 读写分离的基本原理是将数据库读写操作分散到不同的节点上&#xff0c;下面是其基本架构图。 读…

【ansys】project may be corrupted and recovery information is available

一、问题背景 在网上找一个fluent算例打算在自己机器上运行。 打开fluent求解器&#xff0c;因为路径上有中文&#xff0c;在求解计算的时候出错了。 于是我通过任务管理器强制退出fluent和workbench程序&#xff0c;再将项目文件复制到一个没有中文的目录路径中。 重新打开…

15-2-线程-线程的创建,等待,退出

一、相关API 1. 线程创建 1. 线程创建 #include <pthread.h> int pthread_create(pthread_t *restrict tidp, const pthread_attr_t *restrict attr, void *(*start_rtn)(void *), void *restrict arg);参数&#xff1a;参数1&#xff1a;&#xff08;创建的线程 的地址…

【JavaEE】TCP回写服务器简易翻译服务器(网络编程)

博主简介&#xff1a;想进大厂的打工人博主主页&#xff1a;xyk:所属专栏: JavaEE初阶 上一篇我们讲解了UDP回写服务器和简易翻译服务器&#xff0c;想了解本篇文章&#xff0c;建议先看看上篇文章&#xff0c;学起来会更容易一些~~传送门&#xff1a;(1条消息) 【JavaEE】UDP数…

创新案例|香氛新品牌观夏如何以DTC模式仅4年实现年收过亿

国产香氛品牌观夏的DTC战略&#xff0c;正是从产品创新、全渠道布局、社交电商营销等方面创新&#xff0c;实现更高效地直接触达和转化消费者。观夏作为香氛DTC品牌的创新模式值得更多国内新品牌的关注与借鉴&#xff0c;同时也能为传统品牌的DTC转型提供全球化视野的启示。 1.…

改进YOLOv8: | ICLR 2022 | 涨点神器!Intel提出ODConv:即插即用的动态卷积 | 轻量化涨点创新必备

OMNI-DIMENSIONAL DYNAMIC CONVOLUTION ODConv实验核心代码修改文件yaml文件运行论文链接: https://openreview.net/forum?id=DmpCfq6Mg39 本文介绍了一篇动态卷积的工作:ODConv,其通过并行策略采用多维注意力机制沿核空间的四个维度学习互补性注意力。作为一种“即插即用…

3。数据结构(1)

嵌入式软件开发第三部分&#xff0c;各类常用的数据结构及扩展&#xff0c;良好的数据结构选择是保证程序稳定运行的关键&#xff0c;&#xff08;1&#xff09;部分包括数组&#xff0c;链表&#xff0c;栈&#xff0c;队列。&#xff08;2&#xff09;部分包括树&#xff0c;…

使用rt thread studio新建一个rt thread工程的详细操作说明(以stm32F411CEU6)为例

新建工程 这里以rt thread 5.0以及stm32F411CEU6芯片为例&#xff0c;创建工程 先建一个工作空间 .metadata是建工作空间自己生成的。 这时候&#xff0c;工作空间是空的&#xff0c;没有项目: 新建项目 首先下载RT-thread源文件和芯片支持包&#xff1a; 2023.05.02&#x…

NOIP2000 提高组 方格取数 线性DP 坐标优化 全局最优

&#x1f351; 算法题解专栏 &#x1f351; [NOIP2000 提高组] 方格取数 题目描述 设有 N N N \times N NN 的方格图 ( N ≤ 9 ) (N \le 9) (N≤9)&#xff0c;我们将其中的某些方格中填入正整数&#xff0c;而其他的方格中则放入数字 0 0 0。如下图所示&#xff08;见样…

延时队列的三种实现方案

延时队列的三种实现方案 什么是延时队列延时队列的应用场景基于Java DelayQueue的实现源码剖析 基于Redis的zset实现实现步骤Redis延时队列优势Redis延时队列劣势 基于RabbitMQ的延时队列实现TTL DXL(死信队列)插件实现 总结参考文章 什么是延时队列 在分布式系统中&#xff…

Go(二):包管理、通道、协程并发、互斥锁基础

包管理、协程并发基础 生成包管理文件go-mod第一步&#xff08;初始化创建包管理文件&#xff09;第二步&#xff08;导入包&#xff09; 常用命令导入远程包&#xff08;示例&#xff1a;gin&#xff09;第一步&#xff08;导入包&#xff09;第二步&#xff08;安装包&#x…

操作系统之进程同异步、互斥

引入 异步性是指&#xff0c;各并发执行的进程以各自独立的、不可预知的速度向前推进。 但是在一定的条件之下&#xff0c;需要进程按照一定的顺序去执行相关进程&#xff1a; 举例说明1&#xff1a; 举例说明2: 读进程和写进程并发地运行&#xff0c;由于并发必然导致异步性…

【Python】如何在Python中绘制带有连接线的双饼图?

文章目录 一、导入所需的库二、准备数据三、绘制双饼图3.1 创建画布和子图对象3.2 绘制大饼图3.3 绘制小饼图3.4 连接线1&#xff0c;连接大饼图的上边缘和小饼图的饼块3.5 连接线2&#xff0c;连接大饼图的下边缘和小饼图的饼块3.6 添加连接线3.7 调整子图布局 四、源代码 在 …

Linux 内核组织(kernel.org)将关闭 FTP 服务

Linux 内核组织&#xff08;kernel.org&#xff09;是一家建立于 2002 年的加利福尼亚公共福利公司&#xff0c;其目的是公开地免费分发 Linux 内核和其它开源软件。它接受 Linux 基金会的管理&#xff0c;包括技术、资金和人员支持&#xff0c;用以维护kernel.org 的运营。 Li…

2 ROS2话题通讯基础(1)

2 ROS2话题通讯基础 2.1 ROS2话题通讯介绍2.2 ROS2常用的消息类型介绍2.2.1 std_msgs消息类型2.2.2 geometry_msgs消息类型 2.3 使用C/C创建基础消息类型的话题通讯2.3.1 创建C/C发布话题信息的功能包并配置VSCode环境2.3.2 编写ROS2发布话题节点CPP文件2.3.3 配置C/C发布话题功…

【Elasticsearch】SQL操作相关

文章目录 SQL操作数据准备查询索引下的数据SQL转化为DSL(本质)SQL与DSL混合使用查看所有索引查询指定索引查看索引(表)结构where条件过滤group by分组having 对分组后的数据进行过滤order by 排序limit 限制查询数量cursor 游标->为缓存设计聚合操作支持的函数和运算比较运算…

虚拟机和Docker有什么区别?

虚拟机 对于虚拟机&#xff0c;抽象层或抽象软件成为管理程序。管理程序就是帮助虚拟机模拟物理计算机的东西。在管理程序下面&#xff0c;我们有些硬件。管理程序管理单个物理主机上不同虚拟机之间的资源分配。管理程序管理单个物理主机上不同虚拟机之间的资源分配。也就是管…

微信小程序学习实录3(环境部署、百度地图微信小程序、单击更换图标、弹窗信息、导航、支持腾讯百度高德地图调起)

百度地图微信小程序 一、环境部署1.need to be declared in the requiredPrivateInfos2.api.map.baidu.com 不在以下 request 合法域名3.width and heigth of marker id 9 are required 二、核心代码&#xff08;一&#xff09;逻辑层index.js&#xff08;二&#xff09;渲染层…

vue diff算法与虚拟dom知识整理(2) snabbdom简介并搭建开发环境

snabbdom算是diff算法 和 虚拟dom 的一个鼻租了 vue源码借鉴了snabbdom 这个单词翻译出来叫速度 命名还是用了点心的 后面是 dom 这个 我们大概去猜作者的意思 大概想表示的就是 一个比较快的dom操作 snabbdom的get地址如下 https://github.com/snabbdom/snabbdom 这里的简…

「OceanBase 4.1 体验」|快速安装部署[OBD方式]

文章目录 一、Oceanbase数据库简介1.1 核心特性1.2 系统架构1.2.1 存储层1.2.2 复制层1.2.3 均衡层1.2.4 事务层1.2.4.1 原子性1.2.4.2 隔离性 1.2.5 SQL 层1.2.5.1 SQL 层组件1.2.5.2 多种计划 1.2.6 接入层 二、OceanBase 数据库社区版部署2.1 部署方式2.2 基础环境配置2.3 通…