资源描述
软件设计汇报
题 目: 拼图游戏
专 业 数字媒体技术
学 生 姓 名
班 级 学 号
日 期 5月
评 分 细 则
评分项
优异
良好
中等
及格
不及格
平时表现
(10%)
程序演示
(30%)
汇报
(60%)
评分等级
等级:
老师署名:
年 5月
备注
评分等级有五种:
优异、良好、中等、及格、不及格
目录
一、序言 1
二、项目开发计划书 1
2.1技术可行性 1
2.2人员可能性 1
2.3代码工作量 1
2.4开发环境 1
三、项目分析 1
3.1设计目标 1
3.2程序功效需求概述 1
四、软件测试汇报 6
五、不足分析 9
六、小结 9
附1:代码 10
附2:附录 24
一、序言
鉴于拼图游戏是一款较为经典游戏,我们组选择了拼图游戏,借助Java - Eclipse这么一个开发环境完成此次软件工程试验项目。
二、项目开发计划书
2.1技术可行性
我们组组员系统学习了软件工程和Java相关知识,含有一定系统分析和设计能力,熟悉Java设计和操纵;早期大部分工作已经完成,因以后面工作相对轻松:指导老师林巧民老师多年从事软件工程和程序设计教学和研究工作,所以该系统实现在技术上是可行。
2.2人员可能性
程序设计、编写和调试由杜宗泽、沙杰。
文档编写和整理,后期测试由陈凯负责。
2.3代码工作量
估计需一个星期左右。
2.4开发环境
开发环境:Java - Eclipse
三、 项目分析
3.1设计目标
根据软件工程规范,以Java - Eclipse为前端开发工具,设计并实现一个拼图游戏。
3.2 程序功效需求概述
(1) 实现载入3幅图片;
(2) 设置字体;
(3) 初始化界面;
(4) 添加鼠标监听事件;
(5) 面板初始化;
(6) 单击鼠标时产生事件;
(7) 鼠标进入某个区域时产生事件;
(8) 鼠标突出某个区域时产生事件;
(9) 移动鼠标时产生事件;
(10) 拖动鼠标时产生事件;
(11) 按下鼠标时产生事件;
(12) 放开鼠标时产生事件;
(13) 转换坐标;
(14) 图片初始化;
(15) 判定程序是否结束;
(16) 游戏初始化。
四、 软件测试汇报
在Java - Eclipse环境中调试、运行程序
点击运行后出现以下画面:
单击选择美女头像,初始状态以下图:
此时可依据需要单击左上角“小程序”菜单进行功效选择,以下图:
五、不足分析
(1)4x4拼图难度较大;
(2)右下角会有一块空缺,鉴于能力有限,未能完善。
六、小结
经过两个星期努力,我们小组比较圆满地完成了此次课程设计题目——拼图游戏。
本练习制作拼图游戏实例,利用了Java2中图形处理技术和消息响应技术。经过图形技术,实现图片导入和分割。经过消息响应机制,使程序能够响应用户鼠标操作,进行拼图游戏操作。
在为期一周学习实践中,最大收获是锻炼了自己编程能力。熟悉了Java - Eclipse开发环境。程序编写是最为艰辛过程。首先,因为没有较为深入学习Java高级语言,我们小组在开始程序编写工作之前,借阅了相关书籍,初步学习了Java语言中各项功效。在又了一定知识积累后,我才着手开始项目程序编写。程序编写灵魂在于算法设计,所以我们组在这部分花费精力也最多。算法比较复杂。刚开始因为思索不够全方面,编写程序虽能勉强完成大约功效需求,但还是出现了很多bug。以后经过对算法重新审阅,和查阅相关书籍,不停修改已经有程序,最终基础消除了bug。在程序编写过程中,还出现了部分小问题,尤其是部分语言书写规则,细节功效实现着实让我们组大费了部分周折。
自学了相关软件工程知识,并能够把自学导内容加以实践和应用。因为我没有选修这门课程,所以造成在实践过程中还是碰到了部分问题,比如在软件开发初级阶段,和小组组员讨论系统功效结构化设置时,就不能全方面有效构思清楚。幸好另外一名同组组员较系统地学习了这门课程,经过讨论,最终设计出了现在程序。
经过这次课程设计,我拓宽了知识面,锻炼了能力,综合素质得到较大提升。安排课程设计基础目标,在于理论和实际结合,人和人之间沟通,尤其是观察、分析和处理问题实际工作能力,作为整个学习体系有机组成部分,课程设计即使只安排了两周进行,但并不含有绝对独立意义。这次课程设计,让我找出了本身情况和实际需要差距,并在以后学习期间立即补充相关知识,为求职和正式工作做好充足知识、能力准备,让我受益匪浅。
代码部分
import java.awt.*;
import java.applet.*;
import java.awt.event.* ;
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;
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);
}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;
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;
}
}
}
附录说明
本例知识点
一句话讲解
新学知识
使用Image类
导入图片
使用MouseEvent类
处理鼠标事件
已学知识
使用Point类
转换坐标
使用Graphics类
管理屏幕显示
展开阅读全文