数据结构(java)走迷宫

时间:2024.4.1

     华东交大理工学院

   课程设计(论文)任务书

  电信 分  院       2009   电子商务             专  业 (1 

一、课程设计(论文)题目                               

二、课程设计(论文)工作自  20## 620日起至 20##  630 日止。

三、课程设计(论文) 地点:     机房                 

四、课程设计(论文)内容要求:

1.本课程设计的目的

(1)熟练掌握数据结构的基本算法,提高算法设计与分析能力

(2)基本掌握面向对象设计基本思路和方法;

(3)利用所学的基本知识和技能,解决简单的程序设计问题;

(4)提高学生的科技论文写作能力。 

2.课程设计的任务及要求

1)基本要求:

(1)课程设计前必须根据课程设计题目认真准备实验源程序及调试时所需的数据;

(2)要求采用简明、严格的问题描述,设计求解算法;

(3)数据结构选用得当,程序结构合理;

(4)程序简明易懂,多运用输出提示,程序运行正确;

(5)对设计进行总结和讨论。

2)课程设计论文编写要求

(1)要按照书稿的规格打印撰写课设论文

(2)论文包括目录、正文、总结和体会、参考文献、附录等

(3)正文中要有问题描述、设计求解算法、算法的实现、调试分析(调试时出现

的主要问题:编译语法错误及修改,重点是运行逻辑问题修改和调整)

(4)课设论文装订按学校的统一要求完成

3)课设考核:

从以下几方面来考查:

(1)出勤情况;

(2)设计任务的难易程度及饱满程度;

(3)课设任务完成情况;

(4)动手调试能力;

(5)论文撰写的原理分析、设计思路以及论述的层次性、条理性、格式的规范性。

4)参考文献:

[1] 王元珍,韩宗芬.IBM-PC宏汇编语言程序设计(第二版).华中理工大学出版社.

[2]叶核亚《数据结构(Java版)(第2版)》电子工业出版社

[3] 耿祥义、张跃平 Java基础教程(第2版)清华大学出版社

[4]刘小晶  数据结构(Java语言描述)  清华大学出版社

5)课程设计进度安排

内容                 天数      地点

构思及收集资料            3       图书馆

程序设计与调试            4       计算机房

撰写论文                3       图书馆

6)选择课程设计题目具体要求:

走迷宫:

1、用递归算法实现,以栈和队列作为辅助结构,

2、并设计图形用户界面提供迷宫大小、入口及出口位置和初始状态等,

3、演示走迷宫的过程和结果。

学生签名:         

   20##年6月30日

课程设计(论文)评审意见

(1)任务难易及完成情况  :优( )、良( )、中( )、一般( )、差( );

(2)调试能力评价       :优( )、良( )、中( )、一般( )、差( );

(3)论文撰写水平评价  :优( )、良( )、中( )、一般( )、差( );

(4)论文格式规范性评价  :优( )、良( )、中( )、一般( )、差( );

(5)考勤                :优( )、良( )、中( )、一般( )、差( );

总评成绩

评阅人:   李广丽       职称:  讲师     

20##年7月2日


目 录[chenhl1] 

绪论........................................................................................ 1

第一章  概要设计..................................................................... 2

第二章  详细设计..................................................................... 3

第三章  调试分析与截图............................................................. 4

总结和体会............................................................................. 5

参考文献................................................................................ 6


绪  论

1.编制一个求解迷宫通路的图形界面演示程序

2.设置一个可以任意设置障碍,删除障碍的迷宫。并求出迷宫的一条通路

3.根据用户界面提示,可以使用事先设定的迷宫也可以使用自定义的迷宫。在着迷宫同路的过程中,需将查找的过程演示出来,并且在最后时,需要标记出查找成功的一条路径。

4.本程序只求出一条成功的通路,因受图形界面限制,不能保存或载入测试文件(此功能可在Maze_text中实现)。
5)当路径掩盖起点或终点时,消息显示“Is there any way to go ?tell me”;找到路径时,屏幕显示足迹,并在消息框出现,“bingo find it,so easy”


