各位大侠,小弟刚工作不久,这次要做个Java打字测试的程序.....要求上面显示一行文字(中文,英文,符号),在下面输入栏中对照上面显示的输入,要是输入正确了,上面的对应位置字符背景变色,错误了用另外一个颜色标示出来.最后可以统计本次测试的正确率,速度.  ----------望各位大哥能给出自己宝贵的建议,要有相关的源码希望能发给小弟参考一下..谢过了...........

解决方案 »

  1.   

    先从本机上创建多篇文章(.txt),用户选择文章,并且读取到程序界面中。
    每按下空格键后就与当前正确的字符比较(可事先加载到足够多的缓冲区中),然后光标下移一位。
    如果是退格键的话,就光标上移一位,并清除它的内容,比较字符的位置也要上移一位(可用栈来处理)。
    个人一点想法。
      

  2.   

    import java.awt.event.*;
    import java.awt.*;
    import java.util.Date;
    public class MyPanel extends  Panel 
    {public MyPanel(Color bgcolor)
     {this.setBackground(bgcolor);
     for(int k=0;k<100;k++)
     {xiaoshi[k]=true;}
      p1.add(new MenuItem("增加字母数目"));
      p1.add(new MenuItem("加快下落速度"));
      p1.add(new MenuItem("加快变化速度"));
      p1.add(new MenuItem("加快时间间隔"));
      p1.addSeparator();
      
      p1.add(new MenuItem("减少字母数目"));
      p1.add(new MenuItem("减少下落速度"));
       p1.add(new MenuItem("降低变化速度"));
        p1.add(new MenuItem("减缓时间间隔"));
    xuanze(6);
    for(int i=0;i<6;i++)
    {fenshu+=zeng[i];}
      this.add(p1);
     
      
      
      
    //xuanze(27);
     
     } int mey=2;
      int ss;
      int es;
      int start=0;
      int hour=0;
      int minute=0;
      int fenshu=0;
     Date d1;
     Date d2;
     int shot=0;
     public String changestr(double a)
     {String str="0.0000";
     try{ str=""+String.valueOf(a);
      str=str.substring(0,5);}
      catch(Exception exc){}
     return str;}
    PopupMenu p1=new PopupMenu(); boolean reda,greena,bluea; int w;int h;
     int xuhao[]=new int[26];
     Image backimg;
     Graphics backg;
     int num=6;
     int score=0;
     int total=0;
     char zifu[]=new char[26];
     boolean up=true;
     
     int jiji=0;
     public void xuanze(int num)
     {jiji=0;
     total+=num;for(int k=0;k<num;k++)
     {xiaoshi[k]=true;}
     if(num>=26){xuhao[25]=25;num=25;}
      else if(num<=1){num=1;}int number1=0;
     int number=0;
      for(int i1=0;i1<num;i1++){
      if(num<=24){
       number1=26;}
      else{ number1=25;  }
      number=(int)(Math.floor((number1*Math.random()))); while(selected(number,i1))
     { number=(int)(Math.floor((number1*Math.random()))); 
     //System.out.println(number+"");
     }
         xuhao[i1]=number; //System.out.println(""+xuhao[i1]+" "+i1+"");
      }
      
     } public boolean selected(int number,int ii)
     {for(int j=0;j<ii;j++)
      {if(number==xuhao[j])
       return true;}
     return false;}
     int i=0;
     int delay=100;
     int add=3;int dd=0;
    public void update(Graphics g)
    {i++;
     
    w=size().width;
    h=size().height;
    if(i<=1){d1=new Date();ss=d1.getSeconds();}
    if((i%4==0))
    {
    d2=new Date();es=d2.getSeconds();
    if(es<ss){es+=60;}start=es-ss;if(start<=60&&start>=59){if(xiaoshi[95])
    minute++;
     xiaoshi[95]=false;
      }
    if(minute==60){
    if(xiaoshi[96]){
    minute=0;hour++;}
    xiaoshi[96]=false;
      }
    } if(red>=254){reda=false;}
     if(red<=1){reda=true;}
     if(green>=254){greena=false;}
     if(green<=1){greena=true;}
     if(blue>=252){bluea=false;}
     if(blue<=3){bluea=true;}
     if(i%5==0){
     if(reda){red++;}
       else{red--;}
     if(greena){green+=2;}else{green-=2;}
     if(bluea){blue+=3;}else{blue-=3;}}
     
     backg.setColor(new Color(red,green,blue));
     backg.fillRect(0,0,w,h);
     backg.setFont(null);
    backg.setColor(Color.white);
    String defenlv=changestr(((double)(score)/(double)(fenshu)*100));
    int sudu=shot*60/(hour*3600+minute*60+start+1);
    String mingzhonglv=changestr(((double)shot/(double)(total)*100));
    backg.drawString("字母数:"+num+" 用时"+hour+":"+minute+":"+start+" 发出:"+total+" 命中:"+shot+" 得分:"+score+" 应得:"+fenshu+" 速度:"+sudu+"键/分"+" 命中率:"+mingzhonglv+"%"+" 得分率"+defenlv+"%",5,20);
     if(i%delay==0){xuanze(num);
    xiaoshi[95]=true;
    xiaoshi[96]=true;
     px=new int[num];
     zeng=new int[num];
     py=new int[num];
     mey=mey=(int)(num*Math.random())-1;
     for(int k=0;k<num;k++){
     px[k]=(int)((w-20)*Math.random());
     if(k<mey){py[k]=(int)((20)*Math.random())+size().height-20;}
     else{{py[k]=(int)((20)*Math.random());}}
     zeng[k]=(int)(juli*Math.random())+1;fenshu+=zeng[k];
     }}
    paint(g);}
    int zeng[]={3,5,3,7,4,2};
    int juli=6;
    int red=133;int green=157;int blue=244;
    public void drawchar(Graphics g,int x,int y,char key)
    {g.setColor(Color.orange);
    g.fillOval(x,y,20,20);
    g.setColor(Color.blue);
    g.setFont(new Font("TimesRoma",Font.BOLD,24));
    g.drawString(""+(char)key,x+4,y+16);
    }
    int x=-1;
     public void paint(Graphics g)
     {
     if(backimg==null)
      { w=size().width;h=size().height;
     backimg=createImage(w,h);
     backg=backimg.getGraphics();
     if(i<=1)
     {}
      for(int i=0;i<zifu.length;i++)
      {zifu[i]=(char)(i+97);
     }
      
      }
       
    for(int k=0;k<num;k++)
    {//if(px[k]==null){px[k]=0;py[k]=0;}

    if(xiaoshi[k]){ if(k<mey){drawchar(backg,px[k],py[k]-=zeng[k],zifu[xuhao[k]]);}
    else{
    drawchar(backg,px[k],py[k]+=zeng[k],zifu[xuhao[k]]);}
    if(this.i%1000==0){drawchar(backg,px[k]+zeng[k],py[k]+=zeng[k],zifu[xuhao[k]]);}
    }
     
     }
     for(int k=0;k<num;k++)
     {
     if(xiaoshi[k]){
      if(x==xuhao[k]){xiaoshi[k]=false;shot++;score+=zeng[k];jiji++;
     backg.setColor(Color.orange);
     backg.fill3DRect(px[k]+6,py[k]+5,6,size().height-py[k],true);
    backg.setColor(Color.magenta);
    dddd=px[k]-15;
     backg.fill3DRect(px[k]-15,size().height-10,50,10,true);
     if(jiji==num){
     backg.setColor(new Color(red,green,blue));
     try{
     
     xuanze(num);
     for(int i=0;i<num;i++)
     fenshu+=zeng[i];
     }
     catch(Exception ex){}
    }}
    }}
     backg.setColor(new Color(255-red,255-green,255-blue));
     backg.fill3DRect(dddd,size().height-10,50,10,true);
     g.drawImage(backimg,0,0,w,h,this);
     if(up)
     {repaint(time);}}
     int time=30;
     boolean xiaoshi[]=new boolean[100];
     
     int px[]={80,255,170,240,290,350};int py[]={200,340,50,30,60,70};
    public boolean keyDown(Event e, int key)
    {if(up==false){up=true;repaint();}
    x=key-97;

    return super.keyDown(e, key);
    }
    public boolean keyUp(Event e, int key)
    {x=-1;

    return super.keyDown(e, key);
    } public boolean mouseDown(Event e, int p2, int p3)
    {
    if(e.metaDown())
    {up=false;
    p1.show(this,p2,p3);}
    else up=true;
    return super.mouseDown(e, p2, p3);
    }
    int dddd=200;
    public boolean action(Event e, Object what)
    {this.setCursor(new Cursor(Cursor.WAIT_CURSOR));
    if("增加字母数目".equals(what)){num++;
      if(num>=11){
      delay=(size().height-50)/(juli/2);}
      if(num>=26)num=26;xuanze(num);
     px=new int[num];
     zeng=new int[num];
     py=new int[num];
     mey=(int)(num*Math.random())-1;
      mey=(int)(num*Math.random())-1;
     for(int k=0;k<num;k++){
     px[k]=(int)((w-20)*Math.random());
     if(k<mey){py[k]=(int)((20)*Math.random())+size().height-20;}
     else{py[k]=(int)((20)*Math.random());}
     zeng[k]=(int)(juli*Math.random())+1;fenshu+=zeng[k];}}
     if("减少字母数目".equals(what)){num--;
       if(num>=11){delay=(size().height-50)/(juli/2);}
       if(num<=1)num=1;xuanze(num);
     px=new int[num];
     zeng=new int[num];
     py=new int[num]; mey=(int)(num*Math.random())-1;
     for(int k=0;k<num;k++){
     px[k]=(int)((w-20)*Math.random());
     if(k<mey){py[k]=(int)((20)*Math.random())+size().width-20;}
     else{py[k]=(int)((20)*Math.random());}
     zeng[k]=(int)(juli*Math.random())+1;fenshu+=zeng[k];}}
     if("加快下落速度".equals(what)){juli+=3;}
     if("加快变化速度".equals(what)){delay-=5;if(delay<=10){delay=10;}}
    if("加快时间间隔".equals(what)){time+=3;}
    if("减少下落速度".equals(what)){juli-=3;if(juli<=3){juli=3;}}
     if("降低变化速度".equals(what)){delay+=5;}
     if("减缓时间间隔".equals(what)){time-=3;if(time<=4){time=4;}}
     this.setCursor(new Cursor(Cursor.DEFAULT_CURSOR));
     up=true;
     

    return super.action(e, what);
    }
     
    }
      

  3.   

    step1.先从本机上创建多篇文章(.txt),用户选择文章,并且读取到程序界面中。
    step2.每按下空格键后就与当前正确的字符比较(可事先加载到足够多的缓冲区中),然后光标下移一位。
    step3.如果是退格键的话,就光标上移一位,并清除它的内容,比较字符的位置也要上移一位(可用栈来处理)。
    setp4.重复2,3。
    个人一点想法。