沈阳理工java课设走迷宫_第1页
沈阳理工java课设走迷宫_第2页
沈阳理工java课设走迷宫_第3页
沈阳理工java课设走迷宫_第4页
沈阳理工java课设走迷宫_第5页
已阅读5页,还剩14页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、沈阳理工大学课程设计 目录1设计目的 11.1课程设计的目的 12总体设计 12.1设计思路 12.2设计方法 23关键技术 44程序流程 45主要源代码 56. 运行结果及结论 177.参考文献 181. 设计目的 1.1课程设计的目的近年来,Java作为一种新的编程语言。以其简单性、可移植性和平台无关性等优点,得到广泛的应用,特别是Java与万维网的完美结合,使其成为网络编程和嵌入式编程领域的首选编程语言。Java语言是当今流行的网络编程语言,它具有面向对象、跨平台、分布应用等特点。面向对象的开发方法是当今世界最流行的开发方法,它不仅具有更贴近自然的语义,而且有利于软件的维护和继承。为了进

2、一步巩固课堂上所学到的知识,深刻把握Java语言的重要概念及其面向对象的特性,熟练应用面向对象的思想和设计方法解决实际问题的能力,也是为了增加同学们娱乐游戏选择而开发了一个适合学生的,能提升思考力的迷宫冒险游戏,这既锻炼了动手能力,还能进行消遣娱乐,可谓一举两得。2.总体设计“走迷宫”游戏是一个经典的游戏,它因操作简单、娱乐性强而广受欢迎。我们通过所学的JAVA,利用MyEclipse设计一个操作简单、界面美观、功能齐全的“走迷宫”游戏。通过本游戏的开发,达到学习Java技术和熟悉软件开发流程的目的。这个游戏是用图形界面实现的,通过编译解释后,出现一个图形界面。界面上方有一行菜单栏,点击菜单栏

3、上的按钮,出现下拉菜单,可选择不同模式的迷宫,游戏界面是由若干个小方格组成的,每个小方格有一个图标,形成迷宫2.1设计思路根据对游戏系统进行的需求分析,本系统将分为6个模块:分别是迷宫主界面模块、记时设计模块、迷宫设计模块、道路和障碍设计模块、动漫冒险者设计模块、出入口设计模块。实现的功能有:(1)迷宫的选择玩家可以根据自身需求来进行选择简单迷宫、中等迷宫、难度迷宫三类中选择一类迷宫进行游戏。(2)选择道路和障碍的图像 玩家可以根据个人喜好对迷宫中的道路和障碍的图片进行选择,但是图片的格式有规定,必须是“jpg”或“gif”格式的。(3)游戏记时 当玩家控制迷宫中的动漫人物进行游戏时,计时器就

4、开始进行记时,直到动漫人物到达出口时,记时结束,并在屏幕上显示游戏用时。(4)开始游戏玩家将鼠标移动至迷宫中的动漫冒险者,即可看到“单击我然后按键盘方向键”,单击后,游戏开始。玩家即可通过键盘上的方向键进行游戏。(5)游戏结束玩家控制动漫冒险者移动至迷宫地图的出口处时,游戏的计时器停止计时,并弹出信息框“恭喜您通关了”,游戏结束。(6)冒险脚步声玩家单击动漫冒险者后,便可以用键盘方向键进行控制。动漫冒险者每移动一步便会发出一声“嘟”的响声。(7)重新开始玩家可以根据个人对自己通关时间长短的满意程度选择再次挑战,单击“重新开始”即可。(8)计时界面位置利用边界式布局管理器BorderLayout

5、将计时界面置于上方。(9)再次挑战界面位置利用边界式布局管理器BorderLayout将再次挑战界面置于下方。迷宫冒险系统迷宫主界面模块记时设计模块迷宫设计模块道路和障碍设计模块动漫冒险者设计模块出入口设计模块图2.1 J迷宫冒险系统6大模块图2.2设计方法(1)迷宫冒险系统主界面模块迷宫冒险系统主界面模块包括MazeWindow.java和Maze.java两个文件。MazeWindow是迷宫冒险系统的主运行类,其中有运行整个程序的main方法,该文件生成了Maze类的一个实例,从而生成了迷宫冒险系统的界面。MazeWindow类继承自JFrame类,以ActionListener为接口实现

