【娱乐项目】竖式算术器

news2025/4/3 23:00:34

Demo介绍

一个加减法随机数生成器,它能够生成随机的加减法题目,并且支持用户输入答案。系统会根据用户输入的答案判断是否正确,统计正确和错误的次数,并显示历史记录和错题记录。该工具适合用于数学练习,尤其适合练习基本的加减法运算。

JavaScript 代码

  1. 变量初始化
  • correctCount 和 wrongCount:用于存储用户答对和答错的次数
  • randomNum:控制生成的随机数的范围,默认是 20
  • previousEquations:存储用户回答的所有算式
  • correctEquations 和 wrongEquations:分别记录答对和答错的算式
  • showWrongRecords 控制是否显示错题记录
  1. 核心功能
  • **编辑功能:**点击“修改”按钮可以编辑 randomNum,即加减法题目的最大值范围。修改后,点击“确定”会禁用输入框
  • **计时功能:**通过 setInterval 每秒更新一次计时器,显示自页面加载以来的耗时
  • 随机数生成和算式生成:
  1. generateRandomNumber():生成 1 到 randomNum 之间的随机整数
  2. generateRandomOperation():以 50% 概率生成“加法”或“减法”
  3. generateRandomEquation():根据生成的两个随机数和运算符构建一个加减法算式。如果是加法且结果大于 randomNum,则改为减法;如果是减法且第一个数小于第二个数,则交换两个数的顺序。
  • 答案判断:
  1. checkAnswer():监听用户输入,按回车键后检查用户输入的答案是否正确。若正确,增加正确次数并将算式添加到正确记录中;若错误,增加错误次数并将算式添加到错误记录中
  2. eval() 用于计算生成的算式的结果
  • 更新和显示题目:
  1. 每次用户回答正确后,调用 generateNewEquation() 函数生成一个新的随机算式
  2. 显示题目:equation 显示算式,equation2 显示带等号的算式,showRes 显示算式的树形结构(即数字在上下排布的样式,帮助用户理解运算顺序)
  • 历史记录:
  1. 使用 previousEquations 存储所有的算式和对应的答案,历史记录可以按顺序显示
  2. 通过点击“切换记录”按钮,可以切换查看错题记录(错误的算式)和历史记录(包括正确和错误的算式)
  • 统计功能:
    页面右侧显示正确回答次数和错误回答次数
  • 键盘事件监听:
    使用 document.addEventListener(‘keypress’, checkAnswer) 来监听用户的输入,并在用户按下回车键时进行答案检查

交互流程

  • 页面加载时,默认生成一个加减法算式,并显示在页面中
  • 用户在输入框中输入答案并按下回车键
  1. 如果答案正确,显示“回答正确”,并生成一个新的算式
  2. 如果答案错误,显示“回答错误”
  • 用户可以通过点击“切换记录”按钮查看历史记录或错题记录
  • 用户点击“修改”按钮时,可以修改加减法题目的最大数值(默认为20)
  • 页面会不断更新统计信息,显示正确和错误的次数

完整代码

<!DOCTYPE html>
<html>

