【娱乐项目】竖式算术器

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>

在这里插入图片描述

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

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

相关文章

D86【python 接口自动化学习】- pytest基础用法

day86 pytest配置testpaths 学习日期&#xff1a;20241202 学习目标&#xff1a;pytest基础用法 -- pytest配置testpaths 学习笔记&#xff1a; pytest配置项 主目录创建pytest.ini文件 [pytest] testpaths./testRule 然后Terminal里直接命令&#xff1a;pytest&#xff…

LeetCode1556. 千位分隔数 LeetCode9. 回文数

题目一、1556. 千位分隔数 给你一个整数 n&#xff0c;请你每隔三位添加点&#xff08;即 "." 符号&#xff09;作为千位分隔符&#xff0c;并将结果以字符串格式返回。 示例 1&#xff1a; 输入&#xff1a;n 987 输出&#xff1a;"987"示例 2&#xff…

网络编程(UDP\TCP回显服务器)

目录 套接字socket TCP和UDP特点比较 特点 比较 UDP回显服务器/客户端的编写 UDP的socket api 回显服务器 客户端 TCP回显服务器/客户端的编写 TCP的socket api 回显服务器 客户端 优化服务器 1.关闭服务器创建的socket对象 2.引入线程池&#xff0c;为多个客户…

基于python的某音乐网站热门歌曲的采集与分析,包括聚类和Lda主题分析

一项目背景 在当前竞争激烈的市场环境下&#xff0c;分析酷狗音乐上的热门歌曲及其用户行为趋势&#xff0c;对平台运营、歌曲推荐和音乐创作具有重要意义。尤其是通过对酷狗音乐平台热门歌曲的数据采集与分析&#xff0c;可以深入理解用户偏好、歌曲流行的规律以及市场需求的…

论文阅读之方法: Single-cell transcriptomics of 20 mouse organs creates a Tabula Muris

The Tabula Muris Consortium., Overall coordination., Logistical coordination. et al. Single-cell transcriptomics of 20 mouse organs creates a Tabula Muris. Nature 562, 367–372 (2018). 论文地址&#xff1a;https://doi.org/10.1038/s41586-018-0590-4 代码地址…

国产多点低压差分(M-LVDS)线路驱动器和接收器,可替代DS91D176/SN65MLVD201

MS2111 是多点低压差分 (M-LVDS) 线路驱动器和接收器。经过优化&#xff0c;可运行在高达 200Mbps 的信号速率下。所有部件均符合 MLVDS 标准 TIA / EIA-899 。该驱动器的输出支持负载低至 30Ω 的多点总线。 MS2111 的接收器属于 Type-2 &#xff0c; 可在 -1V 至 …

【推荐算法】推荐系统的评估

这篇文章是笔者阅读《深度学习推荐系统》第五章推荐系统的评估的学习笔记&#xff0c;在原文的基础上增加了自己的理解以及内容的补充&#xff0c;在未来的日子里会不断完善这篇文章的相关工作。 文章目录 离线评估划分数据集方法客观评价指标P-R曲线ROC/AUCmAPNDCG A/B 测试分…

专题1:AI大模型在汽车行业的应用现状与展望

前言&#xff1a; 本文是《大模型在汽车行业的典型应用实践》100w字长文预告的一篇&#xff0c;本文没有泛泛的去做行业应用现状的介绍&#xff0c;而是通过引入行业调研报告的方式&#xff0c;进行详解&#xff0c;用事事和数据来说话&#xff0c;具有很好的参考意义。 一、…

开源ISP介绍(1)——开源ISP的Vivado框架搭建

开源github链接&#xff1a;bxinquan/zynq_cam_isp_demo: 基于verilog实现了ISP图像处理IP 国内Gitee链接&#xff1a;zynq_cam_isp: 开源ISP项目 基于以上开源链接移植项目到正点原子领航者Zynq7020开发板&#xff0c;并对该项目的Vivddo工程进行架构详解&#xff0c;后续会…

【Java基础面试题009】Java的I/O流是什么?

相关知识补充&#xff1a;黑马-字符集、IO流&#xff08;一&#xff09;.pdf Autism_Btkrsr/Blog_md_to_pdf - 码云 - 开源中国 (gitee.com) 黑马-IO流&#xff08;二&#xff09;.pdf Autism_Btkrsr/Blog_md_to_pdf - 码云 - 开源中国 (gitee.com) 回答重点 Java的I/O&…

