小学生测验(Java)

小学生测验(Java)

任务描述:面向小学低年级和高年级学生,随机选择两个整数和加减乘除法形成算式要求学生解答。
功能要求:
(1)电脑随机出10道题,每题10分,程序结束时显示学生得分;
(2)确保算式符合各年级的水平,低年级只允许进行50以内的加减法,不允许两数之和或之差为负数;
(3)每道题学生有三次机会输入答案,当学生输入错误答案时,提醒学生重新输入。
(4)对于每道题,学生第一次输入正确答案得10分,第二次输入正确答案得7分,第三次输入正确答案得5分,否则不得分;
(5)总成绩90以上显示“SMART”,80-90显示“GOOD”,70-80显示“OK”,60-70显示“PASS”,60以下“TRY AGAIN”。

创建题库类

连接ActionListener接口,并且判断答案的对错,并给出相应提示

import java.util.Random;
import java.awt.BorderLayout;
import java.awt.Font;
import java.awt.event.*;
import javax.swing.*;
public class Question extends Main  implements ActionListener{
    public double numberOne,numberTwo;
    //操作数
    public int score=0;
    //总分数
    public int sum_result,sub_result,mul_result,mub_result;
    //各类算法结果
    public int k;
    //判断错误次数
    public int b=0;
    //题号
    public String operator="";

Random random;
    int maxInteger;
    //设置运算难度
    JTextField textOne,textTwo,textResult,quenumber;
    JLabel operatorLabel,message;
    Question(){
        random = new Random();
    }
    public void setMaxInteger(int n){
        maxInteger=n;
    }
    //设置运算难度方法

    public void actionPerformed(ActionEvent e)
    {//动作事件监视器
        String str=e.getActionCommand();//获取动作命令字符
        if(str.equals("getProblem"))
        {   //点击获取问题 触发
            b++;
            numberOne=random.nextInt(maxInteger)+1;
            numberTwo=random.nextInt(maxInteger)+1;
            //获取随机运算数字
            if(maxInteger==20)
            {  //低年级题库
                int d=random.nextInt(2);
                //随机运算符
                double temp=0;
                if(d==0)
                    operator="+";
                else
                {
                    operator="-";
                    while(numberOne<numberTwo) {//设置大数字减小数字
                        temp=numberTwo;
                        numberTwo=numberOne;
                        numberOne=temp;
                    }
                }

            }
            else if(maxInteger==100)//高年级题库
            {
                int d=random.nextInt(4);//随机运算符
                double temp=0;

                if(d==0)
                    operator="+";
                else if(d==1)
                {
                    operator="-";
                    while(numberOne<numberTwo)
                    { //设置大数字减小数字,防止出现负数
                        temp=numberTwo;
                        numberTwo=numberOne;
                        numberOne=temp;
                    }
                }
                else if(d==2)
                    operator="*";
                else if(d==3)
                    operator="/";
            }
            sum_result=(int)(numberOne+numberTwo);
            sub_result=(int)(numberOne-numberTwo);
            mul_result=(int)(numberOne*numberTwo);
            if((numberOne/numberTwo-(int)(numberOne/numberTwo))>0.5)
            mub_result=(int)(numberOne/numberTwo)+1;
            else
                mub_result=(int)(numberOne/numberTwo);
            quenumber.setText(""+b);
            //显示题号
            textOne.setText(""+numberOne);
            textTwo.setText(""+numberTwo);
            //显示题目
            operatorLabel.setText(operator);
            //显示运算符
            message.setText("请回答 你现在的总分为:"+score);
            textResult.setText(null);
        }


        else if(str.equals("answer"))
        {
            String answer = textResult.getText();
            try{
                int result=Integer.parseInt(answer);//answer强制转换整型
                if(operator.equals("+"))
                    errorjudgement( message, result, sum_result,k=geti(),score);
                else if(operator.equals("-"))
                    errorjudgement( message, result, sub_result,k=geti(),score);
                else if(operator.equals("*"))
                    errorjudgement( message, result, mul_result,k=geti(),score);
                else if(operator.equals("/"))
                    errorjudgement( message, result, mub_result,k=geti(),score);
            }
            catch(NumberFormatException ex){
                message.setText("请输入数字字符");}
            if(b==10)
            {

            	if(score<60)
            		operator="TRY AGAIN";
            	else if(score<70&&score>=60)
            		operator="PASS";
            	else if(score<80&&score>=70)
            		operator="OK";
            	else if(score<90&&score>=80)
            		operator="GOOD";
            	else if(score>=90)
            		operator="SMART";
                //弹出测验结果窗口
            	JFrame jf=new JFrame();
            	jf.setLayout(new BorderLayout());
            	jf.setDefaultCloseOperation(JDialog.HIDE_ON_CLOSE);
            	jf.setLocation(500,150);
            	jf.setSize(300,300);
            	jf.setVisible(true);
            	JLabel lab=new JLabel(operator,JLabel.CENTER);
            	lab.setFont(new Font("黑体",Font.PLAIN,20));
            	jf.add(lab);

                message.setText("下次加油噢");
            }
        }

    }
    public void errorjudgement(JLabel message2,int result1,int trueresult,int j,int Score)
    {   //判断结果对错及相应文本框的输出情况
        if (result1 == trueresult)
        {   switch (j) {
            case 0:
                Score += 10;
                break;
            case 1:
                Score += 7;
                break;
            case 2:
                Score += 5;
                break;
        }
            message2.setText("回答正确,你现在的总分为:"+Score);
            setscore(Score);
        }
        else
        {   j++;
            seti(j);
            message2.setText("你回答错误,还可以回答" + (3 - j) + "次。");
            if(j==3)
            {  setscore(Score);
                message2.setText("你错了三次了,小渣渣 你现在的总分为:"+score);
                seti(0);

            }
            if(j==4)
            {
                message2.setText("就算你做对了也没分了");
                return;
            }
        }
    }
    public void setscore(int sc) { this.score=sc;}
    public void setJTextField(JTextField...t){
        quenumber=t[0];
        textOne=t[1];
        textTwo=t[2];
        textResult=t[3];
    }
    public void setJLabel(JLabel...label){
        operatorLabel=label[0];
        message=label[1];
    }
    //文本标签排列顺序
}

创建框架

在框架内增添组件 ,并添加监听事件,展示整洁界面。

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import liaobiao.Question;
public class ComputerFrame extends JFrame  {
	
	private static final long serialVersionUID = -3815626439584100740L;
	JMenuBar menubar;
	JMenu choiceGrade;
	JMenuItem grade1,grade2;
	JTextField textOne,textTwo,textResult,quenumber;
	JButton getProblem,giveAnswer;
	JLabel operatorLabel,message;
	
	ComputerFrame()
	{   
		Question que=new Question();
		que.setMaxInteger(20);
		setLayout(new FlowLayout());
		menubar=new JMenuBar();
		choiceGrade=new JMenu("选择级别");
		grade1=new JMenuItem("低年级");
		grade2=new JMenuItem("高年级");
		grade1.addActionListener(
		new ActionListener(){
			public void actionPerformed(ActionEvent e){que.setMaxInteger(20);}}
		);//低年级题库事件
		grade2.addActionListener(
		new ActionListener(){
			public void actionPerformed(ActionEvent e){que.setMaxInteger(100);}}
		);//高年级题库事件
		choiceGrade.add(grade1);
		choiceGrade.add(grade2);//添加监听事件
		menubar.add(choiceGrade);
		setJMenuBar(menubar);
		quenumber=new JTextField(2);
		textOne=new JTextField(5);
		textTwo=new JTextField(5);
		textResult=new JTextField(5);
		operatorLabel=new JLabel("+");
		operatorLabel.setFont(new Font("Arial",Font.BOLD,20));
		message=new JLabel("你还没有回答呢");
		getProblem=new JButton("获取题目");
		giveAnswer=new JButton("获取答案");
//添加组件
		add(quenumber);
		add(textOne);
		add(operatorLabel);
		add(textTwo);
		add(new JLabel("="));
		add(textResult);
		add(giveAnswer);
		add(message);
		add(getProblem);
		textResult.requestFocus();
		textOne.setEditable(false);
		textTwo.setEditable(false);
		quenumber.setEditable(false);
		getProblem.setActionCommand("getProblem");
		textResult.setActionCommand("answer");
		giveAnswer.setActionCommand("answer");
//设置监听事件的命令法号
		que.setJTextField(quenumber,textOne,textTwo,textResult);
		que.setJLabel(operatorLabel,message);
		getProblem.addActionListener(que);	
		giveAnswer.addActionListener(que);
		textResult.addActionListener(que);
//添加监听事件
		setVisible(true);
		validate();
		setDefaultCloseOperation(DISPOSE_ON_CLOSE);
	}
}

主函数

public class Main   {
	    int i=0;
		public static void main(String[] args) {		
			ComputerFrame frame=new ComputerFrame();			
			frame.setTitle("算数测试");
			frame.setBounds(300,150,650,180);							
		}
		public int geti()
		{return i;}
		public void seti(int k)
		{this.i=k;	}		
}

运行界面

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

  • 0
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值