6、了事件侦听的接口,它有一个不带参数的构造方法MazeWindow (),用来生成MazeWindow的实例。MazeWindow类将所有的功能集中到菜单栏中,并通过调用其他模块来实现迷宫冒险系统的各个功能。(2)记时设计模块记时设计模块主要由HandleMove.java共1个文件组成。HandleMove类继承自JPanel类,以ActionListener为接口实现事件的侦听的接口。该模块利用了一个2维数组来进行实现,并对计时显示的字体、背景色、显示位置进行设计。该模块定义了一个无参返回值的变量SpendTime,利用SpendTime这个变量来对记时的开始触发源和记时的结束触发源。动漫冒

7、险者运动记时开始动漫冒险者到达出口记时结束图2.2计时流程图(3)迷宫设计模块迷宫设计模块主要由2个2维数组组成,它们组成了主界面中“选择迷宫”菜单的内容,其中包括简单迷宫、中等迷宫、难度迷宫三大类。该模块的类继承自JLayeredPane类,主要通过2个2维数组来实现。并且对迷宫中的道路和障碍的插入图片格式进行了要求。该模块使用try和catch来捕获和处理异常。当迷宫地图不可用时则弹出对话框“无效的迷宫文件”。(4)道路和障碍设计模块系统道路和障碍设计模块主要由MazePoint.java这个文件组成,这个文件组成了主界面中的迷宫地图中的道路和障碍的内容。 (5)动漫冒险者设计模块动漫冒险

8、者设计模块主要是对迷宫地图中处于入口处的动漫冒险玩家进行设计。该模块利用语句使鼠标箭头移动到动漫冒险者上时显示文字“单击我,然后按键盘方向键”,并为冒险者的图片格式、长度、宽带、初始位置等等进行进一步的设计,让动漫冒险者更加生动。(6)出入口设计模块出入口设计模块主要是定义了出口与入口以及当动漫冒险者处于这两个位置时的状态和事件的链接。3.关键技术在设计走迷宫小游戏时,(如图3-1)编写了6个JAVA源文件:MazeWindow.java、MazePoint.java、WallOrRoad.java、Maze.java、PersonInMaze.java、HandleMove.javaMaze

9、WindowJMenuFileMazePersonlnMazeePersonlnMazeMazePointWallORroadHandleMove 如图3-1 关系图4.程序流程图开始进入主界面迷宫选择NoYes路和障碍选择简单迷宫地图默认的迷宫地图中等迷宫地图难度迷宫地图确认选择Yes自行选择符合格式的道路和障碍图片No点击冒险者(3)迷宫设计模块迷宫设计模块主要由2个2维数组组成,它们组成了主界面中“选择迷宫”菜单的内容,其中包括简单迷宫、中等迷宫、难度迷宫三大类。该模块的类继承自JLayeredPane类,主要通过2个2维数组来实现。并且对迷宫中的道路和障碍的插入图片格式进行了要求。该模

10、块使用try和catch来捕获和处理异常。当迷宫地图不可用时则弹出对话框“无效的迷宫文件”。(4)道路和障碍设计模块系统道路和障碍设计模块主要由MazePoint.java这个文件组成,这个文件组成了主界面中的迷宫地图中的道路和障碍的内容。 (5)动漫冒险者设计模块动漫冒险者设计模块主要是对迷宫地图中处于入口处的动漫冒险玩家进行设计。该模块利用语句使鼠标箭头移动到动漫冒险者上时显示文字“单击我,然后按键盘方向键”,并为冒险者的图片格式、长度、宽带、初始位置等等进行进一步的设计,让动漫冒险者更加生动。(6)出入口设计模块出入口设计模块主要是定义了出口与入口以及当动漫冒险者处于这两个位置时的状态和

