语法定位测试

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>多阶段自适应英语定位测试</title>
    <style>
        @import url('https://fonts.googleapis.com/css2?family=Inter:wght@400;700&display=swap');

        body {
            font-family: 'Inter', sans-serif;
            background-color: #f4f7f9;
            display: flex;
            justify-content: center;
            align-items: center;
            min-height: 100vh;
            margin: 0;
            padding: 20px;
            box-sizing: border-box;
        }

        #test-container {
            background: #ffffff;
            width: 100%;
            max-width: 600px;
            border-radius: 16px;
            box-shadow: 0 8px 32px rgba(0, 30, 80, 0.1);
            padding: 30px 40px;
            box-sizing: border-box;
            display: flex;
            flex-direction: column;
        }

        #progress-container {
            margin-bottom: 20px;
            text-align: center;
            font-size: 14px;
            color: #666;
        }
        
        #welcome-screen h1, #result-area h2 {
            text-align: center;
            color: #333;
            margin-bottom: 10px;
        }
        
        #welcome-screen p, #result-area p {
            text-align: center;
            color: #666;
            font-size: 16px;
            line-height: 1.6;
        }

        .question-content h3 {
            font-size: 1.25rem;
            color: #343a40;
            margin-bottom: 15px;
        }

        .options-grid {
            display: grid;
            grid-template-columns: 1fr;
            gap: 10px;
        }

        .option-btn {
            display: block;
            width: 100%;
            padding: 15px;
            font-size: 1rem;
            text-align: left;
            background-color: #f8f9fa;
            border: 1px solid #dee2e6;
            border-radius: 8px;
            cursor: pointer;
            transition: all 0.2s ease;
        }

        .option-btn:hover:not(:disabled) {
            background-color: #e9ecef;
        }
        
        .option-btn.selected {
            background-color: #cce5ff;
            border-color: #007bff;
            font-weight: bold;
        }
        
        .option-btn:disabled {
            cursor: default;
        }

        .action-buttons {
            margin-top: 20px;
            display: flex;
            justify-content: center;
        }

        #start-btn, #next-btn, #restart-btn {
            padding: 12px 30px;
            font-size: 1rem;
            font-weight: bold;
            border: none;
            border-radius: 8px;
            background-color: #007bff;
            color: white;
            cursor: pointer;
            transition: background-color 0.2s ease;
        }
        
        #next-btn:disabled {
            background-color: #a2cffe;
            cursor: not-allowed;
        }
        
        #result-area {
            display: none;
        }
    </style>
