原帖及讨论地址: 点击下载该文件 炸弹是我玩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(); } }
 
说明:本教程来源互联网或网友上传或出版商,仅为学习研究或媒体推广,wanshiok.com不保证资料的完整性。
|