<head>
    <title>加减法随机数生成器</title>
    <style>
        /* 页面样式设置 */
        body {
            margin: 0;
        }

        .calculate {
            height: 97vh;
            overflow: scroll;
            text-align: center;
            border: 8px groove #fff;
        }

        html::-webkit-scrollbar,
        .calculate::-webkit-scrollbar {
            width: 0;
            height: 0;
        }

        .calculate .top {
            position: relative;
        }

        .calculate .title {
            height: 40px;
            line-height: 40px;
            font-size: 32px;
            font-weight: bold;
            text-align: center;
        }

        .calculate .title input {
            width: 50px;
            height: 100%;
            text-align: center;
            font-size: 32px;
            font-weight: bold;
            border: none;
        }

        .calculate .top .btn {
            position: absolute;
            top: 5px;
            right: 10px;
            display: flex;
            justify-content: space-around;
        }

        .calculate .top .btn div {
            width: 100px;
            background: #7bcafc;
            color: #fff;
            border-radius: 20px;
            height: 35px;
            line-height: 35px;
            cursor: pointer;
            margin-left: 10px;
        }

        .calculate #container {
            display: flex;
            justify-content: space-around;
            background: rgb(241, 245, 251);
            height: 80%;
            margin: 0 auto;
            border-radius: 8px;
        }

        .calculate #container .title {
            background: #fff;
            border-radius: 20px;
            width: 50%;
            margin: 10px auto;
            height: 40px;
            line-height: 40px;
        }

        #timer {
            width: 100%;
            text-align: center;
            font-size: 20px;
        }

        #equation {
            font-size: 40px;
            font-weight: bold;
            text-align: center;
            margin-bottom: 20px;
            display: none;
        }

        #equation2 {
            font-size: 40px;
            font-weight: bold;
            text-align: center;
            margin-bottom: 20px;
            display: none;
        }

        .tree {
            font-size: 40px;
            font-weight: bold;
        }

        .tree p {
            line-height: 0;
            text-align: right;
        }

        .tree .fuhao {
            text-align: left;
        }

        .line {
            width: 100%;
            height: 3px;
            background: #000;
        }

        #answer {
            font-size: 24px;
            width: 200px;
            padding: 10px;
            margin-bottom: 20px;
        }

        #result {
            font-size: 30px;
            font-weight: bold;
            text-align: center;
            margin-bottom: 10px;
            color: red;
        }

        .correct {
            color: green;
        }

        .wrong {
            color: red;
        }

        #statistics {
            margin-top: 20px;
            text-align: center;
        }

        #previousEquations {
            height: 88%;
            overflow: scroll;
            overflow-y: scroll;
            font-size: 20px;
            line-height: 1.5;
            column-count: 4;
            column-gap: 10px;
            text-align: right;
        }

        .equation-row {
            display: flex;
            justify-content: flex-start;
            margin-bottom: 10px;
        }

        .equation-item {
            display: inline-block;
            width: 125px;
            text-align: center;
            margin-right: 10px;
            margin-bottom: 10px;
            padding: 5px;
            border: 1px solid #ccc;
            border-radius: 5px;
        }
    </style>
</head>

