java小游戏代码

一. 需求分析

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

现在学生的课业负担重,娱乐时间少,人际交往少,烦恼和压力也因此相应增加。其实玩游戏不仅帮助学生调节情绪,还可以锻炼与提高他们的反应能力和手脑的快速配合能力,同时帮助他们了解电脑和网络知识等,可谓是一举多得。据调查显示,经常玩游戏的学生思维活跃、善于表达、情绪乐观,解决问题时会更加灵活。

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

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

二. 程序描述

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小游戏代码

时间: 2024-10-19 09:03:58

java小游戏代码的相关文章

《Java小游戏实现》:坦克大战(续一)

<Java小游戏实现>:坦克大战(续一) 上篇博文(http://blog.csdn.net/u010412719/article/details/51712663)只介绍到了能够控制一个坦克在4个方向上移动就结束了,今天就在此基础上继续完成一个一个的小功能. 完成的功能:根据键盘的按键控制一个坦克在8个方向上移动 要完成这个功能,我们要做一下几个事情 1.记录下键盘的按键情况,即要重写键盘按下和抬起的监听事件 采用4个boolean变量来记录,按下为true,抬起为false 具体实现的代码

Java小游戏之打飞机(二)

这篇文章本应昨天写的,可是真打算写的时候,CSDN博客维护,导致拖到了今天: 在上篇文章Java小游戏之打飞机(一)中已经详细介绍了该游戏的基本架构和需求分析,今天就详细写一写具体每个类的实现: 1)PlaneGameFrame类    ----游戏的主界面以及一些具体的飞机动作方法.碰撞检测等 代码: package plane; import java.awt.Color; import java.awt.Font; import java.awt.Graphics; import java

《Java小游戏实现》:坦克大战

<Java小游戏实现>:坦克大战 前面写了一个简单的聊天小程序,今天开始就写一个坦克大战的游戏,算是对Java相关小知识点的一个应用. 这个游戏的完成,我们也是分步完成,逐步累加,一个一个小功能的添加,最后直至完成整个游戏的开发. 第一步:写一个界面 public class TankClient extends JFrame{ public static void main(String[] args) { new TankClient().launchFrame(); } public v

《Java小游戏实现》:坦克大战(续2)

<Java小游戏实现>:坦克大战(续2) 相关博文: <Java小游戏实现>:坦克大战http://blog.csdn.net/u010412719/article/details/51712663 <Java小游戏实现>:坦克大战(续一):http://blog.csdn.net/u010412719/article/details/51723570 博文<Java小游戏实现>:坦克大战(续1)中已经实现到了坦克可以发射一颗子弹了.这篇博文在此基础上继续实

《Java小游戏实现》:坦克大战(续三)

<Java小游戏实现>:坦克大战(续三) 相关博文: <Java小游戏实现>:坦克大战http://blog.csdn.net/u010412719/article/details/51712663 <Java小游戏实现>:坦克大战(续一):http://blog.csdn.net/u010412719/article/details/51723570 <Java小游戏实现>:坦克大战(续二):http://blog.csdn.net/u010412719/

java小游戏捕鱼达人,来学做java小游戏!

Java小项目捕鱼达人 跪求关注,祝关注我的人都:身体健康,财源广进,福如东海,寿比南山,早上贵子,从不掉发! 捕鱼达人这款游戏,相信和我年纪相仿的朋友,肯定很熟悉.在当时半智能手机和智能手机刚刚出现的时代,手机里有捕鱼达人,汤姆猫,植物大战僵尸等小游戏,是很值得炫耀的,在村里那可是备受小朋友欢迎的.这篇文章来分享一下这款我当时很喜欢玩的捕鱼达人,但是要知道哦,捕鱼达人可是有一点赌博性质的,特别是游戏厅里的,大家可不能沉迷哦!先上图:这个java小游戏,虽然没有很多炫酷的特效和复杂的机制,但是作

java小游戏贪吃蛇大作战:来一起回顾童年回忆!

Java小项目之贪吃蛇 跪求关注,祝关注我的人都:身体健康,财源广进,福如东海,寿比南山,早上贵子,从不掉发! 贪吃蛇,绝对是很多朋友的童年记忆.几乎没有人会说没玩过这款小游戏,因为不管在小灵通手机,直板手机,还是半智能手机,甚至是现在的5G手机,都能看见这款游戏的身影.虽然游戏一直在进化,画面,风格,操作方式越来越精细,但是游戏本质的玩法是没变的,例如蛇不断变大,碰到墙壁会死亡等设定.这篇文章来分享java小游戏贪吃蛇:部分代码展示:这个贪吃蛇小游戏,玩法和操控,都是比较完善的,大家感兴趣的可

寒假答辩作品:Java小游戏

目录 java入门小游戏[test] 游戏界面 前言 (可直接跳到程序介绍) 前期入门小项目 前期收获 后期自创关卡 后续 java入门小游戏[test] 游戏界面 github地址: https://github.com/404name/WinterReplyWorks 网盘(提取码pzgt):https://pan.baidu.com/s/1-JoHOCKYl_56fKCzhEmMvg 前言 (可直接跳到程序介绍) 前期入门小项目 过年这段时间在家写了两个C语言的大程序,当初在学校立的fla

java 猜拳游戏代码

import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.Random; public class FingerGuessing { private String[] op = new String[] { "布", "剪刀", "石头" }; Random r = new Random