《Java实训》设计报告
项目名称
石家庄科技信息职业学院
信息工程系
20##年10月15日
项目名称
一、项目需求
(格式说明:小四号字,1.5倍行距)
本次项目设计是applet小应用程序的java版拼图游戏,它可以嵌入到网页中运行,此款游戏主要实现的是图片的选择和块状图片的拖拽,而且此款游戏还添加了舒缓的背景音乐使得整个游戏过程中都处在轻松愉快的氛围中。
(1)单击“拼图游戏初始界面”上的块状图片(0~2)可以选择游戏对象(即图片的选择)。
(2)单击“块状图片”可对其进行拖拽。
二、项目设计
在设计拼图游戏时,编写1个Java源文件:pintu.java计算器除了上述这个Java源文件所给出的类外,还需要Java系统提供的一些重要类,如AudioClip,Image,Graphics,boolean等。
下面是这个Java源文件的总体设计。
(1)pintu.java(主类)
Applet类负责创建计算器的主窗口,该类含有init方法,拼图游戏从该类开始执行。Applet类有5种类型的对象,分别是:AudioClip,Image, Graphic,Buffer, int对象。
……
1、pintu类(主类)
(1)数据和方法
Applet类是java.applet包中applet的一个子类,并实现了MouseListener和MouseMotionListenert接口。类中有关数据和方法的详细说明。
1)成员变量
pic是Image型数组,每个单元是一个Image n类创建的“块状图片”对象,该数组长度为16。numberButton数组中的“块状图片”含有的数字依次为0~15。每个“数字按钮”都注册有MouseListener和MouseMotionListenert事件监听器。
……
2)方法
init()方法是程序初始化的方法。
initForm()方法是界面初始化的方法;
……
(2)代码(格式说明:五号字,单倍行距)
import java.awt.*;
import java.applet.*;
import java.awt.event.* ;
import javax.swing.*;
public class pintu extends Applet implements MouseListener,MouseMotionListener
{
AudioClip sound;
private Image picture;
private Graphics buffer;
private Image pic[];
private Image off_pic[];
private Graphics off_buf[];
private Image off_screen;
private Graphics off_buffer;
private Image off_drag;
private Graphics off_drag_buf;
private int map[][];
private int ran[];
private int width=0;
private int height=0;
private int lastx;
private int lasty;
private int last_downx;
private int last_downy;
private int stepx;
private int stepy;
private boolean choose;
private boolean click[][];
private boolean m_down;
private boolean m_drag;
private boolean not_redraw;
private boolean able;
Font font1,font2;
//程序的初始化
public void init()
{
resize(640,480);
pic = new Image [3];
off_pic = new Image[16];
off_buf = new Graphics [16];
map = new int [4][4];
ran = new int [15];
for(int a=0;a<16;a++)
map[a/4][a%4] = a;
for(int a=0;a<15;a++)
ran[a]=a;
click=new boolean [4][4];
MediaTracker tracker= new MediaTracker (this);
sound=getAudioClip(getDocumentBase(),"2.mid");
sound.play();
jdsz=new JDialog();
//要载入的图片
pic[0]=getImage(getCodeBase(),"12.JPG");
pic[1]=getImage(getCodeBase(),"13.JPG");
pic[2]=getImage(getCodeBase(),"14.jpg");
tracker.addImage (pic[0],0);
tracker.addImage (pic[1],0);
tracker.addImage (pic[2],0);
try{
tracker.waitForID (0);
}catch(InterruptedException e){}
//设置字体
font1= new Font ("TimesRoman", Font.BOLD, 48);
font2= new Font ("TimesRoman", Font.BOLD, 32);
width=640;
height=480;
//初始化主界面
initForm();
//添加鼠标监听事件
addMouseListener(this);
addMouseMotionListener(this);
}
//面板初始化
void initForm()
{
this.setBackground (Color.orange);
if(off_drag==null){
off_drag = createImage(width/4,height/4);
off_drag_buf = off_drag.getGraphics ();
}
}
public void paint(Graphics g){
if(off_screen==null)
{
off_screen = createImage(width,height);
off_buffer=off_screen.getGraphics ();
}
if(able){
off_buffer.setColor (Color.black );
for(int a=0;a<4;a++)
for(int b=0;b<4;b++)
{
if(map[a][b]!=15)
off_buffer.drawImage (off_pic[map[a][b]],b*width/4,a*height/4,this);
if(map[a][b]==15)
off_buffer.fillRect (b*width/4,a*height/4,width/4,height/4);
for(int c=0;c<2;c++)
off_buffer.drawRect (b*width/4+c,a*height/4+c,width/4-c,height/4-c);
if(click[a][b])
{
off_buffer.setColor(Color.red);
for(int d=0;d<2;d++)
off_buffer.drawOval (b*width/4-d,a*height/4-d,width/4+d,height/4+d);
off_buffer.setColor (Color.black );
}
}
}
else{
off_buffer.setColor (Color.orange );
off_buffer.fillRect (0,0,640,480);
off_buffer.setFont (font1);
off_buffer.setColor(Color.red );
off_buffer.drawImage (pic[2],30,50,250,180,this);
off_buffer.drawImage (pic[0],370,160,250,180,this);
off_buffer.drawImage (pic[1],60,270,250,180,this);
off_buffer.drawString ("Choose One!",320,100);
}
g.drawImage (off_screen,0, 0,this);
}
public void repaint(){
paint(this.getGraphics ());
}
//单击鼠标时产生的事件
public void mouseClicked(MouseEvent evt){}
//鼠标进入某个区域时产生的事件
public void mouseEntered(MouseEvent evt){}
//鼠标退出某个区域时产生的事件
public void mouseExited(MouseEvent evt){}
//移动鼠标时产生的事件
public void mouseMoved(MouseEvent evt){
if(!able){
Point point;
point=evt.getPoint();
if(point.x >30 && point.x<280 && point.y>50 && point.y<230)
{
off_buffer.setColor (Color.orange );
off_buffer.fillRect (0,0,640,480);
off_buffer.setFont (font1);
off_buffer.drawImage (pic [2], 25, 45, 250,180,this);
off_buffer.drawImage (pic[0],370,160,250,180,this);
off_buffer.drawImage (pic[1],60,270,250,180,this);
off_buffer.setColor(Color.black );
off_buffer.fillRect (30,225,250,5);
off_buffer.fillRect (275,50,5,176);
off_buffer.setColor(Color.red );
off_buffer.drawString ("picture 2!",320,100);
this.getGraphics ().drawImage (off_screen,0,0,this);
}
else if(point.x >370 && point.x<620 && point.y>160 && point.y<340)
{
off_buffer.setColor (Color.orange );
off_buffer.fillRect (0,0,640,480);
off_buffer.setFont (font1);
off_buffer.drawImage (pic[2],30,50,250,180,this);
off_buffer.drawImage (pic[0],365,155,250,180,this);
off_buffer.drawImage (pic[1],60,270,250,180,this);
off_buffer.setColor(Color.black );
off_buffer.fillRect (370,335,250,5);
off_buffer.fillRect (615,160,5,175);
off_buffer.setColor(Color.red );
off_buffer.drawString ("picture 0!",320,100);
this.getGraphics ().drawImage (off_screen,0,0,this);
}
else if(point.x >60 && point.x<310 && point.y>270 && point.y<450)
{
off_buffer.setColor (Color.orange );
off_buffer.fillRect (0,0,640,480);
off_buffer.setFont (font1);
off_buffer.drawImage (pic[2],30,50,250,180,this);
off_buffer.drawImage (pic[0],370,160,250,180,this);
off_buffer.drawImage (pic[1],55,265,250,180,this);
off_buffer.setColor(Color.black );
off_buffer.fillRect (60,445,250,5);
off_buffer.fillRect (305,270,5,175);
off_buffer.setColor(Color.red );
off_buffer.drawString ("picture 1!",320,100);
this.getGraphics ().drawImage (off_screen,0,0,this);
}
else{
repaint();
}
}
}
//拖动鼠标时产生的事件
public void mouseDragged(MouseEvent evt){
if(!able)
return;
if(m_down){
Point point;
Point temp;
point=evt.getPoint();
m_drag=true;
repaint();
Graphics david = this.getGraphics ();
if(!not_redraw)
off_drag_buf.drawImage (off_pic[map[last_downy][last_downx]],0,0,this);
david.drawImage (off_drag,point.x+stepx,point.y+stepy,this);
not_redraw=true;
}
}
//按下鼠标时产生的事件
public void mousePressed(MouseEvent evt){
if(!able)
return;
Point point;
Point temp;
point=evt.getPoint();
if(getarea(point) == point)
return;
else {
temp=getarea(point);
if(!m_down){
if(map[temp.y][temp.x]==15)
return;
else{
m_down=true;mid
last_downx=temp.x;
last_downy=temp.y;
stepx=temp.x*160-point.x;
stepy=temp.y*120-point.y;
}
}
else if(m_down){
m_down=false;
}
}
}
//放开鼠标时产生的事件
public void mouseReleased(MouseEvent evt){
if(able){
if(m_drag){
m_down=false;m_drag=false;not_redraw=false;
Point point;
Point temp;
point=evt.getPoint();
if(getarea(point) == point)
{ repaint();
return;}
else {
temp=getarea(point);
if(map[temp.y][temp.x]!=15){
repaint();return;}
else{
if(Math.abs (last_downx-temp.x)==1 && last_downy-temp.y==0)
{
int david;
david=map[last_downy][last_downx];
map[last_downy][last_downx] =15;
map[temp.y][temp.x]=david;
if(wingame())
able=false;
repaint();
return;
}
else if(last_downx-temp.x==0 && Math.abs (last_downy-temp.y)==1)
{
int david;
david=map[last_downy][last_downx];
map[last_downy][last_downx] =15;
map[temp.y][temp.x]=david;
if(wingame())
able=false;
repaint();
return;
}
else{repaint(); return;}
}
}
}
}
else{
Point point;
point=evt.getPoint();
if(point.x >30 && point.x<280 && point.y>50 && point.y<230)
{able=true; initmap(2);}
if(point.x >370 && point.x<620 && point.y>160 && point.y<340)
{able=true;initmap(0);}
if(point.x >60 && point.x<310 && point.y>270 && point.y<450)
{able=true;initmap(1);}
else return;
}
}
//转换坐标
public Point getarea(Point point){
if(point.x>640 || point.y>480)
return point;
else return point = new Point (point.x/160,point.y/120);
}
//图片初始化
void initmap(int stage){
picture = createImage(width,height);
buffer = picture.getGraphics ();
buffer.drawImage (pic[stage],0,0,640,480,this);
for(int a=0;a<15;a++)
{
off_pic[a] = createImage(width/4,height/4);
off_buf[a] = off_pic[a].getGraphics ();
off_buf[a].drawImage (picture,0,0,width/4,height/4,
(a%4)*width/4,(a/4)*height/4,(a%4+1)*width/4,(a/4+1)*height/4,this);
}
initgame();
repaint();
}
//程序是否结束
boolean wingame(){
for(int a=0;a<4;a++)
for(int b=0;b<4;b++)
{
if(map[a][b]==a*4+b)
;
else return false;
}
return true;
}
//游戏初始化
void initgame(){
for(int a=0;a<4;a++)
for(int b=0;b<4;b++)
{
if(!(a==3 && b==3)){
map[a][b] = (int)(Math.random()*14);
if(ran[map[a][b]]==-1)
{
int temp=map[a][b];
while(ran[temp]==-1){
temp++;
if(temp>14)
temp=0;
}
map[a][b]=ran[temp];
ran[temp]=-1;
}
else{
ran[map[a][b]]=-1;
}
}
else map[3][3] = 15;
}
}
}
(3)效果图
pintu创建的窗口效果如下图所示。
图一界面初始化
图二游戏界面
三、项目总结:
经过多次的实验之后我觉得该程序还有许多需要改的地方:
1.虽然在程序中添加了背景音乐但是音乐单一,应该添加多种音乐。
2.该游戏没有一个详细的设置菜单,考虑添加。
3.在游戏完成后添加一个声音,使这个游戏更人性化。
4.设置游戏难度,不仅仅是将图片分为十六块可以更多或者更少。
四、心得体会
经过这段时间的学习我收获不小,总结起来有如下几点:
1.更进一步的理解了java编程的思想,体会到java与其他编程语言的不同。对于这种面向对象的编程思想,是刚入门的人能够很快的写出自己的程序。
2.锻炼了自己的动手和自学能力,在编程中有许多类和方法在课本中没有学到和提及到。都是通过自己查帮助文档,或者通过网络进行学习和了解到的。和别人在一起交流是一样很快乐的事情。
3.体会到编写程序最重要的是程序思想,而不是单纯的写代码了。如何解决类之间的关联和继承关系,如何组织类是很关键的,此外对于接口和变量的访问权限的设置方面的问题都有不小的收获。