<body>
    <div class="calculate">
        <div class="top">
            <div class="title">
                <!-- 显示最大随机数的输入框,默认20 -->
                <input value="20" readonly />
                内加减法随机数生成器
            </div>
            <div class="btn">
                <div id="toggleRecordsBtn">切换记录</div>
                <div id="edit">修改</div>
            </div>
            <div>
                <p id="timer">耗时:0秒</p>
            </div>
        </div>

        <div id="container">
            <div style="width: 40%;">
                <h2 class="title" style="width: 70%;">随机算术</h2>
                <div style="width: 20%; margin-left: 40%">
                    <!-- 随机算式显示区域 -->
                    <p id="equation"></p>
                    <p id="equation2"></p>
                    <p id="showRes"></p>
                    <p class="line"></p>
                </div>
                <!-- 用户输入答案的输入框 -->
                <input type="text" id="answer" placeholder="请输入答案" autocomplete="off">
                <p id="result"></p>
                <div id="statistics">
                    <p id="correctCount">回答正确次数:0</p>
                    <p id="wrongCount">回答错误次数:30</p>
                </div>
            </div>
            <div style="width: 60%;">
                <h2 class="title" id="historyTitle">历史结果</h2>
                <!-- 历史记录显示区域 -->
                <div id="previousEquations"></div>
            </div>
        </div>
    </div>
    <script>
        // 正确和错误的答题次数初始化
        var correctCount = 0;
        var wrongCount = 30;

        // 初始最大随机数范围为20
        var randomNum = 20;

        // 用于保存历史记录和错题记录
        var previousEquations = []; // 所有的算式
        var correctEquations = []; // 正确的算式
        var wrongEquations = []; // 错误的算式
        var showWrongRecords = false; // 当前是否展示错题记录


        // 记录开始时间,用于计时
        var startTime = new Date().getTime();
        var timerElement = document.getElementById('timer');


        const edit = document.querySelector('#edit');
        const input = document.querySelector('.title input');

        // 点击“修改”按钮,允许用户修改最大随机数
        edit.addEventListener('click', () => {
            if (edit.textContent == '修改') {
                input.readOnly = false;
                input.focus();
                edit.textContent = '确定'
            } else {
                input.readOnly = true;
                input.blur();
                const value = input.value;
                edit.textContent = '修改'
                input.style.border = 'none';
                randomNum = value; // 修改最大随机数
            }
        });


        // 更新计时器
        function updateElapsedTime() {
            var currentTime = new Date().getTime();
            var elapsedTime = Math.floor((currentTime - startTime) / 1000); // 换算为秒

            if (elapsedTime >= 60) {
                var minutes = Math.floor(elapsedTime / 60);
                var seconds = elapsedTime % 60;
                timerElement.textContent = '耗时:' + minutes + '分' + seconds + '秒';
            } else {
                timerElement.textContent = '耗时:' + elapsedTime + '秒';
            }
        }

        // 每秒更新一次计时器
        setInterval(updateElapsedTime, 1000);


        // 生成1到randomNum之间的随机数
        function generateRandomNumber() {
            return Math.floor(Math.random() * randomNum) + 1; // 生成1到randomNum之间的随机数
        }

        // 随机生成加法或减法
        function generateRandomOperation() {
            return Math.random() < 0.5 ? '+' : '-'; // 以50%的概率生成加减法
        }

        // 生成随机算式
        function generateRandomEquation() {
            var number1 = generateRandomNumber();
            var number2 = generateRandomNumber();
            var operation = generateRandomOperation();

            if (operation === '+' && number1 + number2 > randomNum) {
                operation = '-'; // 如果加法结果超过最大值,则改为减法
            }

            if (operation === '-' && number1 < number2) {
                var temp = number1;
                number1 = number2;
                number2 = temp; // 如果减法第一个数小于第二个数,交换
            }

            let res = number1 + ' ' + operation + ' ' + number2;
            let show = '<div class="tree"><p>' + number1 + '</p><p class="fuhao">' + operation + '</p><p>' + number2 + '</p></div>';

            let obj = {
                res,
                show
            };
            return obj;
        }

        // 检查用户输入的答案
        function checkAnswer(event) {
            if (event.keyCode === 13) { // 检测是否按下回车键
                var userInput = document.getElementById('answer').value;
                var equation = document.getElementById('equation').textContent;
                var result = eval(equation); // 使用eval计算算式的结果

                if (userInput == "") {
                    return;
                }

                var isCorrect = parseInt(userInput) === result;

                // 判断答案是否正确
                if (isCorrect) {
                    correctCount++;
                    previousEquations.push('<span class="equation-item correct">' + equation + ' = ' + userInput + ' √</span>');
                    correctEquations.push('<span class="equation-item correct">' + equation + ' = ' + userInput + ' √</span>');
                    document.getElementById('result').textContent = '回答正确!';
                } else {
                    wrongCount++;
                    previousEquations.push('<span class="equation-item wrong">' + equation + ' = ' + userInput + ' ×</span>');
                    let equationItem = '<span class="equation-item wrong">' + equation + ' = </span>';
                    if (!wrongEquations.includes(equationItem)) {
                        wrongEquations.push(equationItem); // 错题不重复
                    }

                    document.getElementById('result').textContent = '回答错误!';
                }

                document.getElementById('correctCount').textContent = '回答正确次数:' + correctCount;
                document.getElementById('wrongCount').textContent = '回答错误次数:' + wrongCount;


                document.getElementById('previousEquations').innerHTML = previousEquations.join('');

                // 答对了清空输入框并生成新题
                if (isCorrect) {
                    generateNewEquation();
                }

                document.getElementById('answer').value = ''; // 清空输入框
                document.getElementById('answer').focus(); // 聚焦输入框
                showWrongRecords = false;
                showHistory();
            }
        }

        // 生成新的随机算式
        function generateNewEquation() {
            document.getElementById('answer').value = ''; // 清空输入框
            document.getElementById('result').textContent = ''; // 清空结果显示

            var equation;
            var show;
            var result;

            // 确保生成的算式结果是非负数
            do {
                let fun = generateRandomEquation();
                equation = fun.res;
                show = fun.show;
                result = eval(equation);
            } while (result < 0); // 重新生成随机算式,直到结果不是负数为止

            document.getElementById('equation').textContent = equation;
            document.getElementById('equation2').textContent = equation + " = ";
            document.getElementById('showRes').innerHTML = show;
        }

        // 显示历史记录或错题记录
        function showHistory() {
            var historyTitle = document.getElementById('historyTitle');
            var previousBox = document.getElementById('previousEquations');

            if (showWrongRecords) {
                historyTitle.textContent = '错题记录';
                previousBox.innerHTML = wrongEquations.join('');
            } else {
                historyTitle.textContent = '历史记录';
                previousBox.innerHTML = previousEquations.join('');
            }
        }

        // 切换显示历史记录或错题记录
        function toggleRecords() {
            showWrongRecords = !showWrongRecords;
            showHistory();
        }

        document.addEventListener('keypress', checkAnswer); // 监听键盘按键事件

        generateNewEquation(); // 生成第一道题目
        document.getElementById('answer').focus(); // 页面加载后将焦点聚焦到输入框

        var toggleRecordsBtn = document.getElementById('toggleRecordsBtn');
        toggleRecordsBtn.addEventListener('click', toggleRecords); // 点击切换记录按钮
    </script>
