一. 需求分析

曾几何时,游戏是海洛因的代名词,让人与玩物丧志联系在一起。一度遭到社会反感和家长抵制。可是。随着互联网的发展,和游戏潜在优点被发现。游戏的价值開始逐渐被社会认可,人们開始接受、认识和了解游戏带来的诸多优点。

如今学生的课业负担重,娱乐时间少,人际交往少,烦恼和压力也因此对应添加。事实上玩游戏不仅帮助学生调节情绪,还能够锻炼与提高他们的反应能力和手脑的高速配合能力。同一时候帮助他们了解电脑和网络知识等。可谓是一举多得。

据调查显示,常常玩游戏的学生思维活跃、善于表达、情绪乐观,解决这个问题时会更加灵活。

白天在学校忙了一整天的功课。晚上须要一种轻松的方式来自我舒缓压力,放松情绪。于是游戏就非常好的满足了这样的需求,《棒打猪头》操作简单。画面美丽。任由发挥,玩后能够获得极大的满足感和放松。

棒打猪头是一款简单的单机小型游戏。适合青少年学生的课后娱乐。在这款游戏执行时,在游戏界面的九个暗格会随机弹出一头小猪,用鼠标控制的小锤点击。游戏会參照玩家打击小猪的速度和个数积分。

二. 程序描写叙述

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));
}
}

java小游戏代码的更多相关文章

  1. 寒假答辩作品:Java小游戏

    目录 java入门小游戏[test] 游戏界面 前言 (可直接跳到程序介绍) 前期入门小项目 前期收获 后期自创关卡 后续 java入门小游戏[test] 游戏界面 github地址: https:/ ...

  2. java俄罗斯方块游戏代码

    java俄罗斯方块游戏代码: package com; import java.awt.Color; import java.awt.Graphics; import java.awt.event.K ...

  3. Java小游戏

    这是一个飞机躲避子弹的小游戏,其中有许多干货 这是蒟蒻我第二次做,请各位大佬多多指教 目录 1.游戏主窗口的创建 2.图形绘制_文本绘制_颜色改变_图像对象的加载 3.线程内部类实现动画 4.游戏物体 ...

  4. 2048小游戏代码解析 C语言版

    2048小游戏,也算是风靡一时的益智游戏.其背后实现的逻辑比较简单,代码量不算多,而且趣味性强,适合作为有语言基础的童鞋来加强编程训练.本篇分析2048小游戏的C语言实现代码. 前言 游戏截图:  游 ...

  5. 猜生日 Java小游戏

    最近看到一个很有趣的小游戏: 询问朋友5个问题,找到他出生在一个月的哪一天.每个问题都是询问他的生日是否是5个数字集合中的一个. 这5个集合分别是: set1:1 3 5 7 9 11 13 15 1 ...

  6. JAVA小游戏之两个物体碰撞产生的碰撞检测

    首先必须了解两个物体,在移动时,会有怎样的效果,比如沪我们小时候耍过的坦克大战.看起来很简单,但是写起代码来,复杂的要多: 下面举个例子: // 构造一个新的 Rectangle,其左上角的坐标为 ( ...

  7. Java小游戏贪吃蛇

    package snake; import java.awt.BorderLayout;import java.awt.Canvas;import java.awt.Color;import java ...

  8. java小游戏java九宫格

    问题来源于吾爱破解https://www.52pojie.cn/thread-1484202-1-1.html 编程目标一:根据下面的"游戏说明",实现该游戏程序,完成响应用户的输 ...

  9. 一款WP小游戏代码分享

    首先声明游戏是H5的代码,当然游戏部分不是我写的,感谢@LeZhi的分享,关于H5我还在学习,这里只是简单介绍一下如何把一款现成的H5游戏封装成一款WP游戏(当然也可以做成Windows游戏). 大家 ...

随机推荐

  1. STL模板整理 Binary search(二分查找)

    前言: 之前做题二分都是手动二分造轮子,用起来总是差强人意,后来看到STL才发现前辈们早就把轮子造好了,不得不说比自己手动实现好多了. 常用操作 1.头文件 #include <algorith ...

  2. HDU 6166 Senior Pan (最短路变形)

    题目链接 Problem Description Senior Pan fails in his discrete math exam again. So he asks Master ZKC to ...

  3. Java 中List 集合索引遍历与迭代器遍历

    package yzhou.iterator; import java.util.ArrayList; import java.util.HashSet; import java.util.Itera ...

  4. 剑指offer-二叉查找树的第 K 个结点

    /** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * Tre ...

  5. bWAPP练习--injection篇之HTML Injection - Reflected (GET)

    什么是Injection? injection,中文意思就是注入的意思,常见的注入漏洞就是SQL注入啦,是现在应用最广泛,杀伤力很大的漏洞. 什么是HTML injection? 有交互才会产生漏洞, ...

  6. 【大杀器】利用划分树秒杀区间内第k大的数

    最近看了一道题,大概就是给出一个序列,不断询问其子区间内第k大的数,下面是个截图 绕了一圈没找到中文版题目,if(你是大佬) then 去看截图:else{我来解释:给出一个整数n,和一个整数m,分别 ...

  7. Thupc2017"礼"?

    题面 先粘上gouzhi的题面,听说是thupc的题 [问题背景] 情人节要到了,zhx 要给女朋友买礼物. [问题描述] 橱窗里摆放了 n 种不同的玩偶,购买第 i 种玩偶需要价格 a[i],价值为 ...

  8. JZYZOJ1372 [noi2002]荒岛野人 扩展欧几里得

    http://172.20.6.3/Problem_Show.asp?id=1372 想法其实很好想,但是我扩展欧几里得还是用得不熟练,几乎是硬套模板,大概因为今天一个下午状态都不大好.扩展欧几里得算 ...

  9. 【极角排序】【扫描线】hdu6127 Hard challenge

    平面上n个点,每个点带权,任意两点间都有连线,连线的权值为两端点权值之积.没有两点连线过原点.让你画一条过原点直线,把平面分成两部分,使得直线穿过的连线的权值和最大. 就把点极角排序后,扫过去,一侧的 ...

  10. Hibernate 的HQL,QBC 查询语言

    1.HQL:(Hibernate Query Language) 是面向对象的查询语言 1.实体查询 public void testQueryAllDept(){ String hql=" ...