下面有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=0i<26i++)
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=0i<10i++)
{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+1y1[i]=550
x2[i]=x1[i]
}
}
public void panduan() //用来判断pd[i]的y值是否要到达屏幕下边,如果是就把Y值变为5,并把所有Y值加3.
{ for(int i=0i<10i++)
{ 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=0i<10i++)
{ if (!fj[i].equals(""))
{
for (j=0j<10j++)
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]=5x1[i]=x2[i]y1[i]=550fj[i]=""}
break
}
if (j==10) y1[i]-=3
if (y1[i]<=5) {y1[i]=550fj[i]=""}
}
}
}
public void paint(Graphics g)
//根据相应的坐标在屏幕上画炸弹和吃炸弹的娃娃,并保证白色的字母表示未按,粉红色的表示已按
{int i=0,j=0
g.setFont(new Font("Vrinda",1,21))
for(i<pd.lengthi++)
{ for (j=0j<fj.lengthj++)
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.lengthi++)
{ if (zc.equals(fj[i])) break
} //保证字母不重复
if (i==fj.length)
for(i=0i<fj.lengthi++)
if (fj[i].equals("")) {fj[i]=zcbreak}
}
}
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=0i<10i++)
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=0j<10j++)
{ 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()
}
}
注:源代码取自编程中国
本人一点建议:其实你这样学Java是没用的,你应该知道你做的项目思想,先做什么后做什么,然后在亲自动手去敲代码!一点建议!
import java.util.*public class RandomChar {
public static void main(String[] args) {
Random random =new Random()
int r = 0
while(true){
r = random.nextInt(57) + 65
if(r>90&&r<97||r==0)continue
break
}
char a = (char)r
System.out.print(a)
}
}
它可以随机产生一个字母,返回的有可能是大写或者小写。因为大写字母是从65-90小写是从97-122,所以从65-122一共是57个。
但是91-96这中间的几个不是字母,所以假如取到它们了的话,就重新取值。
时间差没有得到。。。double second = c2.get(Calendar.SECOND) - c1.get(Calendar.SECOND)
double minute = c2.get(Calendar.MINUTE) - c2.get(Calendar.MINUTE)
double hour = c2.get(Calendar.HOUR_OF_DAY) - c1.get(Calendar.HOUR_OF_DAY)
有错