Python Tkinter 模块

Python 支持多种图形界面的第三方库&#xff0c;包括 TkQtwxWidgets… Python 提供的 Tkinter 模块&#xff0c;就是 Tk GUI 工具包的接口。 Tkinter Tk 是图形库&#xff0c;支持多种操作系统&#xff0c;使用 Tcl 语言开发&#xff1b; Tk 会调用操作系统提供的本地 GUI …

详细介绍下oracle建库过程中核心脚本dbcore.bsq

在我们搭建oracle 11g数据库过程中&#xff0c;当我们设置好安装参数后&#xff0c;最后一步进行数据库安装时&#xff0c;oracle安装进程实际上调用的是$ORACLE_HOME/rdbms/admin/sql.bsq脚本进行建库。今天我们将详细介绍下其中的核心脚本dbcore.bsq。 一、建库脚本 我们先看…

解决`-bash: ./configure:/bin/sh^M:解释器错误: 没有那个文件或目录`的问题

解决`-bash: ./configure:/bin/sh^M:解释器错误: 没有那个文件或目录`的问题 一、错误原因分析二、解决方法方法一:使用`dos2unix`工具方法二:使用`sed`命令方法三:使用`tr`命令方法四:在文本编辑器中转换方法五:在Windows系统中使用适当的工具三、预防措施四、总结在使…

linux安全-firewalld防火墙-基础讲解

目录 一、 防火墙技术分类 二、 firewalld 三、 firewalld支持的类型的NAT 四、 富语言 五、 firewalld配置方式 六、 firewall-cmd命令 七、 小实验 这篇文章将对 firewalld 防火墙的基础知识进行介绍 firewalld简介&#xff1a;firewalld的作用是为包过滤机制提供匹配…

图的概念即存储结构(C++实现图【1】)

目录 1. 图的基本概念 2. 图的存储结构 2.1 邻接矩阵 2.1.1私有成员变量 2.1.2类模板的声明 2.1.3构造函数 2.1.4获取顶点下标 2.1.5添加边的信息 2.1.6打印图 2.1.7测试用例 2.2邻接表 2.2.1私有成员变量 2.2.2Edge类 2.2.3类模板的声明 2.2.4构造函数 2.2.5获取顶点下标 2.2.…

使用Tauri创建桌面应用

当前是在 Windows 环境下 1.准备 系统依赖项 Microsoft C 构建工具WebView2 (Windows10 v1803 以上版本不用下载&#xff0c;已经默认安装了) 下载安装 Rust下载安装 Rust 需要重启终端或者系统 重新打开cmd&#xff0c;键入rustc --version&#xff0c;出现 rust 版本号&…

实验13 使用预训练resnet18实现CIFAR-10分类

1.数据预处理 首先利用函数transforms.Compose定义了一个预处理函数transform&#xff0c;里面定义了两种操作&#xff0c;一个是将图像转换为Tensor&#xff0c;一个是对图像进行标准化。然后利用函数torchvision.datasets.CIFAR10下载数据集&#xff0c;这个函数有四个常见的…

Wwise SoundBanks内存优化

1.更换音频格式为Vorbis 2.停用多余的音频&#xff0c;如Random Container的随机脚步声数量降为2个 3.背景音乐勾选“Stream”。这样就让音频从硬盘流送到Wwise&#xff0c;而不是保存在内存当中&#xff0c;也就节省了内存 4.设置最大发声数Max Voice Instances 5.设置音频…

【测试工具JMeter篇】JMeter性能测试入门级教程(六):JMeter中实现参数化的几种方式

一、参数化的定义 什么是参数化&#xff1f;从字面上去理解的话&#xff0c;就是事先准备好数据&#xff08;广义上来说&#xff0c;可以是具体的数据值&#xff0c;也可以是数据生成规则&#xff09;&#xff0c;而非在脚本中固化&#xff0c;脚本执行时从准备好的数据中取值。…

2024年11月份实时获取地图边界数据方法,省市区县街道多级联动【附实时geoJson数据下载】

首先&#xff0c;来看下效果图 在线体验地址&#xff1a;https://geojson.hxkj.vip&#xff0c;并提供实时geoJson数据文件下载 可下载的数据包含省级geojson行政边界数据、市级geojson行政边界数据、区/县级geojson行政边界数据、省市区县街道行政编码四级联动数据&#xff0…