當前位置:編程學習大全網 - 編程語言 - 程序設計:簡單字母打字遊戲(JAVA編寫)

程序設計:簡單字母打字遊戲(JAVA編寫)

/*

遊戲開始,從天上掉下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();

}

}

註:源代碼取自編程中國

本人壹點建議:其實妳這樣學Java是沒用的,妳應該知道妳做的項目思想,先做什麽後做什麽,然後在親自動手去敲代碼!壹點建議!

  • 上一篇:鉆石鏈編程
  • 下一篇:C#中獲取多網卡指定IPv4地址的MAC地址
  • copyright 2024編程學習大全網