《[工学]面向对象java版课程设计报告.doc》由会员分享,可在线阅读,更多相关《[工学]面向对象java版课程设计报告.doc(32页珍藏版)》请在三一办公上搜索。
1、课程设计课程设计任务书学 院信息学院专 业工程电子信息学生姓名吴才奇班级学号1103030429课程设计题目基于Java的魔板游戏软件设计实践教学要求与任务:采用java技术设计魔板游戏软件,设计要求如下:(1) 魔板由3*3或4*4个格子组成。对于3*3魔板,在前8个格子里随机放置8个编号18的方块,最后一个格子是未放置方块的空格子;对于4*4的魔板,在前15个格子里随机放置15个编号115的方块,最后一个格子是未放置方块的空格子。(2) 用鼠标单击任何与格子水平或垂直相邻的方块就可以把该方块移入空格子,而当前方块移动之前所在的格子成为空格子。通过不断地移动方块可以将方块一行一行地按数顺序排
2、好。(3) 魔板游戏也可以使用图像来代替数字。例如,对于3*3的魔板,将一幅图像分成3*3个小图像,除去最后一幅小图像(图像的右下角),将其余的各幅小图像打乱顺序后放在魔板的方块上,最终目标是通过移动方块回复原始图像(不包括图像的右下角)。(4) 当用户按要求排列好方块后,程序弹出对话框,提示用户成功的消息。(5) 模板游戏分为两个级别,用户可以通过界面上提供的菜单来选择“初级”或“高级”两个级别。对于“初级”级别,魔板由3*3个格子组成;对于“高级”级别,魔板由4*4个格子组成。“模板游戏”提供一幅默认图像,用户可以使用该图像来玩魔板游戏。用户也可以使界面提供的菜单选择一幅新图像,然后使用这
3、个新的图像来玩魔板游戏。 工作计划与进度安排: 第18周:布置课程设计任务,查阅资料,分组设计,程序调试。 第19周:程序调试,编写课程设计报告,验收,答辩。指导教师: 2012年 月 日专业负责人: 2012年 月 日学院教学副院长: 2012年 月 日一、设计目的()二、总体设计三、关键技术()四、程序流程 () 五、主要源代码总体设计在设计魔板游戏时,需要编写7java源文件:、 PuzzlePad.java、Point.java、Block.java、HandleImage.java、VerifySuccess.java和HandleMove.java。魔板游戏除了需要编写的上述7个j
4、ava源文件所给出的类外,还需要java系提供的一些重要的类,如JMenuItem、JButton、和JRadioButton 等类。魔板游戏所用到的一些重要的类以及之间的组合关系如图所示。1PuzzleGame.java(主类)PuzzleGame.java类负责创建魔板游戏的主窗口,该类含有main方法,程序从该类开始执行。PuzzleGame.java类的成员变量中有4种重要类型的对象:PuzzlePad 、JMenu、JRadioButton和JButton。2.PuzzlePad.java PuzzlePad类创建的对象是PuzzleGame类最重要的成员之一,代表“魔板”。该类的成
5、员变量中雨5种重要类型的对象:Point、Block、HandleMove、HandleImage和Image。3.Block.javaBlock类是JTextField的一个子类,创建的对象是PuzzlePad类的重要成员之一用来表示“魔板”中的“方块”。4.Point.javaPoint类负责创建确定位置的对象,使用Point对象可以确定Block对象在PuzzlePad对象中的位置,即确定“方块”在“魔板”中的位置。5.HandleImage.javaHandleImage类所创建的对象负责将一幅图像分成若干个小图像。6.HandleMove.javaHandleMove类所创建的对象负
6、责处理鼠标事件。7.VerifySuccess.javaVerifySuccess类所创建的对象负责验证用户是否按要求成功排列魔板中的方块。三、关键技术 四、程序流程 制作菜单JMenu制作单选框JRadioButton添加按钮JButton制作魔板PuzzlePadPointBlockHandleMoveImageHandleImageVerifySuccess五、主要源代码import java.awt.*;import java.awt.event.*;import javax.swing.*;import java.io.*;import javax.swing.filechooser
7、.*;public class PuzzleGame extends JFrame implements ActionListener PuzzlePad puzzlePad; JMenuBar bar; JMenu gradeMenu,choiceImage; JMenuItem oneGrade,twoGrade,newImage,defaultImage; JRadioButton digitPlay,imagePlay; ButtonGroup group=null; JButton startButton; Image image; Toolkit tool; public Puzz
8、leGame() tool=getToolkit(); bar=new JMenuBar(); gradeMenu=new JMenu(选择级别); choiceImage=new JMenu(选择图像); oneGrade=new JMenuItem(初级); twoGrade=new JMenuItem(高级); newImage=new JMenuItem(选择一幅新图像); defaultImage=new JMenuItem(使用默认图像); gradeMenu.add(oneGrade); gradeMenu.add(twoGrade); choiceImage.add(newIm
9、age); choiceImage.add(defaultImage); bar.add(gradeMenu); bar.add(choiceImage); setJMenuBar(bar); oneGrade.addActionListener(this); twoGrade.addActionListener(this); newImage.addActionListener(this); defaultImage.addActionListener(this); startButton=new JButton(开始); startButton.addActionListener(this
10、); group=new ButtonGroup(); digitPlay=new JRadioButton(数字玩法,true); imagePlay=new JRadioButton(图像玩法,false); group.add(digitPlay); group.add(imagePlay); puzzlePad=new PuzzlePad(); puzzlePad.setGrade(1); puzzlePad.setIsDigitPlay(); add(puzzlePad,BorderLayout.CENTER); JPanel pNorth=new JPanel(); pNorth.
11、add(digitPlay); pNorth.add(imagePlay); pNorth.add(startButton); pNorth.add(new JLabel(如果图像不能立刻显示,请再单击一次按扭); add(pNorth,BorderLayout.NORTH); add(puzzlePad.getHandleMove(),BorderLayout.SOUTH); validate(); setVisible(true); setBounds(100,50,550,380); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); try
12、image=tool.createImage(new File(dog.jpg).toURI().toURL(); puzzlePad.setImage(image); catch(Exception exp) public void actionPerformed(ActionEvent e) if(e.getSource()=startButton) if(digitPlay.isSelected() puzzlePad.setIsDigitPlay(); else if(imagePlay.isSelected() puzzlePad.setImage(image); puzzlePad
13、.setIsImagePlay(); else if(e.getSource()=oneGrade) puzzlePad.setGrade(1); else if(e.getSource()=twoGrade) puzzlePad.setGrade(2); else if(e.getSource()=newImage) FileNameExtensionFilter filter = new FileNameExtensionFilter( JPG & GIF Images, jpg, gif); JFileChooser chooser=new JFileChooser(); chooser
14、.setFileFilter(filter); int state=chooser.showOpenDialog(null); File file=chooser.getSelectedFile(); if(file!=null&state=JFileChooser.APPROVE_OPTION) try image=tool.createImage(file.toURI().toURL(); puzzlePad.setImage(image); catch(Exception exp) else if(e.getSource()=defaultImage) try image=tool.cr
15、eateImage(new File(dog.jpg).toURI().toURL(); puzzlePad.setImage(image); catch(Exception exp) public static void main(String args) new PuzzleGame(); import javax.swing.*;import java.awt.*;public class Block extends JTextField Point point; Object object; Block() setEditable(false); setHorizontalAlignm
16、ent(JTextField.CENTER); setFont(new Font(Arial,Font.BOLD,16); setForeground(Color.blue); public void setAtPoint(Point p) point=p; public Point getAtPoint() return point; public void setObject(Object object) this.object=object; if(object instanceof Integer) Integer number=(Integer)object; setText(+nu
17、mber.intValue(); else if(object instanceof Image) repaint(); public Object getObject() return object; public void paintComponent(Graphics g) super.paintComponent(g); int w=getBounds().width; int h=getBounds().height; try g.drawImage(Image)object,0,0,w,h,this); catch(Exception exp) import java.awt.*;
18、import javax.swing.*;import java.awt.image.*;public class HandleImage extends JComponent int imageWidth,imageHeight; Toolkit tool; HandleImage() tool=getToolkit(); public Image getImages(Image image,int rows,int colums) Image blockImage=new Imagerows*colums; try imageWidth=image.getWidth(this); imag
19、eHeight=image.getHeight(this); int w=imageWidth/colums; int h=imageHeight/rows; int k=0; PixelGrabber pg=null; ImageProducer ip=null; for(int i=0;irows;i+) for(int j=0;jcolums;j+) int pixels= new intw*h; pg=new PixelGrabber(image,j*w,i*h,w,h,pixels,0,w); pg.grabPixels(); ip=new MemoryImageSource(w,h
20、,pixels,0,w); blockImagek=tool.createImage(ip); k+; catch(Exception ee) return blockImage; import java.awt.event.*;import java.awt.*;import javax.swing.*;public class HandleMove extends JPanel implements MouseListener,ActionListener Point point; int spendTime=0; javax.swing.Timer recordTime; JTextFi
21、eld showTime; VerifySuccess verify; HandleMove() recordTime=new javax.swing.Timer(1000,this); showTime=new JTextField(16); showTime.setEditable(false); showTime.setHorizontalAlignment(JTextField.CENTER); showTime.setFont(new Font(楷体_GB2312,Font.BOLD,16); JLabel hitMess=new JLabel(用鼠标单击方块,JLabel.CENT
22、ER); hitMess.setFont(new Font(楷体_GB2312,Font.BOLD,18); add(hitMess); add(showTime); setBackground(Color.cyan); public void setPoint(Point p) point=p; public void initSpendTime() recordTime.stop(); spendTime=0; showTime.setText(null); public void setVerifySuccess(VerifySuccess verify) this.verify=ver
23、ify; public void mousePressed(MouseEvent e) recordTime.start(); Block block=null; block=(Block)e.getSource(); int w=block.getBounds().width; int h=block.getBounds().height; int startI=-1,startJ=-1,endI=-1,endJ=-1; Point startPoint=block.getAtPoint(); Point endPoint=null; for(int i=0;ipoint.length;i+
24、) for(int j=0;jpoint0.length;j+) if(pointij.equals(startPoint) startI=i; startJ=j; break; for(int i=0;ipoint.length;i+) for(int j=0;jpoint0.length;j+) if(pointij.isHaveBlock()=false) endI=i; endJ=j; endPoint=pointij; break; boolean moveCondition1=Math.abs(endI-startI)=1&endJ=startJ; boolean moveCond
25、ition2=Math.abs(endJ-startJ)=1&endI=startI; if(moveCondition1|moveCondition2) block.setLocation(endPoint.getX(),endPoint.getY(); block.setAtPoint(endPoint); endPoint.setBlock(block); endPoint.setHaveBlock(true); startPoint.setHaveBlock(false); public void actionPerformed(ActionEvent e) spendTime+; s
26、howTime.setText(您的用时:+spendTime+秒); public void mouseReleased(MouseEvent e) if(verify.isSuccess() recordTime.stop(); JOptionPane.showMessageDialog(this,您成功了!,消息框, JOptionPane.INFORMATION_MESSAGE ); public void mouseEntered(MouseEvent e) public void mouseExited(MouseEvent e) public void mouseClicked(
27、MouseEvent e)public class Point int x,y; boolean haveBlock; Block block=null; public Point(int x,int y) this.x=x; this.y=y; public boolean isHaveBlock() return haveBlock; public void setHaveBlock(boolean boo) haveBlock=boo; public int getX() return x; public int getY() return y; public boolean equal
28、s(Point p) if(p.getX()=this.getX()&p.getY()=this.getY() return true; else return false; public void setBlock(Block block) this.block=block; public Block getBlock() return block; import javax.swing.*;import java.io.*;import java.util.*;import java.awt.*;public class PuzzlePad extends JPanel Point poi
29、nt; Block block; int distance=56,grade,m=3,n=3; HandleMove handleMove; HandleImage handleImage; VerifySuccess verifySuccess; Image image; boolean isDigitPlay; public PuzzlePad() setBackground(Color.gray); setLayout(null); handleMove=new HandleMove(); handleMove.initSpendTime(); handleImage=new Handl
30、eImage(); verifySuccess=new VerifySuccess(); handleMove.setVerifySuccess(verifySuccess); public HandleMove getHandleMove() return handleMove; public void setImage(Image image) this.image=image; public void setGrade(int grade) this.grade=grade; if(grade=1) m=3; n=3; else if(grade=2) m=4; n=4; public
31、int getGrade() return grade; private void needInit() handleMove.initSpendTime(); removeAll(); point=new Pointmn; block=new Blockmn; int Hspace=distance,Vspace=distance; for(int i=0;im;i+) for(int j=0;jn;j+) pointij=new Point(Hspace,Vspace); Hspace=Hspace+distance; Hspace=distance; Vspace=Vspace+dist
32、ance; handleMove.setPoint(point); verifySuccess.setPoint(point); handleMove.setVerifySuccess(verifySuccess); int k=0; for(int i=0;im;i+) if(im-1) for(int j=0;jn;j+) blockij=new Block(); blockij.addMouseListener(handleMove); k+; else for(int j=0;jn-1;j+) blockij=new Block(); blockij.addMouseListener(
33、handleMove); k+; for(int i=0;im;i+) if(im-1) for(int j=0;jn;j+) add(blockij); blockij.setSize(distance,distance); blockij.setLocation(pointij.getX(),pointij.getY(); blockij.setAtPoint(pointij); pointij.setBlock(blockij); pointij.setHaveBlock(true); else for(int j=0;jn-1;j+) add(blockij); blockij.set
34、Size(distance,distance); blockij.setLocation(pointij.getX(),pointij.getY(); blockij.setAtPoint(pointij); pointij.setBlock(blockij); pointij.setHaveBlock(true); public void setIsDigitPlay() needInit(); isDigitPlay=true; ArrayList numberList=new ArrayList(); for(int k=0;km*n-1;k+) numberList.add(k+1); Object object=numberList.toArray(); verifyS