| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1317 人关注过本帖
标题:[原创]打字游戏^.^
取消只看楼主 加入收藏
走火
Rank: 1
等 级:新手上路
帖 子:426
专家分:0
注 册:2005-12-28
收藏
 问题点数:0 回复次数:7 
[原创]打字游戏^.^

[attach]11316[/attach]



炸弹是我玩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();
}

}



[此贴子已经被作者于2006-9-4 16:47:06编辑过]



Frp7QjVy.jpg (27.25 KB)
图片附件: 游客没有浏览图片的权限,请 登录注册


1Z7Ej5zY.jpg (28.17 KB)
图片附件: 游客没有浏览图片的权限,请 登录注册
搜索更多相关主题的帖子: 游戏 打字 
2006-09-03 14:28
走火
Rank: 1
等 级:新手上路
帖 子:426
专家分:0
注 册:2005-12-28
收藏
得分:0 

我是一只小菜鸟,请大家多多照顾! QQ 87135637
2006-09-03 17:51
走火
Rank: 1
等 级:新手上路
帖 子:426
专家分:0
注 册:2005-12-28
收藏
得分:0 

我是一只小菜鸟,请大家多多照顾! QQ 87135637
2006-09-03 18:17
走火
Rank: 1
等 级:新手上路
帖 子:426
专家分:0
注 册:2005-12-28
收藏
得分:0 
我还没报到名呢

我是一只小菜鸟,请大家多多照顾! QQ 87135637
2006-09-03 18:17
走火
Rank: 1
等 级:新手上路
帖 子:426
专家分:0
注 册:2005-12-28
收藏
得分:0 
晕,开学了呀
我读大一

我是一只小菜鸟,请大家多多照顾! QQ 87135637
2006-09-03 18:48
走火
Rank: 1
等 级:新手上路
帖 子:426
专家分:0
注 册:2005-12-28
收藏
得分:0 

我是一只小菜鸟,请大家多多照顾! QQ 87135637
2006-09-04 07:45
走火
Rank: 1
等 级:新手上路
帖 子:426
专家分:0
注 册:2005-12-28
收藏
得分:0 
谢谢了

我是一只小菜鸟,请大家多多照顾! QQ 87135637
2006-09-04 09:24
走火
Rank: 1
等 级:新手上路
帖 子:426
专家分:0
注 册:2005-12-28
收藏
得分:0 
以下是引用qsrock在2006-9-4 12:39:47的发言:
楼主!~自学的?
很厉害的说!~
y[i]=5+(int)(Math.random()*50);不是=5吗??好象不是随机数哦!~int)(Math.random()*50)=0吖!~

呵呵,就是因为自学的,
做的程序才这么混乱.

y[i]的值应该在5---54哈
怎么(int)(Math.random()*50)的值为=0呢,应该等于0-49.
要看清楚哈,我把 Math.random()*50 用()括起来的,(int)是针对那一个整体



楼上说的 打起卡确实有时存在.
因为算法太差,循环和判断太多
对机子要求有点高.
我不会优化.




我是一只小菜鸟,请大家多多照顾! QQ 87135637
2006-09-04 16:44
快速回复:[原创]打字游戏^.^
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.021435 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved