源程序如下,是一个java打字游戏
原帖及讨论地址:
点击下载该文件
 
 
炸弹是我玩1937特种兵的图标.反击的是QQ表情,呵呵
就地取材大家来看看哈
/*
游戏开始,从天上掉下10个有标号(字母)的炸弹,
下面有10颗子弹(就是可以按10个字母).
如果所按字母包含在炸弹中,就找到相应的炸弹并
消灭它,消灭后返回继续利用.如果没有就一直飞到天上最后才返回.
*/
import java.net.*;
import java.awt.*;
import java.awt.event.*;
import java.applet.*;
import javax.swing.*;
public class paodan extends Applet implements Runnable,KeyListener
{
private Image bgImage;
private Graphics bg;
static Thread myThread;
static AudioClip ac1,ac2;
static JFrame md;
String Zi26="";
String pd[]={"a","a","a","a","a","a","a","a","a","a"}; //用来存储10个字母做落下的炮弹
String fj[]={"","","","","","","","","",""}; //用来存储10个字母做反击的防空
int x[]=new int[10]; 
int y[]=new int[10]; 
//炸弹的坐标
int x1[]=new int[10]; 
int x2[]=new int[10];
int y1[]=new int[10]; 
//火箭的坐标
int life=100;  //生命
Toolkit KIT=this.getToolkit();
Image paodan=KIT.createImage("paodan.jpg");
Image huojian=KIT.createImage("huojian.jpg");public paodan() //用来生成一个包含26个英文字母的字符串Zi26
{for (int i=0;i<26;i++)
  Zi26+=(char)((int)'A'+i);
}
public void cushi() //初始各种数据,如炮弹与火箭的坐标.
{  
    try
    {URL u1=this.getClass().getResource("huishou.wav");
     URL u2=this.getClass().getResource("lanjie.wav");
     ac1=Applet.newAudioClip(u1);
     ac2=Applet.newAudioClip(u2);
    }catch(Exception e){}   for (int i=0;i<10;i++)
   {pd[i]=noRepeat();
    x[i]=noHit(i,10); 
    if (i>=5)
    y[i]=5+(int)(Math.random()*50);
    else 
    y[i]=60+(int)(Math.random()*50);
    x1[i]=220+i*32+1; y1[i]=550;
    x2[i]=x1[i];
   }
}public void panduan() //用来判断pd[i]的y值是否要到达屏幕下边,如果是就把Y值变为5,并把所有Y值加3.
{ for(int i=0;i<10;i++)
   { if (y[i]>=500)
     {life--;ac1.play();y[i]=5;}
     y[i]+=3;
     if (life==0) System.exit(0);
   }
   y[9]+=3;
   md.setTitle("打字训练室                你的生命为"+life+"             提示:白色的字母表示未按,粉红色的表示已按.");
   
}public void fk() //防空程序,用来击毁落下的炸弹
{ int i=0,j=0;
      for (i=0;i<10;i++)
      {  if (!fj[i].equals(""))
         {
           for (j=0;j<10;j++)
           if (fj[i].equals(pd[j]))
           {   if (!(x1[i]>=x[j] && x1[i]<=x[j]+32 || x1[i]+32>=x[j] && x1[i]+32<=x[j]+32))
               if (x1[i]>x[j])
               x1[i]-=4;
               else x1[i]+=4;
               
               if (!(y1[i]>=y[j] && y1[i]<=y[j]+32 || y1[i]+32>=y[j] && y1[i]+32<=y[j]+32))
               if (y1[i]>y[j])
               y1[i]-=3;
               else y1[i]+=4; 
               
               if (y[j]>=380 && Math.abs(x[j]-x1[i])>5) 
               if (x[j]>x1[i]) x1[i]+=5;
               else if (x[j]<x1[i]) x1[i]-=5;
                
               if (y[j]>=380 && Math.abs(y[j]-y1[i])>5) 
               if (y[j]>y1[i]) y1[i]+=5;
               else if (y[j]<y1[i]) y1[i]-=5;
               
               
                if ((x1[i]>=x[j] && x1[i]<=x[j]+32 || x1[i]+32>=x[j] && x1[i]+32<=x[j]+32) && (y1[i]>=y[j] && y1[i]<=y[j]+32 || y1[i]+32>=y[j] && y1[i]+32<=y[j]+32))
                {life++;ac2.play();pd[j]=noRepeat(); x[j]=noHit(i,10); y[j]=5; x1[i]=x2[i];y1[i]=550;fj[i]="";}
               break;
           }
           if (j==10)  y1[i]-=3;
           if (y1[i]<=5) {y1[i]=550; fj[i]="";}
         }          
      }
}
public void paint(Graphics g) 
//根据相应的坐标在屏幕上画炸弹和吃炸弹的娃娃,并保证白色的字母表示未按,粉红色的表示已按
{int i=0,j=0;
  g.setFont(new Font("Vrinda",1,21));
  for(;i<pd.length;i++)
    { for (j=0;j<fj.length;j++)
      if (pd[i].equals(fj[j]))
      {g.setColor(new Color(255,93,55));
       g.drawImage(paodan,x[i],y[i],this);
       g.drawString(pd[i],x[i]+11,y[i]+20);
       break;
      }
      
      if (j==fj.length)
      {g.setColor(new Color(255,255,255));
       g.drawImage(paodan,x[i],y[i],this);
       g.drawString(pd[i],x[i]+11,y[i]+20);
      }
      g.setColor(new Color(255,93,55));
      g.drawImage(huojian,x1[i],y1[i],this);
      g.drawString(fj[i],x1[i]+10,y1[i]+22);
    }
   
}
//没有按的显红色,按了的显白色
public void keyPressed(KeyEvent k) //当用户按的是字母时,就生成一个防空字母.
{char z=k.getKeyChar();
   int i=0,j=0;
   if ((z>='A' && z<='Z') || (z>='a' && z<='z'))
   {  if (z-32>=65) z-=32;
      String zc=""+z;
      for(;i<fj.length;i++)
      {  if (zc.equals(fj[i])) break;
      } //保证字母不重复    
      if (i==fj.length)
      for(i=0;i<fj.length;i++)
      if (fj[i].equals("")) {fj[i]=zc;break;}
     
         }
}public void keyReleased(KeyEvent k){}
public void keyTyped(KeyEvent k){}public String noRepeat() //生成一个不重复的字母.
{int zc,i;
  String xinx;
  while(true)
       {zc=(int)(Math.random()*26);
        xinx=Zi26.substring(zc,zc+1);
        for(i=0;i<10;i++)
        if (pd[i].equals(xinx))  break;
        if(i==10)  return xinx; 
       }
}int noHit(int i,int langth) //让字母保持车距.
{int tmpX,j,k,width=32;
     while (true)    
           { tmpX=(int)(Math.random()*768)+1;
             for(j=0;j<10;j++)
             {   if (tmpX+width<x[j] || tmpX>x[j]+width) continue; //如果欲生成的位置不与当前J所占的位置相交就判断下一个J.
                  if ((tmpX>=x[j] && tmpX<=x[j]+width) || (tmpX+width>=x[j] && tmpX+width<=x[j]+width)) break; 
                    //如果欲生成的位置与当前x[j]所占据的范围相交就结束循环,重新生成一个起始位置.
                   
             }
             if (j==10) {return tmpX;}
           }   
}
public void update(Graphics g)
{if (bgImage==null)
     {bgImage=createImage(this.getSize().width,this.getSize().height);
      bg=bgImage.getGraphics();
     }
  bg.setColor(getBackground());
  bg.fillRect(0,0,this.getSize().width,this.getSize().height);
  //bg.setColor(getForeground());
  paint(bg);
  g.drawImage(bgImage,0,0,this);
}public void run() //用线程循环更改Y值,并根据新的坐标在屏幕上重画pd[I];
{
   while(true)
    {fk();
     panduan();
     repaint();
     try{ myThread.sleep(50);    }catch(Exception e) {}
    }
}
public static void main(String args[])
{paodan m=new paodan();
  md=new JFrame("打字训练室");
  md.setSize(800,600);
  md.addKeyListener(m);
  md.getContentPane().add(m);
  m.cushi();
  md.setVisible(true);
  md.setResizable(false);
  myThread=new Thread(m);
  myThread.start();
}
}现在这个程序是没有问题的!
问题是我每次按钮添加都出现问题,困饶我很久了!,那位好心人可以帮下忙!

解决方案 »

  1.   

    补充一个,例如我想加一个按钮入主面板如下
     static JPanel panel=new JPanel();
    static JButton button=new JButton("kyo");然后我在main()函数中这样写
    panel.add(button);
    frame.add(panel,BorderLayout.WEST);
    但是运行程序却动不了!请问是什么原因!~
    还有那位大侠可以解决,用什么方法都可以!~