</body>

</html>

在这里插入图片描述

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

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

相关文章

架构-微服务-服务配置

文章目录 前言一、配置中心介绍1. 什么是配置中心2. 解决方案 二、Nacos Config入门三、Nacos Config深入1. 配置动态刷新2. 配置共享 四、nacos服务配置的核心概念 前言 服务配置--Nacos Config‌ 微服务架构下关于配置文件的一些问题&#xff1a; 配置文件相对分散。在一个…

基础(函数、枚举)错题汇总

枚举默认从0开始&#xff0c;指定后会按顺序赋值 而这个枚举变量X&#xff0c;如果在全局&#xff08;函数外部&#xff09;定义&#xff0c;那默认为0&#xff0c;如果在函数内部&#xff08;局部变量&#xff09;&#xff0c;那就是随机值&#xff0c;必须初始化。 枚举变量…

flink学习(7)——window

概述 窗口的长度(大小): 决定了要计算最近多长时间的数据 窗口的间隔: 决定了每隔多久计算一次 举例&#xff1a;每隔10min,计算最近24h的热搜词&#xff0c;24小时是长度&#xff0c;每隔10分钟是间隔。 窗口的分类 1、根据window前是否调用keyBy分为键控窗口和非键控窗口…

Spring Boot 的 WebClient 实践教程

什么是 WebClient&#xff1f; 在 Spring Boot 中&#xff0c;WebClient 是 Spring WebFlux 提供的一个非阻塞、响应式的 HTTP 客户端&#xff0c;用于与 RESTful 服务或其他 HTTP 服务交互。相比于传统的 RestTemplate&#xff0c;WebClient 更加现代化&#xff0c;具有异步和…

二叉搜索树讲解

二叉搜索树概念和定义 二叉搜索树是一个二叉树&#xff0c;其中每个节点的值都满足以下条件&#xff1a; 节点的左子树只包含小于当前节点值的节点。节点的右子树只包含大于当前节点值的节点。左右子树也必须是二叉搜索树。 二叉树搜索树性质 从上面的二叉搜索树定义中可以了…

FinalShell工具数据备份升级、密码解密方法

前言 FinalShell 作为国产的服务器管理工具和远程终端软件。一个一体化的运维工具&#xff0c;在国内运维人员中还是比较受欢迎。它整合了多个常用功能&#xff0c;界面友好&#xff0c;使用方便。不过它是一个闭源的商业软件&#xff0c;虽然提供免费版本&#xff0c;但部分高…

241130_昇思MindSpore函数式自动微分

241130_昇思MindSpore函数式自动微分 函数式自动微分是Mindspore学习框架所特有的&#xff0c;更偏向于数学计算的习惯。这里也是和pytorch差距最大的部分&#xff0c;具体体现在训练部分的代码&#xff0c;MindSpore是把各个梯度计算、损失函数计算 在这幅图中&#xff0c;右…

菱形打印(Python)

“以块组合块”&#xff0c;以行凝结循环打印。 (笔记模板由python脚本于2024年11月30日 19:55:22创建&#xff0c;本篇笔记适合正在学习python循环的coder翻阅) 【学习的细节是欢悦的历程】 Python 官网&#xff1a;https://www.python.org/ Free&#xff1a;大咖免费“圣经”…

【QT入门到晋级】QT项目打生产环境包--(Linux和window)

前言 使用QTcreator完成正常编译后&#xff0c;在构建目录中有可执行程序生成&#xff0c;如果直接把可执行程序拷贝到干净的生产环境上是无法运行成功的&#xff0c;使用ldd&#xff08;查看程序依赖包&#xff09;会发现缺失很多QT的特性包&#xff0c;以及将介绍国产Linux桌…

Super Vlan与Mux Vlan

SuperVlan VLAN Aggregation&#xff0c; 也称 Super-VLAN : 指 在一个物理网络内&#xff0c;用多个 VLAN &#xff08;称为 Sub-VLAN &#xff09;隔离 广播域&#xff0c;并将这些 Sub-VLAN 聚合成一个逻辑的 VLAN &#xff08;称为 Super-VLAN &#xff09;&#xff0c;这…