第一章  概要设计

为实现上述程序功能,主要使用的JAVA  AWT和JAVA  SWING包

import java.awt.*;

import javax.swing.*;

importhartech.ui.*;

3. 本程序包含四个模块:

1) 主程序模块:

   

import java.awt.*;

import javax.swing.*;

import hartech.ui.*;

/**

 * <p>Title: maze Global class</p>

 *

 * <p>Description: </p>

 *

 * <p>Date: 20##-08-31 </p>

 */

public class Main {

       // _reset 变量用于reset时用

       static int rows = 12, cols = 14;

       static int speed_reset = 50, speed = speed_reset;

       static JToggleButton[][] buttons;

       static Walking walking;

       static boolean[][] brick, brick_reset = {

                     { true, true, true, true, true, false, true, true, true, true,

                                   true, true, true, true, },

                     { true, false, false, false, true, false, true, true, true, true,

                                   false, false, false, true, },

                     { true, false, true, false, true, false, false, false, false, true,

                                   true, false, true, true, },

                     { true, false, true, false, true, false, true, true, true, false,

                                   true, false, true, false, },

                     { true, true, true, false, false, false, true, false, true, false,

                                   true, false, true, true, },

                     { true, false, true, true, true, true, true, false, true, false,

                                   true, false, false, true, },

                     { true, false, true, true, true, true, true, false, true, false,

                                   true, false, true, true, },

                     { true, false, false, false, false, false, true, true, true, false,

                                   true, false, true, false, },

                     { true, false, true, true, true, false, false, false, false, false,

                                   true, false, true, true, },

                     { true, false, true, false, true, false, true, true, true, true,

                                   true, false, false, true, },

                     { true, false, true, false, true, false, true, false, false, false,

                                   false, false, true, true, },

                     { true, true, true, false, true, true, true, true, true, true,

                                   true, false, true, true, }

       };

       static JFrame jFrame;

       static UI ui;

       public static void main(String[] args) {

              //启动新线程,创建一个窗口

              javax.swing.SwingUtilities.invokeLater(new Runnable() {

                     public void run() {

                            J.setLookAndFeel("Metal");

                            jFrame = new JFrame(

                                          "is there any way to go?  Maze --- www.hartech.cn");//建立一个Swing窗体

                            jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//单击关闭图标后,程序退出并关闭

                            // add

                            Main.ui = new UI();

                            jFrame.add(ui, BorderLayout.CENTER);

                            jFrame.setSize(700, 400);

                            J.goCenter(jFrame);

                            Main.drawButtons();

                            Main.reset();

                            jFrame.setVisible(true);

                     }

              });

       }

       // 用于重置到软件开始

       public static void reset() {

              if (walking != null) {

                     walking.timer.stop();

              }

              clean();

              brick = copyBoolean(brick_reset);

              speed = speed_reset;

              UI.jSlider.setValue(speed);

              setBricks();

       }

       // 用于清楚已标记上的数字

       public static void clean() {

              if (walking != null) {

                     walking.timer.stop();

              }

              for (int i = 0; i < rows; i++) {

                     for (int j = 0; j < cols; j++) {

                            buttons[i][j].setText("");//清除按钮的数字,设置名字为空

                            buttons[i][j].setForeground(null);

                     }

              }

              UI.jLabel_state.setText("  Move now?");

       }

       // 去掉全部砖

       public static void blank() {

              if (walking != null) {

                     walking.timer.stop();

              }

              for (int i = 0; i < rows; i++) {

                     for (int j = 0; j < cols; j++) {

                            buttons[i][j].setText("");

                            buttons[i][j].setForeground(null);

                            buttons[i][j].setSelected(true);

                     }

              }

              UI.jLabel_state.setText("  Move now?");

       }

// 重画按钮图,根据rows、cols

