软件设计报告-拼图游戏
题 目:
专 学 生 姓 班 级 学 日
软件设计报告
拼图游戏
业 数字媒体技术 名 号 期 2013年5月
评分项 平时表现 (10%) 程序演示 (30%) 优秀 良好 中等 及格 不及格 评 分 细 报告 (60%) 则
一、序言 ..................................................................................................... 1 二、项目开发计划书 ................................................................................ 1
2.1技术可行性 .............................................................................. 1 2.2人员可能性 .............................................................................. 1 2.3代码工作量 .............................................................................. 1 2.4开发环境 .................................................................................. 1 三、项目分析............................................................................................. 1
3.1设计目标 .................................................................................. 1 3.2程序功能需求概述 .................................................................. 1 四、软件测试报告 .................................................................................... 6
等级: 教师签名: 2013 年 5月 备注评分等级有五种: 优秀、良好、中等、及格、不及格 目录
五、不足分析 ............................................................................................ 9 六、小结 ..................................................................................................... 9 附1:代码 ............................................................................................... 10 附2:附录 ................................................................................................. 9
一、序言
鉴于拼图游戏是一款较为经典的游戏,我们组选取了拼图游戏,借助Java - Eclipse这样一个开发环境完成此次软件工程实验项目。
二、项目开发计划书
2.1技术可行性
我们组成员系统的学习了软件工程和Java的相关知识,具备一定的系统分析与设计能力,熟悉Java的设计与操纵;早期的大部分工作已经完成,所以后面的工作相对轻松:指导老师林巧民老师多年从事软件工程和程序设计的教学与研究工作,因而该系统的实现在技术上是可行的。
2.2人员可能性
程序的设计、编写与调试由杜宗泽、沙杰。 文档的编写与整理,后期测试由陈凯负责。
2.3代码工作量
预计需一个星期左右。
2.4开发环境
开发环境:Java - Eclipse
1
三、项目分析
3.1设计目标
按照软件工程的规范,以Java - Eclipse为前端开发工具,设计并实现一个拼图游戏。
3.2 程序功能需求概述
(1) 实现载入3幅图片; (2) 设置字体; (3) 初始化界面; (4) 添加鼠标监听事件; (5) 面板初始化;
(6) 单击鼠标时产生的事件;
(7) 鼠标进入某个区域时产生的事件; (8) 鼠标突出某个区域时产生的事件; (9) 移动鼠标时产生的事件; (10) 拖动鼠标时产生的事件; (11) 按下鼠标时产生的事件; (12) 放开鼠标时产生的事件; (13) 转换坐标; (14) 图片初始化; (15) 判断程序是否结束;
2
(16) 游戏初始化。
四、软件测试报告
在Java - Eclipse环境中调试、运行程序
点击运行后出现如下画面:
3
4
单击选取美女头像,初始状态如下图:
5
此时可根据需要单击左上角“小程序”菜单进行功能选择,如下图:
6
五、不足分析
(1)4x4拼图难度较大;
(2)右下角会有一块空缺,鉴于能力有限,未能完善。
六、小结
经过两个星期的努力,我们小组比较圆满地完成了本次课程设计的题目——拼图游戏。 本练习制作拼图游戏的实例,运用了Java2中的图形处理技术和消息响应技术。通过图形技
7
术,实现图片的导入和分割。通过消息响应机制,使程序可以响应用户的鼠标操作,进行拼图游戏的操作。
在为期一周的学习实践中,最大的收获是锻炼了自己的编程能力。熟悉了Java - Eclipse开发环境。程序的编写是最为艰辛的过程。首先,由于没有较为深入的学习Java高级语言,我们小组在开始程序编写工作之前,借阅了相关的书籍,初步学习了Java语言中的各项功能。在又了一定的知识积累后,我才着手开始项目程序的编写。程序编写的灵魂在于算法的设计,所以我们组在这部分花费的精力也最多。算法比较复杂。刚开始由于思考的不够全面,编写的程序虽能勉强完成大概的功能需求,但还是出现了很多bug。后来通过对算法的重新审视,以及查阅相关的书籍,不断的修改已有程序,终于基本消除了bug。在程序的编写过程中,还出现了一些小的问题,特别是一些语言书写的规则,细节功能的实现着实让我们组大费了一些周折。 自学了有关软件工程的知识,并可以把自学导的内容加以实践与应用。由于我没有选修这门课程,所以造成在实践过程中还是遇到了一些问
8
题,比如在软件开发的初级阶段,与小组成员讨论系统功能的结构化设置时,就不能全面有效的构思清楚。幸好另外一名同组成员较系统地学习了这门课程,通过讨论,最后设计出了现在的程序。
通过这次课程设计,我拓宽了知识面,锻炼了能力,综合素质得到较大提高。安排课程设计的基本目的,在于理论与实际的结合,人与人之间的沟通,尤其是观察、分析和解决问题的实际工作能力,作为整个学习体系的有机组成部分,课程设计虽然只安排了两周进行,但并不具有绝对独立的意义。这次课程设计,让我找出了自身状况与实际需要的差距,并在以后的学习期间及时补充相关知识,为求职与正式工作做好充分的知识、能力准备,让我受益匪浅。
代码部分
import java.awt.*; import java.applet.*; import java.awt.event.* ;
9
public class pintu extends Applet implements MouseListener,MouseMotionListener
{ 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;
10
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);
//要载入的图片
pic[0]=getImage(getCodeBase(),\"PICTURE0.JPG\"); pic[1]=getImage(getCodeBase(),\"PICTURE1.JPG\"); pic[2]=getImage(getCodeBase(),\"PICTURE2.GIF\"); tracker.addImage (pic[0],0); tracker.addImage (pic[1],0); tracker.addImage (pic[2],0);
try{
tracker.waitForID (0);
11
}catch(InterruptedException e){}
//设置字体
font1= new Font (\"TimesRoman\ font2= new Font (\"TimesRoman\ 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)
{
12
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
if(map[a][b]==15)
off_buffer.fillRect
for(int c=0;c<2;c++)
off_buffer.drawRect
if(click[a][b]) { off_buffer.setColor(Color.red); for(int d=0;d<2;d++)
off_buffer.drawOval
off_buffer.setColor (Color.black );
}
}
} else{
off_buffer.setColor (Color.orange );
13
(off_pic[map[a][b]],b*width/4,a*height/4,this);
(b*width/4,a*height/4,width/4,height/4);
(b*width/4+c,a*height/4+c,width/4-c,height/4-c);
(b*width/4-d,a*height/4-d,width/4+d,height/4+d);
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!\
}
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();
14
if(point.x >30 && point.x<280 && point.y>50 && point.y<230)
point.y<340)
{ 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!\ this.getGraphics ().drawImage (off_screen,0,0,this);
}
else if(point.x >370 && point.x<620 && point.y>160 &&
{ 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);
15
}
off_buffer.fillRect (615,160,5,175); off_buffer.setColor(Color.red );
off_buffer.drawString (\"picture 0!\ 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!\ this.getGraphics ().drawImage (off_screen,0,0,this);
else{ }
repaint();
16
//拖动鼠标时产生的事件
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);
17
if(!m_down){ if(map[temp.y][temp.x]==15)
return;
else{ m_down=true; 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 {
18
temp=getarea(point);
if(map[temp.y][temp.x]!=15){
repaint();return;}
else{
last_downy-temp.y==0)
(last_downy-temp.y)==1)
if(Math.abs (last_downx-temp.x)==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 if(last_downx-temp.x==0 && Math.abs
{ 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;}
19
} }
}
}
}
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);
20
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++)
{
21
}
}
}
if(!(a==3 && b==3)){ }
else map[3][3] = 15;
map[a][b] = (int)(Math.random()*14); if(ran[map[a][b]]==-1) { } else{ }
ran[map[a][b]]=-1; int temp=map[a][b]; while(ran[temp]==-1){ }
map[a][b]=ran[temp]; ran[temp]=-1;
temp++; if(temp>14)
temp=0;
附录说明
本例知识点 新学知识 使用Image类 使用MouseEvent类 一句话讲解 导入图片 处理鼠标事件 22
已学知识 使用Point类 使用Graphics类 转换坐标 管理屏幕显示
23
因篇幅问题不能全部显示,请点此查看更多更全内容