蓝牙定位的MATLAB程序,四个锚点、三维空间

这段代码通过RSSI信号强度实现了在三维空间中的蓝牙定位&#xff0c;展示了如何使用锚点位置和测量的信号强度来估计未知点的位置。代码涉及信号衰减模型、距离计算和最小二乘法估计等基本概念&#xff0c;并通过三维可视化展示了真实位置与估计位置的关系。 目录 程序描述 运…

Hutool 秒速实现 2FA 两步验证

前言 随着网络安全威胁的日益复杂&#xff0c;传统的用户名和密码认证方式已不足以提供足够的安全保障。为了增强用户账户的安全性&#xff0c;越来越多的应用和服务开始采用多因素认证&#xff08;MFA&#xff09;。基于时间的一次性密码&#xff08;TOTP, Time-based One-Ti…

【继承】—— 我与C++的不解之缘(十九)

前言&#xff1a; 面向对象编程语言的三大特性&#xff1a;封装、继承和多态 本篇博客来学习C中的继承&#xff0c;加油&#xff01; 一、什么是继承&#xff1f; ​ 继承(inheritance)机制是⾯向对象程序设计使代码可以复⽤的最重要的⼿段&#xff0c;它允许我们在保持原有类…

【目标跟踪】Anti-UAV数据集详细介绍

Anti-UAV数据集是在2021年公开的专用于无人机跟踪的数据集&#xff0c;该数据集采用RGB-T图像对的形式来克服单个类型视频的缺点&#xff0c;包含了318个视频对&#xff0c;并提出了相应的评估标准&#xff08;the state accurancy, SA)。 文章链接&#xff1a;https://arxiv.…

偏差-方差权衡(Bias–Variance Tradeoff):理解监督学习中的核心问题

偏差-方差权衡&#xff08;Bias–Variance Tradeoff&#xff09;&#xff1a;理解监督学习中的核心问题 在机器学习中&#xff0c;我们希望构建一个能够在训练数据上表现良好&#xff0c;同时对未见数据也具有强大泛化能力的模型。然而&#xff0c;模型的误差&#xff08;尤其…

Figma入门-原型交互

Figma入门-原型交互 前言 在之前的工作中&#xff0c;大家的原型图都是使用 Axure 制作的&#xff0c;印象中 Figma 一直是个专业设计软件。 最近&#xff0c;很多产品朋友告诉我&#xff0c;很多原型图都开始用Figma制作了&#xff0c;并且很多组件都是内置的&#xff0c;对…

Windows系统怎么把日历添加在桌面上用来记事?

在众多电脑操作系统中&#xff0c;Windows系统以其广泛的用户基础和强大的功能&#xff0c;成为许多人的首选。对于习惯于在电脑前工作和学习的用户来说&#xff0c;能够直接在桌面上查看和记录日历事项&#xff0c;无疑会大大提高工作效率和生活便利性。今天&#xff0c;就为大…

蓝桥杯备赛笔记(一)

这里的笔记是关于蓝桥杯关键知识点的记录&#xff0c;有别于基础语法&#xff0c;很多内容只要求会用就行&#xff0c;无需深入掌握。 文章目录 前言一、编程基础1.1 C基础格式和版本选择1.2 输入输出cin和cout&#xff1a; 1.3 string以下是字符串的一些简介&#xff1a;字符串…

大数据新视界 -- 大数据大厂之 Hive 数据压缩:优化存储与传输的关键(上)(19/ 30)

&#x1f496;&#x1f496;&#x1f496;亲爱的朋友们&#xff0c;热烈欢迎你们来到 青云交的博客&#xff01;能与你们在此邂逅&#xff0c;我满心欢喜&#xff0c;深感无比荣幸。在这个瞬息万变的时代&#xff0c;我们每个人都在苦苦追寻一处能让心灵安然栖息的港湾。而 我的…

RNN And CNN通识

CNN And RNN RNN And CNN通识一、卷积神经网络&#xff08;Convolutional Neural Networks&#xff0c;CNN&#xff09;1. 诞生背景2. 核心思想和原理&#xff08;1&#xff09;基本结构&#xff1a;&#xff08;2&#xff09;核心公式&#xff1a;&#xff08;3&#xff09;关…