       public static JPanel drawButtons() {

              buttons = new JToggleButton[rows][cols];

              UI.jPanel_map = new JPanel(new GridLayout(rows, cols));

              for (int i = 0; i < rows; i++) {

                     for (int j = 0; j < cols; j++) {

                            buttons[i][j] = new JToggleButton();

                            UI.jPanel_map.add(buttons[i][j]);

                     }

              }

              Main.ui.add(UI.jPanel_map, BorderLayout.CENTER);

              Main.ui.setVisible(true);

              return UI.jPanel_map;

       }

       // 根据brick[][]设置按钮障碍

       public static void setBricks() {

              for (int i = 0; i < rows; i++) {

                     for (int j = 0; j < cols; j++) {

                            buttons[i][j].setSelected(brick[i][j]);

                     }

              }

       }

       // 根据现在按钮情况设置brick[][]数组,用于move()内前面

       public static void readBricks() {

              for (int i = 0; i < rows; i++) {

                     for (int j = 0; j < cols; j++) {

                            brick[i][j] = buttons[i][j].isSelected();

                     }

              }

       }

       // 开始走

       public static void move() {

              if (walking != null) {

                     walking.timer.stop();

              }

              clean();

              readBricks();

              //readToFile();

              walking = new Walking(brick);

       }

       /**

        // 用于把绘制好地图数据写入文件

        public static void readToFile() {

        String out = "";

        for (int i = 0; i < rows; i++) {

        out += "{";

        for (int j = 0; j < cols; j++) {

        if (brick[i][j]) {

        out += "true,";

        }

        else {

        out += "false,";

        }

        }

        out += "},\r\n";

        }

        hartech.JFile.stringToFile(out, "E:/dest.txt");

        }

        */

       // 复制二维数组

       public static boolean[][] copyBoolean(boolean[][] in) {

              int row = in.length, col = in[0].length;

              boolean[][] out = new boolean[row][col];

              for (int i = 0; i < row; i++) {

                     for (int j = 0; j < col; j++) {

                            out[i][j] = in[i][j];

                     }

              }

              return out;

       }

}

2) UI模块——实现整个控制面板内组件的布局管理;

3)Walking模块——实现走迷宫的算法;

4)Applete模块——设置控制面板。


第二章  详细设计

package hartech.kids.maze;

import java.awt.*;

import java.awt.event.*;

import javax.swing.*;

import javax.swing.event.*;

/**

 * <p>Title: maze's MainUI </p>

 *

 * <p>Description: </p>

 *

 * <p>Date: 20##-08-31 </p>

 */

publicclass UI extends JPanel {

    privatestaticfinallongserialVersionUID = 5924032800440919028L;

    static JPanel jPanel_state, jPanel_map, jPanel_control;

    static JLabel jLabel_state;

    static JButton jButton_move, jButton_clean, jButton_blank, jButton_reset;

    static JSlider jSlider;//添加面板,向面板里添加各个组件

    public UI() {

       super(new BorderLayout());

       // add

       add(jPanel_control(), BorderLayout.SOUTH);//布局管理器,从左到右设置按钮

    }

    publicstatic JPanel jPanel_control() {

       jLabel_state = new JLabel("  Move now?");

       jLabel_state.setHorizontalTextPosition(JLabel.LEFT);//将Move now标签添加

       //在面板的左下角

       jSlider = new JSlider(JSlider.HORIZONTAL, 5, 400, Main.speed);//建立一个水平方向的滑竿

       jSlider.setPreferredSize(new Dimension(5, 5));//滑杆的大小

       jSlider.setBackground(new Color(208, 220, 255));

       jSlider.addChangeListener(new ChangeListener() {

           publicvoid stateChanged(ChangeEvent e) {

              Main.speed = ((JSlider) e.getSource()).getValue();

           }//处理changeEvent时间,当用户滑动杆时速度会改变

       });

//为各个按钮添加监视器

       jButton_move = new JButton("Move!");

       jButton_move.addActionListener(new ActionListener_button());

       jButton_move.setActionCommand("move");

       jButton_clean = new JButton("Clean");

       jButton_clean.addActionListener(new ActionListener_button());

       jButton_clean.setActionCommand("clean");

       jButton_blank = new JButton("Blank");

       jButton_blank.addActionListener(new ActionListener_button());

       jButton_blank.setActionCommand("blank");

       jButton_reset = new JButton("Reset");

       jButton_reset.addActionListener(new ActionListener_button());

       jButton_reset.setActionCommand("reset");

       jPanel_control = new JPanel();

       // Option: X_AXIS Y_AXIS LINE_AXIS PAGE_AXIS

       jPanel_control

              .setLayout(new BoxLayout(jPanel_control, BoxLayout.X_AXIS));

       //jPanel_control = new JPanel(new FlowLayout(FlowLayout.RIGHT));

       jPanel_control.setBackground(new Color(208, 220, 255));

       jPanel_control.add(jLabel_state);

       jPanel_control.add(Box.createHorizontalGlue());//从左到右设置按钮

       jPanel_control.add(jSlider);

       jPanel_control.add(jButton_move);

       jPanel_control.add(jButton_clean);

       jPanel_control.add(jButton_blank);

       jPanel_control.add(jButton_reset);

       returnjPanel_control;

    }

//监视器接口

    staticclass ActionListener_button implements ActionListener {

       publicvoid actionPerformed(ActionEvent e) {

           if (e.getActionCommand().equals("move")) {

              Main.move();

           } elseif (e.getActionCommand().equals("clean")) {

              Main.clean();

           } elseif (e.getActionCommand().equals("blank")) {

              Main.blank();

           } elseif (e.getActionCommand().equals("reset")) {

              Main.reset();

           }

       }

    }

}

