一. 需求分析
曾几何时,游戏是海洛因的代名词,让人与玩物丧志联系在一起。一度遭到社会反感和家长抵制。可是。随着互联网的发展,和游戏潜在优点被发现。游戏的价值開始逐渐被社会认可,人们開始接受、认识和了解游戏带来的诸多优点。
如今学生的课业负担重,娱乐时间少,人际交往少,烦恼和压力也因此对应添加。事实上玩游戏不仅帮助学生调节情绪,还能够锻炼与提高他们的反应能力和手脑的高速配合能力。同一时候帮助他们了解电脑和网络知识等。可谓是一举多得。
据调查显示,常常玩游戏的学生思维活跃、善于表达、情绪乐观,解决这个问题时会更加灵活。
白天在学校忙了一整天的功课。晚上须要一种轻松的方式来自我舒缓压力,放松情绪。于是游戏就非常好的满足了这样的需求,《棒打猪头》操作简单。画面美丽。任由发挥,玩后能够获得极大的满足感和放松。
棒打猪头是一款简单的单机小型游戏。适合青少年学生的课后娱乐。在这款游戏执行时,在游戏界面的九个暗格会随机弹出一头小猪,用鼠标控制的小锤点击。游戏会參照玩家打击小猪的速度和个数积分。
二. 程序描写叙述
2.1程序设计的目的
通过java开发技术课程的学习,我初步了解了怎样运用java语言编敲代码。课程结束后。按老师的要求,在查找资料后,我完毕了棒打猪头这个程序。
在这个过程中。主要达到了两个目的。一是检验和巩固专业知识,二是提高综合素养和能力。通过该程序的编写。能够将我课堂上掌握的理论知识与处理实际需求的能力相结合,以检验我掌握知识的宽度、深度及对知识的综合运用能力。
2.2程序设计的要求
(1) 《棒打猪头》是一种类似于打地鼠的游戏。程序界面的九个暗格会随机的出现一个猪头,玩家在用鼠标控制铁锤的移动和敲击动作(当鼠标按键被按下时)。
(2)在游戏中,当铁锤击中猪头时会添加分数(每击中一次加10分)。并将这个分数显示在状态栏上。
(3程序的主界面是可以给玩家一个清新自然、令人愉悦的游戏界面。
2.3程序设计的环境
Windows xp操作系统、Jcreator编辑工具、jdk1.7
3.1 游戏处理流程
本次游戏设计的处理流程例如以下图所看到的
3.2 程序的主要类、重要算法
游戏中有两个角色。一个是代表猪头的PigSprite 类,另一个是代表铁锤的HammerSprite 类,它们都是继承游戏主类SuperSprite 类而来。另一个不可或缺的游戏主类—HitPigHead 类。
游戏是有9个PigSprite 类实例和一个 HammerSprite 类实例所构成的。这些必要的类实例建立在游戏主类的中的init()方法中,而且在动画循环中转换角色的状态,在paint()方法中绘制角色本身。
因为铁锤角色有鼠标控制直接转换状态,因此在动画循环中仅仅有转换猪头角色的代码:
for(int i=0;i<9;i++) //转换猪头Sprite
pigSprite[i].updateState();
在paint()方法中要求角色绘制本身的程序代码例如以下:
//绘制猪头Sprite
for (int i=0;i<9;i++)
pigSprite[i].paintSprite(drawOffScreen);
//绘制铁锤Sprite
hammerSprite.paintSprite(drawOffScreen);
阐述挥动铁锤的动作:首先是挥动铁锤的动作,正确的处理是当按下鼠标左键是即显示hammer2,放开按键后显示hammer1,这是由铁锤Sprite 的updateState()方法来实现。
public void updateState()
{
//转换铁锤图像
if(currentImage==hammer1)
currentImage=hammer2;
else
currentImage=hammer1;
}
猪头角色的hit()方法可用来測试铁锤角色是否击中猪头角色,这里用到的碰撞侦測的技巧例如以下:
if((this.X+P_Width>=X) && (this.Y+(P_Height/2)>=Y)
&& (X+(H_Width/2)>=this.X) && (Y+(H_Height/2)>=this.Y) && showPig)
{
showPig=false;
return true;
}
else return false;
程序于当鼠标按键被按下时,侦測铁锤是否击中猪头,mousePressed()方法中的那段程序代码在调用hit()方法时进行侦測的动作:
//測试是否击中猪头sprite
for (int i=0;i<9;i++)
{
//假设击中则添加分数并将分数显示在状态列
if(pigSprite[i].hit(X,Y,FrameWidth,FrameHeight,HammerWidth,HammerHeight)==true)
{
score=score+10;
showStatus("眼下得分:"+score);
}
}
3.3程序执行结果
四、 心得体会
1)通过本学期的java的学习,我掌握了java语言的基本知识,通过java我又学习了非常多其它的实用的东西。比方算法,数据结构。
在了解了java之后我对java产生了浓厚的爱意。
2)通过这几周的实验。让我把这学期学的知识应用于实践之上,理论付之于实践真的非常难,掌握的基础知识開始根本不知道怎么组织。但我对java的爱是不可能就这样被扼杀的。
通过我的上网查,书上看。动动手。终於功夫不负有心人。
我顺利的完毕了实验。
3)这次实验让我对java的Swing编程的了解具体了不少,填补了我非常多的空缺。在实现功能的时候我懂得了算法对程序的重要性,一个好的算法能够让你的程序更健壮。编写的代码量更少。
处理异常一直是java里的常事。通过实验。我对一般的异常的处理更加有把握了。更加游刃有余。
4)学习的秘诀就是毅力加恒心。学习java也是一样的道理,我相信仅仅要我坚持一直走下去。java一定会成为我大展身手的舞台。
《棒打猪头》代码:
/** * @(#)HitPigHead.java * * * @author * @version 1.00 2012/6/4 */ import java.awt.*; import java.util.*; import java.applet.*; import java.awt.event.*; abstract class SuperSprite { int X,Y,width,height; boolean visible,active; abstract public void paintSprite(Graphics g); abstract public void updateState(); public int getX() { return X; } public int getY() { return Y; } public void setLocation(int X,int Y) { this.X=X; this.Y=Y; } public int getWidth() { return width; } public int getHeight() { return height; } public void setSize(int width,int height) { this.width=width; this.height=height; } public boolean canVisible() { return visible; } public void setVisible(boolean v) { visible=v; } public boolean canMove() { return active; } public void setMove(boolean m) { active=m; } } class PigSprite extends SuperSprite //猪头Sprite { int seed; //产生随机数 Image SpriteImage,Frame; //Sprite本身的图像 Applet Game; //在绘制图像时会用到 Random R; boolean showPig; //绘制猪头图像 public PigSprite(Image SpriteImage,Image Frame,Applet Game) { R=new Random(); this.SpriteImage=SpriteImage; this.Frame =Frame; this.Game=Game; showPig=false; setVisible(true); //可见 setMove(true); //可移动 } public void updateState() { if(active==true) { //转换猪头图像出现与消失的状态 if(R.nextInt(seed)%100<1) { if(showPig==false) showPig=true; } else if(R.nextInt(seed)%100 > 95) { if(showPig==true) showPig=false; } } } public void paintSprite(Graphics g) //绘制猪头Sprite { if(visible == true) { g.drawImage(Frame,X,Y,Game); //在最后一个參数中输入Applet if(showPig == true) g.drawImage(SpriteImage,X+12,Y+18,Game); } } public void setSeed(int seed) { this.seed=seed; } //測试是否击中猪头 public boolean hit(int X,int Y,int P_Width,int P_Height,int H_Width,int H_Height) { if((this.X+P_Width>=X) && (this.Y+(P_Height/2)>=Y) && (X+(H_Width/2)>=this.X) && (Y+(H_Height/2)>=this.Y) && showPig) { showPig=false; return true; } else return false; } } class HammerSprite extends SuperSprite //铁锤Sprite { Image hammer1,hammer2,currentImage; //铁锤图像 Applet Game; //在绘制图像时会用到 public HammerSprite(Image hammer1,Image hammer2,Applet Game) { this.hammer1=hammer1; this.hammer2=hammer2; this.Game=Game; currentImage=hammer1; setLocation(0,0); setVisible(false); //不可见 setMove(false); //不可移动 } public void updateState() { //转换铁锤图像 if(currentImage==hammer1) currentImage=hammer2; else currentImage=hammer1; } public void paintSprite(Graphics g) //绘制铁锤Sprite { if(visible == true) g.drawImage(currentImage,X,Y,Game); //在最后一个參数中输入Applet } } public class HitPigHead extends Applet //定义游戏主类 implements Runnable,MouseListener,MouseMotionListener { int AppletWidth,AppletHeight,FrameWidth,FrameHeight,countX,countY,HammerWidth,HammerHeight,score; Image frame,pig,hammer1,hammer2,OffScreen; Thread newThread; Graphics drawOffScreen; MediaTracker MT; PigSprite pigSprite []; HammerSprite hammerSprite; public void init() { addMouseListener(this); //注冊时间处理方法 addMouseMotionListener(this); AppletWidth = getSize().width; AppletHeight = getSize().height; countX=3; //X轴3个猪头texture countY=3; //Y轴3个猪头texture score=0; //记录分数 //使用MediaTracker追踪图像 MT = new MediaTracker(this); pig = getImage(getDocumentBase(),"Images/pig1.gif"); frame = getImage(getDocumentBase(),"Images/frame1.gif"); hammer1 = getImage(getDocumentBase(),"Images/hammer1.gif"); hammer2= getImage(getDocumentBase(),"Images/hammer2.gif"); MT.addImage(pig,0); MT.addImage(frame,0); MT.addImage(hammer1,0); MT.addImage(hammer2,0); try { MT.waitForAll(); } catch(InterruptedException E) { } //没有进行异常处理 FrameWidth=frame.getWidth(this); //猪头texture的宽度 FrameHeight=frame.getHeight(this); //猪头texture的高度 pigSprite =new PigSprite[9]; //使用9个猪头图像(3*3) for (int i=0;i<9;i++) { //建立猪头Sprite pigSprite[i]=new PigSprite(pig,frame,this); //设定位置 pigSprite[i].setLocation(i%countX*FrameWidth,i/countY*FrameHeight); pigSprite[i].setSeed(i+100); //设定随机数范围 } //建立铁锤Sprite hammerSprite=new HammerSprite(hammer1,hammer2,this); HammerWidth=hammer1.getWidth(this); //铁锤图像宽度 HammerHeight=hammer1.getHeight(this); //铁锤图像高度 //建立子画面 OffScreen=createImage(AppletWidth,AppletHeight); drawOffScreen=OffScreen.getGraphics(); resize(FrameWidth*countX,FrameHeight*countY); } public void start() //start()方法 { newThread=new Thread(this); //建立与启动新线程 newThread.start(); } public void stop() //stop()方法 { newThread=null; //将线程设为null } public void paint(Graphics g) { //仅仅清除此部分区域的图像 drawOffScreen.clearRect(0,0,AppletWidth,AppletHeight); //绘制猪头Sprite for (int i=0;i<9;i++) pigSprite[i].paintSprite(drawOffScreen); //绘制铁锤Sprite hammerSprite.paintSprite(drawOffScreen); //将子画面贴到主画面上 g.drawImage(OffScreen,0,0,this); } public void update(Graphics g) //update()方法 { paint(g); } public void run() { while(newThread!=null) { repaint(); //重画图像 try { Thread.sleep(33); //暂停33毫秒 } catch(InterruptedException E){} for(int i=0;i<9;i++) //转换猪头Sprite pigSprite[i].updateState(); } } //==========实现MouseListener界面====================== public void mouseExited(MouseEvent e) //鼠标离开Component { hammerSprite.setVisible(false); //不绘制铁锤Sprite hammerSprite.setLocation(0,0); //归位于原点 } public void mouseClicked(MouseEvent e){ } //鼠标按键被按下后放开 public void mouseEntered(MouseEvent e) //鼠标进入Component { hammerSprite.setVisible(true); //绘制铁锤Sprite hammerSprite.setLocation(e.getX()-(HammerWidth/2),e.getY()-(HammerHeight/2)); } public void mousePressed(MouseEvent e) //鼠标按键被按下 { hammerSprite.updateState(); //转换铁锤Sprite int X=hammerSprite.getX(); //取得铁锤Sprite的X坐标 int Y=hammerSprite.getY(); //取得铁锤Sprite的Y坐标 //測试是否击中猪头sprite for (int i=0;i<9;i++) { //假设击中则添加分数并将分数显示在状态列 if(pigSprite[i].hit(X,Y,FrameWidth,FrameHeight,HammerWidth,HammerHeight)==true) { score=score+10; showStatus("眼下得分:"+score); } } } public void mouseReleased(MouseEvent e) //鼠标按键放开 { hammerSprite.updateState(); //转换铁锤Sprite } //=================实现MouseMotionListener界面================ public void mouseMoved(MouseEvent e) //鼠标移动时 { //将鼠标光标置于铁锤Sprite中央 hammerSprite.setLocation(e.getX()-(HammerWidth/2),e.getY()-(HammerHeight/2)); } public void mouseDragged(MouseEvent e) //鼠标拖曳时 { //将鼠标光标置于铁锤Sprite中央 hammerSprite.setLocation(e.getX()-(HammerWidth/2),e.getY()-(HammerHeight/2)); } }