查看: 1935|回复: 0

[Java代码] 非常实用的java自动答题计时计分器

发表于 2018-2-25 08:00:00

该小程序使用java语言编写,让用户计算10以内的加减乘除法,特别适合小学开始学习加减乘除法的学生,能很好地锻炼他们的运算能力,并过计分计时的游戏性质引起学习兴趣!

运行该程序会弹出一个窗口,按enter键开始答题,答完再按enter则进行计分和正确性判断,并出下一道题!每轮10道题,每题10分,答完自动计时记分,全程操作只需要按enter键,无其他按钮,幼儿园小学生都会玩!

并且在输入合法性方面,也做了相关校验和提示!欢迎大家发挥想象力,再此基础上再丰富和完善!

代码:

  1. package autoScore;
  2. import java.awt.Color;
  3. import java.awt.Font;
  4. import java.awt.Label;
  5. import java.awt.List;
  6. import java.awt.TextField;
  7. import java.awt.event.ActionEvent;
  8. import java.awt.event.KeyEvent;
  9. import java.awt.event.KeyListener;
  10. import java.text.DecimalFormat;
  11. import javax.swing.JFrame;
  12. public class AutoScore extends JFrame{
  13. Label labRule=new Label();//规则描述标签
  14. Label labA=new Label();//第一个数字标签
  15. Label labOp=new Label();//加减乘除标签
  16. Label labB=new Label();//第二个数字标签
  17. Label label5=new Label();//等于号“=”标签
  18. Label labWarn=new Label();//输入合法性校验提示标签
  19. Label labQues=new Label();//答题列表标签
  20. Label labResult=new Label();//判分标签
  21. TextField txtAnswer=new TextField();//输入答案输入框
  22. int total=0;//记录答题总数
  23. int right=0;//记录答题正确数量
  24. int error=0;//记录答题错误数量
  25. int score=0;//记录答题总分
  26. boolean isOver=false;//一轮结束后标识
  27. boolean isFirst=true;//程序第一次运行标识
  28. long startTime;//每一轮运行开始时间
  29. List listDisp=new List();//答题列表展示框
  30. List listScore=new List();//分数展示框
  31. public static void main(String[] args){
  32. AutoScore score=new AutoScore();
  33. }
  34. public AutoScore(){
  35. init();
  36. setSize(450,630);
  37. setDefaultCloseOperation(EXIT_ON_CLOSE);
  38. setVisible(true);
  39. }
  40. public void init(){
  41. setLayout(null);
  42. setSize(450,630);
  43. labRule.setText("规则:每组十道题,每题10分,按ENTER键开始,小数保留2位");
  44. labRule.setBounds(36, 10, 390, 72);
  45. labRule.setFont(new Font("Dialog",Font.PLAIN,12));
  46. getContentPane().add(labRule);
  47. labA.setText("x");
  48. labA.setBounds(36,82,36,36);
  49. labA.setFont(new Font("Dialog",Font.PLAIN,24));
  50. getContentPane().add(labA);
  51. labOp.setText("+");
  52. labOp.setFont(new Font("Dialog",Font.PLAIN,24));
  53. labOp.setBounds(72, 82, 45, 36);
  54. getContentPane().add(labOp);
  55. labB.setText("y");
  56. labB.setFont(new Font("Dialog",Font.PLAIN,24));
  57. labB.setBounds(118, 82, 33, 36);
  58. getContentPane().add(labB);
  59. label5.setText("=");
  60. label5.setFont(new Font("Dialog",Font.PLAIN,24));
  61. label5.setBounds(168, 82, 24, 36);
  62. getContentPane().add(label5);
  63. labWarn.setFont(new Font("Dialog",Font.PLAIN,12));
  64. labWarn.setBackground(Color.RED);
  65. labWarn.setBounds(320, 82, 80, 36);
  66. labWarn.setVisible(false);
  67. getContentPane().add(labWarn);
  68. labQues.setText("答题列表:");
  69. labQues.setFont(new Font("Dialog",Font.PLAIN,12));
  70. labQues.setBounds(36, 148, 100, 20);
  71. getContentPane().add(labQues);
  72. labResult.setText("分数统计:");
  73. labResult.setFont(new Font("Dialog",Font.PLAIN,12));
  74. labResult.setBounds(36,420,100,20);
  75. labResult.setVisible(false);
  76. getContentPane().add(labResult);
  77. txtAnswer.setFont(new Font("Dialog",Font.PLAIN,24));
  78. txtAnswer.setBounds(216, 82, 100, 36);
  79. getContentPane().add(txtAnswer);
  80. listDisp.setFont(new Font("Dialog",Font.PLAIN,16));
  81. listDisp.setBounds(36, 174, 282, 230);
  82. getContentPane().add(listDisp);
  83. listScore.setFont(new Font("Dialog",Font.PLAIN,16));
  84. listScore.setBounds(36,450,282,135);
  85. MyKey myKey=new MyKey();// 答案输入框,键盘按键监听类
  86. txtAnswer.addKeyListener(myKey);
  87. }
  88. class MyKey implements KeyListener{
  89. @Override
  90. public void keyTyped(KeyEvent e) {
  91. }
  92. @Override
  93. public void keyPressed(KeyEvent e) {
  94. if(e.getSource()==txtAnswer){
  95. if(e.getKeyCode()==KeyEvent.VK_ENTER){
  96. if(isOver || isFirst){
  97. updateQuestion(null);
  98. }else if("".equals(txtAnswer.getText())){
  99. labWarn.setText("请输入答案!");
  100. labWarn.setVisible(true);
  101. }else{
  102. labWarn.setVisible(false);
  103. if(!isNumber(txtAnswer.getText())){
  104. labWarn.setText("请输入数字!");
  105. labWarn.setVisible(true);
  106. }else if(total<9){
  107. judge(null);
  108. updateQuestion(null);
  109. }else{
  110. judge(null);
  111. labResult.setVisible(true);
  112. scorePerformed(null);
  113. }
  114. }
  115. }
  116. }
  117. }
  118. @Override
  119. public void keyReleased(KeyEvent e) {
  120. }
  121. }
  122. int a=0,b=0;
  123. String op="";
  124. double result=0;
  125. DecimalFormat df=new DecimalFormat("#.00");
  126. /**
  127. * 出题方法
  128. * @param e
  129. */
  130. public void updateQuestion(ActionEvent e){
  131. if(isFirst){
  132. startTime=System.currentTimeMillis();
  133. }
  134. if(isOver==true){
  135. listDisp.clear();
  136. listScore.clear();
  137. labResult.setVisible(false);
  138. listScore.setVisible(false);
  139. }
  140. isOver=false;
  141. a=(int)(Math.random()*9+1);
  142. b=(int)(Math.random()*9+1);
  143. int c=(int)(Math.random()*4);
  144. switch (c) {
  145. case 0:
  146. op="+";
  147. result=a+b;
  148. break;
  149. case 1:
  150. op="-";
  151. result=a-b;
  152. break;
  153. case 2:
  154. op="*";
  155. result=a*b;
  156. break;
  157. case 3:
  158. op="/";
  159. result=(a*1.0)/b;
  160. //若两个数除不尽,则按四舍五入保留2位小数
  161. if(String.valueOf(result).length()>10){
  162. result=Double.parseDouble(df.format((a*1.0)/b));
  163. }
  164. break;
  165. }
  166. labA.setText(String.valueOf(a));
  167. labB.setText(String.valueOf(b));
  168. labOp.setText(op);
  169. label5.setText("=");
  170. txtAnswer.setText("");
  171. isFirst=false;
  172. }
  173. /**
  174. * 判断结果
  175. * @param e
  176. */
  177. public void judge(ActionEvent e){
  178. try{
  179. double value=Double.parseDouble(txtAnswer.getText());
  180. String resultStr=(total+1)+"、 "+a+op+b+"="+value;
  181. if(value==result){
  182. resultStr+=" \t正确";
  183. right++;
  184. score+=10;
  185. }else{
  186. resultStr+=" \t错误 正确答案:"+result;
  187. error++;
  188. }
  189. listDisp.add(resultStr);
  190. total++;
  191. }catch(NumberFormatException ignored){
  192. }
  193. }
  194. /**
  195. * 统计分数
  196. * @param e
  197. */
  198. public void scorePerformed(ActionEvent e){
  199. isOver=true;
  200. listScore.clear();
  201. listScore.setVisible(true);
  202. String exitStr="本次共答题"+total+"道";
  203. listScore.add(exitStr);
  204. listScore.add("累计用时:"+(System.currentTimeMillis()-startTime)/1000+"秒");
  205. listScore.add("答对:"+right+"个");
  206. listScore.add("答错:"+error+"个");
  207. listScore.add("得分:"+score+"分");
  208. getContentPane().add(listScore);
  209. score=0;
  210. right=0;
  211. error=0;
  212. total=0;
  213. }
  214. /**
  215. * 校验输入是否位数字
  216. * @param numberStr
  217. * @return
  218. */
  219. public boolean isNumber(String numberStr){
  220. boolean isNumber=true;
  221. try{
  222. Double.parseDouble(numberStr);
  223. }catch(NumberFormatException e){
  224. isNumber=false;
  225. }
  226. return isNumber;
  227. }
  228. }
复制代码

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持程序员之家。



回复

使用道具 举报