</head>
<body>

    <div id="test-container">
        <div id="welcome-screen">
            <h1>自适应英语水平测试</h1>
            <p>本测试将根据您的回答动态调整题目,以最快速度精准定位您的英语水平。请开始吧!</p>
            <div class="action-buttons">
                <button id="start-btn">开始测试</button>
            </div>
        </div>

        <div id="test-area" style="display:none;">
            <div id="progress-container">
                <span id="progress-text"></span>
            </div>
            <div id="question-area"></div>
            <div class="action-buttons">
                <button id="next-btn" disabled>下一题</button>
            </div>
        </div>

        <div id="result-area">
            <h2>测试结果</h2>
            <p id="result-text"></p>
            <div class="action-buttons">
                <button id="restart-btn">重新测试</button>
            </div>
        </div>
    </div>

    <script>
        // --- 完整题库 ---
        const questionBank = {
            // 阶段一:定位测试题 (10题)
            routing: [
                { question: 'They ___ from the USA.', options: ['am', 'is', 'are'], answer: 'are' },
                { question: 'What is this? [图片: 一本书]', options: ['A pen', 'A book', 'A desk'], answer: 'A book' },
                { question: 'I have two ____.', options: ['foot', 'hands', 'nose'], answer: 'hands' },
                { question: 'This is my car. It is ____.', options: ['my', 'me', 'mine'], answer: 'mine' },
                { question: 'The opposite of "hot" is ____.', options: ['cold', 'warm', 'cool'], answer: 'cold' },
                { question: '____ is your name?', options: ['What', 'Who', 'Where'], answer: 'What' },
                { question: 'He ____ English very well.', options: ['speak', 'speaks', 'speaking'], answer: 'speaks' },
                { question: 'I get up ____ 7 o\'clock.', options: ['in', 'on', 'at'], answer: 'at' },
                { question: 'Can you ____ a bike?', options: ['ride', 'drive', 'fly'], answer: 'ride' },
                { question: 'My favorite color is ____.', options: ['red', 'read', 'ready'], answer: 'red' }
            ],
            // 阶段二:A1水平确认题 (10题)
            a1_confirmation: [
                { question: '____ there any apples?', options: ['Is', 'Are', 'Am'], answer: 'Are' },
                { question: 'She is ____ a letter now.', options: ['write', 'writes', 'writing'], answer: 'writing' },
                { question: 'I would like ____ water.', options: ['some', 'any', 'a'], answer: 'some' },
                { question: 'He is taller ____ his sister.', options: ['that', 'than', 'then'], answer: 'than' },
                { question: 'What did you ____ yesterday?', options: ['do', 'did', 'done'], answer: 'do' },
                // ...可继续添加5道A1难度的题
            ],
            // 阶段三:A2水平挑战题 (10题)
            a2_challenge: [
                { question: 'I haven\'t seen him ____ last year.', options: ['for', 'since', 'ago'], answer: 'since' },
                { question: 'You ____ smoke in the hospital.', options: ['mustn\'t', 'don\'t have to', 'can'], answer: 'mustn\'t' },
                { question: 'If I ____ you, I would study harder.', options: ['am', 'was', 'were'], answer: 'were' },
                { question: 'The movie was very ____.', options: ['bored', 'boring', 'bore'], answer: 'boring' },
                { question: 'She asked me where ____.', options: ['I lived', 'do I live', 'I live'], answer: 'I lived' },
                // ...可继续添加5道A2难度的题
            ]
        };
        // 为演示方便,我们只填充了部分题目
        while(questionBank.a1_confirmation.length < 10) questionBank.a1_confirmation.push({ question: 'A1占位题', options: ['A', 'B', 'C'], answer: 'A' });
        while(questionBank.a2_challenge.length < 10) questionBank.a2_challenge.push({ question: 'A2占位题', options: ['A', 'B', 'C'], answer: 'A' });


        // --- 获取元素 ---
        const welcomeScreen = document.getElementById('welcome-screen');
        const testArea = document.getElementById('test-area');
        const resultArea = document.getElementById('result-area');
        const startBtn = document.getElementById('start-btn');
        const nextBtn = document.getElementById('next-btn');
        const restartBtn = document.getElementById('restart-btn');
        const questionArea = document.getElementById('question-area');
        const progressText = document.getElementById('progress-text');
        const resultText = document.getElementById('result-text');

        // --- 测试状态 ---
        let currentStage = 'routing';
        let questions = [];
        let currentQuestionIndex = 0;
        let score = 0;
        let hasSelected = false;

        // --- 事件绑定 ---
        startBtn.addEventListener('click', startTest);
        nextBtn.addEventListener('click', handleNext);
        restartBtn.addEventListener('click', () => location.reload());

        // --- 核心函数 ---
        function startTest() {
            welcomeScreen.style.display = 'none';
            resultArea.style.display = 'none';
            testArea.style.display = 'block';
            
            currentStage = 'routing';
            questions = questionBank.routing;
            currentQuestionIndex = 0;
            score = 0;
            
            loadQuestion();
        }

        function loadQuestion() {
            hasSelected = false;
            nextBtn.disabled = true;
            questionArea.innerHTML = '';
            
            const totalQuestionsInStage = questions.length;
            progressText.textContent = `阶段: ${currentStage.replace('_', ' ')} | 题目: ${currentQuestionIndex + 1} / ${totalQuestionsInStage}`;

            const q = questions[currentQuestionIndex];
            const questionContent = `
                <div class="question-content">
                    <h3>${q.question.replace('[图片: 一本书]', '<br><img src="https://placehold.co/200x100/6c757d/ffffff?text=Book" alt="图片: 一本书" style="margin-top:10px; border-radius:8px;">')}</h3>
                    <div class="options-grid">
                        ${q.options.map(opt => `<button class="option-btn" onclick="selectOption(this, '${opt}')">${opt}</button>`).join('')}
                    </div>
                </div>
            `;
            questionArea.innerHTML = questionContent;
        }

        function selectOption(btn, selectedAnswer) {
            if (hasSelected) return;
            hasSelected = true;

            const correctAnswer = questions[currentQuestionIndex].answer;
            if (selectedAnswer === correctAnswer) {
                score++;
            }

            Array.from(document.querySelectorAll('.option-btn')).forEach(b => {
                if (b.innerText === correctAnswer) {
                    b.style.backgroundColor = '#d4edda'; // green
                    b.style.borderColor = '#28a745';
                }
                if (b.innerText === selectedAnswer && selectedAnswer !== correctAnswer) {
                    b.style.backgroundColor = '#f8d7da'; // red
                    b.style.borderColor = '#dc3545';
                }
                b.disabled = true;
            });
            
            nextBtn.disabled = false;
        }

        function handleNext() {
            currentQuestionIndex++;
            if (currentQuestionIndex < questions.length) {
                loadQuestion();
            } else {
                // 当前阶段结束,决定下一步
                if (currentStage === 'routing') {
                    const correctRate = score / questions.length;
                    if (correctRate < 0.4) {
                        showResult('Pre-A1', `您在第一阶段答对了 ${score} / ${questions.length} 题。您的英语基础需要加强,建议从最基础的内容开始学习。`);
                    } else if (correctRate > 0.8) {
                        currentStage = 'a2_challenge';
                        questions = questionBank.a2_challenge;
                        currentQuestionIndex = 0;
                        loadQuestion();
                    } else {
                        currentStage = 'a1_confirmation';
                        questions = questionBank.a1_confirmation;
                        currentQuestionIndex = 0;
                        loadQuestion();
                    }
                } else if (currentStage === 'a1_confirmation') {
                    const totalScore = score; // score 包含了第一阶段的得分
                    const totalQuestions = questionBank.routing.length + questionBank.a1_confirmation.length;
                    if ((totalScore / totalQuestions) >= 0.6) {
                        showResult('A1', `恭喜!您完成了所有测试,总得分 ${totalScore} / ${totalQuestions}。您的水平已达到A1,可以开始相关内容的学习。`);
                    } else {
                        showResult('Pre-A1', `您完成了所有测试,但总得分 ${totalScore} / ${totalQuestions} 未达标。我们仍建议您从Pre-A1内容开始巩固。`);
                    }
                } else if (currentStage === 'a2_challenge') {
                    const stage1Score = questionBank.routing.filter(q => q.selectedCorrectly).length; // 假设我们记录了每题对错
                    const stage2Score = score - stage1Score; // 这是一个简化的计算
                    const stage2Total = questionBank.a2_challenge.length;
                    if ((stage2Score / stage2Total) >= 0.5) {
                         showResult('A2', `表现出色!您在第二阶段挑战中答对了 ${stage2Score} / ${stage2Total} 题。您的水平已达到A2,可以挑战更高难度的内容。`);
                    } else {
                         showResult('A1 (Solid)', `很棒!您成功完成了挑战,但距离A2还有一小步。您的A1基础非常扎实,可以继续深入学习。`);
                    }
                }
            }
        }
        
        // 这是一个简化的showResult,实际应用中计算stage2Score会更复杂
        function showResult(level, message) {
            testArea.style.display = 'none';
            resultArea.style.display = 'block';
            resultText.innerHTML = `<b>最终评定水平: ${level}</b><br><br>${message}`;
        }

    </script>
</body>
</html>
Scroll to Top
IMA 雅思写作7分助教x
Chatbot