2Applete模块

package hartech.kids.maze;

import java.awt.BorderLayout;

import java.awt.Color;

import javax.swing.*;

public class Applet extends JApplet {

       private static final long serialVersionUID = -5507838717556718924L;

       public void init() {

              JPanel jPanel = new JPanel(new BorderLayout());

              jPanel

                            .setBorder(BorderFactory

                                          .createTitledBorder("is there any way to go?  Maze --- www.hartech.cn"));

              jPanel.setBackground(Color.WHITE);

              Main.ui = new UI();

              // add

              jPanel.add(Main.ui);

              add(jPanel, BorderLayout.CENTER);

              setSize(700, 400);

              Main.drawButtons();

              Main.reset();

              setVisible(true);

       }

}

3.Walking模块

package hartech.kids.maze;

import hartech.ds.Stack;

import java.awt.*;

import java.awt.event.ActionListener;

import java.awt.event.ActionEvent;

import javax.swing.Timer;

/**

 * <p>

 * Tite: 迷宫问题

 * </p>

 *

 * <p>

 * Description: 以一个mxn的长方阵表示迷宫,0和1分别表示迷宫中的通路和障碍。

 * 设计一个程序,对任意设定的迷宫,求出一条从入口到出口的通路,或得出没有通路的结论。

 *

 * 下面用递归实现,实际上就是用了图深度优先遍历 走过的格子直接标记为障碍 line 76: 入栈、入递归、出栈,为了保持现场,类似于Practice_2_3

publicclass Walking {

    privateint rows;

    privateint cols;

    private Dimension goal;

    @SuppressWarnings("unused")

    private Dimension begin;

    // false 为障碍或已走过

    privateboolean map[][];

    private Stack stack, stack_hasWalk, stack_route;

    privateboolean hasFound = false;

    privateint count = 1;

Timer timer = new Timer(Main.speed, new ActionListener_Timer());

// 初始化,输入地图 NxM

    public Walking(boolean[][] map) {

       this(map, new Dimension(0, 0), new Dimension(map.length - 1,

              map[0].length - 1));

    }

    // 初始化,可自定义 起始位置、终点位置

    public Walking(boolean[][] map, Dimension begin, Dimension goal) {

       rows = map.length;

       cols = map[0].length;

       this.map = Main.copyBoolean(map);

       this.goal = goal;

       this.begin = begin;

       stack = new Stack();

       stack_hasWalk = new Stack();

       stack_route = new Stack();

       spider(begin.width, begin.height);

       printWalking();

    }

    // 根据stack_hasWalk、stack_route演示已经的路和正确的路

    privatevoid printWalking() {

       stack_hasWalk.reverse();

       timer.setDelay(Main.speed);

       timer.start();

    }

// 用于timer中激发的事件,演示慢慢走路

    class ActionListener_Timer implements ActionListener {

       publicvoid actionPerformed(ActionEvent e) {

           Dimension d;

           // 走完了

           if (stack_hasWalk.isEmpty()) {

              // 标记正确路线

              while (!stack_route.isEmpty()) {

                  d = (Dimension) stack_route.pop();

                 Main.buttons[d.width][d.height].setForeground(new Color(204, 52, 103));

              }

              if (!hasFound) {

    UI.jLabel_state.setText("  is there any way to go ?  tell me !");

              } else {

Main.buttons[Main.rows - 1][Main.cols - 1].setText("^^");

Main.buttons[0][0].setForeground(new Color(204, 52, 103));

Main.buttons[Main.rows - 1][Main.cols - 1].setForeground(new Color(204, 52, 103));

       UI.jLabel_state.setText("  Bingo !  i find it !  so easy...");

              }

              // 停止该定时器

              timer.stop();

           }

           // 慢慢走中。。。

           else {

              d = (Dimension) stack_hasWalk.pop();

              Main.buttons[d.width][d.height]

                     .setText(String.valueOf(count++));

           }

       }

    }

    privatevoid spider(int row, int col) {

       // 本蜘蛛停止探测,原因:要探测区域出界 或为障碍 或已探测过 或其它蜘蛛已找到目标

       if (row < 0 || row > rows - 1 || col < 0 || col > cols - 1

              || !map[row][col] || hasFound) {

           return;

       }

       // 找到了

       elseif (goal.width == row && goal.height == col) {

           hasFound = true;

           stack_route = (Stack) stack.clone();

       }

       // 向四个方向探测,顺时钟

       else {

           // 标记已走过

           map[row][col] = false;

           stack_hasWalk.push(new Dimension(row, col));

           // 右

           stack.push(new Dimension(row, col + 1));

           spider(row, col + 1);

           stack.pop();

           // 下

           stack.push(new Dimension(row + 1, col));

           spider(row + 1, col);

           stack.pop();

           // 左

           stack.push(new Dimension(row, col - 1));

           spider(row, col - 1);

           stack.pop();

           // 上

           stack.push(new Dimension(row - 1, col));

           spider(row - 1, col);

           // ** 递归回来后出栈,可维持栈的原来状态,就像没进入递归一样,然后进行下面方向探测

           stack.pop();

       }

    }

}


第三章  调试分析与截图

1、  调试分析:

在设计走迷宫算法的过程中,我主要是利用递归求解和入栈,出栈来解决的。从起点开始出发,每次都首先使自身节点右边的节点入栈,当遇到障碍物时,使下方节点入栈,又遇到障碍物时使左方节点入栈,再使上方节点入栈,依次类推。走过的节点也算作障碍物,知道找到一条通路。再将通路节点一次出栈,并将字体颜色设置为红色。

经过调试分析,本程序能够完成需求分析的各项需求。

2、  截图:

本程序的运行环境为JAVA

进入演示程序后即显示图形用户界面:

3. 单击“Move!”按钮即可开始走迷宫。迷宫运行后如图

红色数字部分为其中一条通路。

4. 单击“Blank”按钮后可重新设置迷宫如图

5. 点击“Clean”按钮可消除搜寻迷宫通路留下的痕迹,点击“Move”可重新搜寻迷宫通路

6. 点击“Reset”可复位,即显示出原先的迷宫。

7. 进度条可控制搜寻迷宫通路过程的速度。


总结和体会

本次数据结构课程设计,我设计的是迷宫通路求解。主要使用了JAVA  AWT包和JAVA  SWING包,刚开始学的时候主要接触的都是JAVA  AWT,通过这次学习让我能够更加系统的自学了JAVA  SWING包中的一些组件及其构造方法。在求解迷宫算法的设计中,我算法的核心思想就是递归和入栈出栈。由于一开始设计的失误导致,迷宫通路的求解一直不能正确的运行,在经过反复调试后,经实践证明其可以实现查找通路的功能


参考文献

 [1] 王元珍,韩宗芬.IBM-PC宏汇编语言程序设计(第二版).华中理工大学出版社.

[2]叶核亚《数据结构(Java版)(第2版)》电子工业出版社

[3] 耿祥义、张跃平 Java基础教程(第2版)清华大学出版社

[4]刘小晶  数据结构(Java语言描述)  清华大学出版社


各个章节使用标题格式,然后利用菜单插入-〉引用-〉索引和目录 自动生成目录

更多相关推荐:
数据结构总结

第一章1、数据元素是数据的基本单位;数据项是数据的不可分割的最小单位。2、数据结构:4种基本结构为:集合,线性结构,树状结构,图状结构或网状结构DS组成:逻辑结构(结构定义中的关系描述是数据元素之间的逻辑关系)…

数据结构总结

《数据结构与算法》课程学习总结报告本学期开设的《数据结构与算法》课程已经告一段落,现就其知识点及其掌握情况、学习体会以及对该门课程的教学建议等方面进行学习总结。一、《数据结构与算法》知识点第一章是这门学科的基础…

数据结构总结

一,基础知识数据(Data):是客观事物的符号表示。在计算机科学中指的是所有能输入到计算机中并被计算机程序处理的符号的总称。数据元素(DataElement):是数据的基本单位,在程序中通常作为一个整体来进行考…

java部分数据结构总结

packagedatastructtest;importjava.io.File;importjava.io.FileReader;importjava.io.FileWriter;importjava.io.…

数据结构总结

本学期开设的《数据结构与算法》课程已经告一段落,现就其知识点及其掌握情况、学习体会以及对该门课程的教学建议等方面进行学习总结。一、《数据结构与算法》知识点在课本的第一章便交代了该学科的相关概念,如数据、数据元素…

数据结构总结

第四章排序程序设计初步本章介绍线性表的一个主要应用——排序,讲解了排序相关的基本概念和排序算法的一般思路,包括直接插入排序、简单选择排序、冒泡排序以及静态链表插入排序,并给出了其程序设计源码,通过程序设计技巧和…

二级考试题-数据结构总结

二级C公共基础知识总结二级C公共基础知识总结数据结构与算法1算法算法:是指解题方案的准确而完整的描述。算法不等于程序,也不等计算机方法,程序的编制不可能优于算法的设计。算法的基本特征:是一组严谨地定义运算顺序的…

数据结构心得体会

心得体会数据结构是一门纯属于设计的科目它需用把理论变为上机调试在学习科目的第一节课起鲁老师就为我们阐述了它的重要性它对我们来说具有一定的难度它是其它编程语言的一门基本学科很多同学都说数据结构不好学这我深有体会刚...

数据结构期末总结

您现在的位置希赛教育首页gt自考学院gt数据结构与算法gt正文数据结构第三章栈与队列习题参考答案作者自考频道来源希赛教育20xx年1月5日发表评论进入社区一基础知识题31设将整数1234依次进栈但只要出栈时栈非...

“数据结构”课程总结

数据结构课程总结计算机科学与技术专业从19xx年开始为我校专科生开设数据结构课程20xx年开始为本科生开设这门课程由于本门课程的教学从教材讲授实验指导都体现了先进的教育理念该课程的教学体系科学完整教学手段与方法...

数据结构知识点总结

练习题只是告诉大家知识点的考查形式考题类型及难易程度不具有其他任何意义所以大家千万不要只看练习题请对照以下重要知识点课件和课本相结合认真复习希望大家考试顺利OO20xx20xx2数据结构知识点总结1111数据结...

数据结构知识点总结

数据结构知识点总结1数据结构定义是数据的逻辑结构和存储结构及其操作2数据结构主要是增删改查排序等功能的实现3数据结构之间的关系有三种逻辑存储数据运算4数据结构的存储结构分为两种顺序和链式而常用的有顺序链式索引散...

数据结构总结(58篇)