11、事件的链接。(7)迷宫冒险流程图确认选择键盘方向键控制到达出口结束再次挑战图4.1迷宫游戏流程图5.主要源代码import javax.swing.*;import java.awt.*;import java.awt.event.*;import java.io.*;import javax.swing.filechooser.*;public class MazeWindow extends JFrame implements ActionListener Maze maze; JMenuBar bar; JMenu menuChoice,menuImage; JMenuItem wall

12、Image,roadImage,defaultImage; File mazeFile,wallImageFile,roadImageFile; JButton renew; MazeWindow() wallImageFile=new File("wall.jpg"); roadImageFile=new File("road.jpg"); bar=new JMenuBar(); menuChoice=new JMenu("选择迷宫"); File dir=new File("."); File file=dir

13、.listFiles(new FilenameFilter() public boolean accept(File dir,String name) return name.endsWith("maze"); ); for(int i=0;i< file.length;i+) JMenuItem item=new JMenuItem(filei.getName(); item.addActionListener(this); menuChoice.add(item); mazeFile=new File(file0.getName(); init(); menuIm

14、age=new JMenu("选择墙和路的图像(JPG,GIF)"); wallImage=new JMenuItem("墙的图像"); roadImage=new JMenuItem("路的图像"); defaultImage=new JMenuItem("墙和路的默认图像"); menuImage.add(wallImage); menuImage.add(roadImage); menuImage.add(defaultImage); bar.add(menuChoice); bar.add(menuImag

15、e); setJMenuBar(bar); wallImage.addActionListener(this); roadImage.addActionListener(this); defaultImage.addActionListener(this); renew=new JButton("重新开始"); renew.addActionListener(this); add(maze,BorderLayout.CENTER); add(renew,BorderLayout.SOUTH); setVisible(true); setBounds(60,60,510,48

16、0); validate(); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); public void init() if(maze!=null) remove(maze); remove(maze.getHandleMove(); maze=new Maze(); maze.setWallImage(wallImageFile); maze.setRoadImage(roadImageFile); maze.setMazeFile(mazeFile); add(maze,BorderLayout.CENTER); add(maze.getHan

17、dleMove(),BorderLayout.NORTH); validate(); public void actionPerformed(ActionEvent e) if(e.getSource()=roadImage) JFileChooser chooser=new JFileChooser(); FileNameExtensionFilter filter = new FileNameExtensionFilter( "JPG & GIF Images", "jpg", "gif"); chooser.setFil

18、eFilter(filter); int state=chooser.showOpenDialog(null); File file=chooser.getSelectedFile(); if(file!=null&&state=JFileChooser.APPROVE_OPTION) roadImageFile=file; maze.setRoadImage(roadImageFile); else if(e.getSource()=wallImage) JFileChooser chooser=new JFileChooser(); FileNameExtensionFil

19、ter filter = new FileNameExtensionFilter( "JPG & GIF Images", "jpg", "gif"); chooser.setFileFilter(filter); int state=chooser.showOpenDialog(null); File file=chooser.getSelectedFile(); if(file!=null&&state=JFileChooser.APPROVE_OPTION) wallImageFile=file; maz

20、e.setWallImage(wallImageFile); else if(e.getSource()=defaultImage) wallImageFile=new File("wall.jpg"); roadImageFile=new File("road.jpg"); maze.setWallImage(wallImageFile); maze.setRoadImage(roadImageFile); else if(e.getSource()=renew) init(); else JMenuItem item=(JMenuItem)e.get

21、Source(); mazeFile=new File(item.getText(); init(); public static void main(String args) new MazeWindow(); import java.awt.*;import java.awt.event.*;import javax.swing.*;import java.io.*;public class Maze extends JLayeredPane File mazeFile; MazePoint mazePoint; WallOrRoad wallOrRoad; PersonInMaze pe

22、rson; HandleMove handleMove; File wallImage,roadImage; int distance=26,m=0,n=0; public Maze() setLayout(null); wallImage=new File("wall.jpg"); roadImage=new File("road.jpg"); person=new PersonInMaze(); handleMove=new HandleMove(); handleMove.initSpendTime(); person.addKeyListener

23、(handleMove); setLayer(person,JLayeredPane.DRAG_LAYER); public void setMazeFile(File f) mazeFile=f; char a; RandomAccessFile in=null; String lineWord=null; try in=new RandomAccessFile(mazeFile,"r"); long length=in.length(); long position=0; in.seek(position); while(position<length) Stri

24、ng str=in.readLine().trim(); if(str.length()>=n) n=str.length(); position=in.getFilePointer(); m+; a=new charmn; position=0; in.seek(position); m=0; while(position<length) String str=in.readLine(); am=str.toCharArray(); position=in.getFilePointer(); m+; in.close(); wallOrRoad=new WallOrRoadmn;

25、 for(int i=0;i<m;i+) for(int j=0;j<n;j+) wallOrRoadij=new WallOrRoad(); if(aij='1') wallOrRoadij.setIsWall(true); wallOrRoadij.setWallImage(wallImage); wallOrRoadij.repaint(); else if(aij='0') wallOrRoadij.setIsRoad(true); wallOrRoadij.setRoadImage(roadImage); wallOrRoadij.repa

26、int(); else if(aij='*') wallOrRoadij.setIsEnter(true); wallOrRoadij.setIsRoad(true); wallOrRoadij.repaint(); else if(aij='#') wallOrRoadij.setIsOut(true); wallOrRoadij.setIsRoad(true); wallOrRoadij.repaint(); mazePoint=new MazePointmn; int Hspace=distance,Vspace=distance; for(int i=0

27、;i<m;i+) for(int j=0;j<n;j+) mazePointij=new MazePoint(Hspace,Vspace); Hspace=Hspace+distance; Hspace=distance; Vspace=Vspace+distance; for(int i=0;i<m;i+) for(int j=0;j<n;j+) add(wallOrRoadij); wallOrRoadij.setSize(distance,distance); wallOrRoadij. setLocation(mazePointij.getX(),mazePoi

28、ntij.getY(); wallOrRoadij.setAtMazePoint(mazePointij); mazePointij.setWallOrRoad(wallOrRoadij); mazePointij.setIsWallOrRoad(true); if(wallOrRoadij.getIsEnter() person.setAtMazePoint(mazePointij); add(person); person.setSize(distance,distance); person. setLocation(mazePointij.getX(),mazePointij.getY(

29、); person.requestFocus(); person.repaint(); handleMove.setMazePoint(mazePoint); catch(IOException exp) JButton mess=new JButton("无效的迷宫文件"); add(mess); mess.setBounds(30,30,100,100); mess.setFont(new Font("宋体",Font.BOLD,30); System.out.println(exp+"mess"); public void se

30、tWallImage(File f) wallImage=f; for(int i=0;i<m;i+) for(int j=0;j<n;j+) if(wallOrRoadij.getIsWall() wallOrRoadij.setWallImage(wallImage); wallOrRoadij.repaint(); public void setRoadImage(File f) roadImage=f; for(int i=0;i<m;i+) for(int j=0;j<n;j+) if(wallOrRoadij.getIsRoad() wallOrRoadij

31、.setRoadImage(roadImage); wallOrRoadij.repaint(); public HandleMove getHandleMove() return handleMove; import java.awt.event.*;import java.awt.*;import javax.swing.*;public class HandleMove extends JPanel implements KeyListener,ActionListener MazePoint p; int spendTime=0; javax.swing.Timer recordTim

32、e; JTextField showTime; Toolkit tool; HandleMove() recordTime=new javax.swing.Timer(1000,this); showTime=new JTextField(16); tool=getToolkit(); showTime.setEditable(false); showTime.setHorizontalAlignment(JTextField.CENTER); showTime.setFont(new Font("楷体_GB2312",Font.BOLD,16); JLabel hitMe

33、ss=new JLabel("单击走迷宫者,按键盘方向键",JLabel.CENTER); hitMess.setFont(new Font("楷体_GB2312",Font.BOLD,18); add(hitMess); add(showTime); setBackground(Color.cyan); public void setMazePoint(MazePoint point) p=point; public void initSpendTime() recordTime.stop(); spendTime=0; showTime.setTex

34、t(null); public void keyPressed(KeyEvent e) recordTime.start(); PersonInMaze person=null; person=(PersonInMaze)e.getSource(); int m=-1,n=-1; MazePoint startPoint=person.getAtMazePoint(); for(int i=0;i<p.length;i+) for(int j=0;j<pi.length;j+) if(startPoint.equals(pij) m=i; n=j; break; if(e.getK

35、eyCode()=KeyEvent.VK_UP) int k=Math.max(m-1,0); if(pkn.getWallOrRoad().getIsRoad() tool.beep(); /发出嘟的一声 person.setAtMazePoint(pkn); person.setLocation(pkn.getX(),pkn.getY(); else if(e.getKeyCode()=KeyEvent.VK_DOWN) int k=Math.min(m+1,p.length-1); if(pkn.getWallOrRoad().getIsRoad() tool.beep(); perso

36、n.setAtMazePoint(pkn); person.setLocation(pkn.getX(),pkn.getY(); else if(e.getKeyCode()=KeyEvent.VK_LEFT) int k=Math.max(n-1,0); if(pmk.getWallOrRoad().getIsRoad() tool.beep(); person.setAtMazePoint(pmk); person.setLocation(pmk.getX(),pmk.getY(); else if(e.getKeyCode()=KeyEvent.VK_RIGHT) int k=Math.

37、min(n+1,p0.length-1); if(pmk.getWallOrRoad().getIsRoad() tool.beep(); person.setAtMazePoint(pmk); person.setLocation(pmk.getX(),pmk.getY(); public void actionPerformed(ActionEvent e) spendTime+; showTime.setText("您的用时:"+spendTime+"秒"); public void keyReleased(KeyEvent e) PersonIn

38、Maze person=(PersonInMaze)e.getSource(); int m=-1,n=-1; MazePoint endPoint=person.getAtMazePoint(); if(endPoint.getWallOrRoad().getIsOut() recordTime.stop(); JOptionPane.showMessageDialog(this,"您成功了!","消息框", JOptionPane.INFORMATION_MESSAGE ); public void keyTyped(KeyEvent e) publ

39、ic class MazePoint int x,y; boolean haveWallOrRoad; WallOrRoad wallOrRoad=null; public MazePoint(int x,int y) this.x=x; this.y=y; public boolean isHaveWallOrRoad() return haveWallOrRoad; public void setIsWallOrRoad(boolean boo) haveWallOrRoad=boo; public int getX() return x; public int getY() return

40、 y; public boolean equals(MazePoint p) if(p.getX()=this.getX()&&p.getY()=this.getY() return true; else return false; public void setWallOrRoad(WallOrRoad obj) wallOrRoad=obj; public WallOrRoad getWallOrRoad() return wallOrRoad; import javax.swing.*;import java.awt.*;public class PersonInMaze

41、 extends JTextField MazePoint point; Toolkit tool; PersonInMaze() tool=getToolkit(); setEditable(false); setBorder(null); setOpaque(false); setToolTipText("单击我,然后按键盘方向键"); public void setAtMazePoint(MazePoint p) point=p; public MazePoint getAtMazePoint() return point; public void paintComp

42、onent(Graphics g) super.paintComponent(g); int w=getBounds().width; int h=getBounds().height; Image image=tool.getImage("person.gif"); g.drawImage(image,0,0,w,h,this); import javax.swing.*;import java.awt.*;import javax.swing.border.*;import java.io.*;public class WallOrRoad extends JPanel

43、 boolean isRoad,isWall,isEnter,isOut; MazePoint point; File wallImage,roadImage; Toolkit tool; WallOrRoad() tool=getToolkit(); public void setIsEnter(boolean boo) isEnter=boo; if(isEnter=true) add(new JLabel("入口"); public boolean getIsEnter() return isEnter; public void setIsOut(boolean boo) isOut=boo; if(isOut=true) add(new JLabel("出口"); public boolean getIsOut() return isOut; public void setIsRoad(boolean boo) isRoad=boo; if(isRoad=true

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论