淮 海 工 学 院 计算机工程学院
课程设计报告
设计名称:          面向对象课程设计           
选题名称:            疯狂贪吃蛇               
姓    名: ^  ^      号: ^  ^ 
专业班级:        软件工程    ^  ^       
院):        计算机工程学院         
设计时间:        2010.6.21~2010.7.2           
设计地点:        软件实验室、教室             
成绩:
指导教师评语:
                签名:             
                                年    月    日
1.课程设计目的
《面向对象程序设计》是一门实践性很强的计算机专业基础课程,课程设计是学习完该课程后进行的一次较全面的综合练习。其目的在于通过实践加深学生对面向对象程序设计的理论、方法和基础知识的理解,掌握使用Java语言进行面向对象设计的基本方法,提高运用面向对象知识分析实际问题、解决实际问题的能力。
2.课程设计任务与要求:
基本任务是使得学生通过课程设计掌握利用java进行底层的网络应用程序设计、多媒体应用设计、JDBC编程的基本方法,学会综合利用awt包和Swing组件包进行图形用户界面的设计,同时,对java的事件委托模型、异常处理机制、包和接口的概念及多线程技术有比较熟练的把握。
本课程设计的选题:贪吃蛇游戏
要求:课程设计可选用Ecli0pse、JBuilder、NetBeans等作为开发平台以提高开发效率,通过资料查阅和学习尽可能熟练掌握其中一种集成开发环境。
认真完成需求分析,建议采用UML建模技术进行系统的分析设计,在画出系统用例图和类图,并将UML图复制到设计报告中。认真按时完成课程设计报告,课程设计报告内容包括:课程设计目的、设计任务与要求、设计说明书、设计成果和设计心得五个部分,具体要求见设计报告模板。
通过这次设计,要求掌握以下内容:
1)面向对象技术中的继承与多态(重载和覆盖)机制、各种修饰符的使用
2)类、包、接口的定义与使用
3)常用工具类与算法的实现(数组、向量、字符串、链表)
4)java.awt、javax.swing中常用标准GUI组件及相应的事件处理
5)Java的异常处理机制
6)Java的数据库连接技术
7)Java的多线程技术与动画制作
8)Java的网络编程
3.课程设计说明书
1、需求分析(用例图)
  课题:贪吃蛇游戏
  功能分析:开始游戏、暂停游戏、结束游戏、重新开始、设置游戏难度、音乐设置、高分察看、游戏帮助
开始游戏:可以开始玩游戏,如果分数达到一定程度系统自动询问是否保存记录。
暂停游戏:在游戏中途可以暂停游戏
重新开始:感觉玩得不好可以重新开始玩,分数清零
停止游戏:结束游戏
难度设置:游戏玩家可以根据自身情况进行设置,难度分为简单、中等、难三个程度。
音乐设置:有开和关两个两个选项。
高分记录:系统从数据库中提取出前五名玩家,显示玩家的昵称和最高分。
帮助:里面有关于游戏如何玩得一些提示以及系统操作提示。
关于:显示一些系统版本、作者等基本信息。
用例图
2、概要设计(类图)
3、详细设计(类的设计,数据库)
根据UML图,写出Java程序的代码举例:
实体类
public class Player {
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getScore() {
        return score;
    }
    public void setScore(int score) {
        this.score = score;
    }
    public Player(String name, int score) {
        this.name = name;
        this.score = score;
    }
    public String name;
    public int score;
}
Snake代码
public class Snake {
    private Node head = null;
    private Node tail = null;
    private int size = 0;
    private Node n = new Node(20, 30, Dir.L);
    private Table y;
    public Snake(Table y) {
        head = n;
        tail = n;
        size = 1;
        this.y = y;
    }
    public void addToTail() {……}
    public void addToHead() {……}
    public void draw(Graphics g) {……}
    private void move() {
        addToHead();
        deleteFromTail();
        checkDead();
    }
    private void checkDead() {……}
    private void deleteFromTail() {……}
    private class Node {
        int w = Table.BLOCK_SIZE;
        int h = Table.BLOCK_SIZE;
        int row , col;
        Dir dir = Dir.L;
        Node next = null;
        Node prev = null;
}
        Node(int row, int col, Dir dir) {……}
    void draw(Graphics g) {……}
    public void eatFood(Food food) {    ……}
    private Rectangle getRect() {……}
}
public class Food {
    int row, col;
    int w = Table.BLOCK_SIZE;
    int h = Table.BLOCK_SIZE;
    private static Random r = new Random();
    private Color color = Color.YELLOW;
    public Food(int row, int col) {
        w = row;
        l = col;
    }
    public Food() {
        nm}
    public void setRow(int row) {……}
}
4.编程实现
核心代码摘录
(1)游戏界面绘制的线的算法包括贪吃蛇死亡时的一系列操作
public void paint(Graphics g) {
        Color c = g.getColor();
        g.setColor(Color.GRAY);
        g.fillRect(0, 0, COLS * BLOCK_SIZE, ROWS * BLOCK_SIZE);
        g.setColor(Color.DARK_GRAY);
        //画出横线
        for (int i = 1; i < ROWS; i++) {
            g.drawLine(0, BLOCK_SIZE * i, COLS * BLOCK_SIZE, BLOCK_SIZE * i);
        }
        for (int i = 1; i < COLS; i++) {
            g.drawLine(BLOCK_SIZE * i, 0, BLOCK_SIZE * i, BLOCK_SIZE * ROWS);
        }
        g.setColor(Color.YELLOW);
        g.setFont(fontScore);
        g.drawString("score:" + score, 10, 60);
        g.setColor(Color.RED);
        g.drawString("Life: " + getLife(), 590, 55);
        if (gameOver) {
            if (getLife() == 0) {
                g.setFont(fontGameOver);
                g.drawString("游戏结束", 250, 270);
                if (getScore() > 10) {//分数达到预定的标准就可以进入高分榜
                    scoretmp = getScore();
                    java.awt.EventQueue.invokeLater(new Runnable() {
                        public void run() {
                            new InputNameGUI(scoretmp).setVisible(true);
                        }
                    });
                    setScore(0);
                }
                paintThread.gameOver();
            } else {
                Start();
            }
        }
        g.setColor(c);
        s.eatFood(food);
        food.draw(g);
        s.draw(g);
}
(2)蛇吃食物的算法
public void eatFood(Food food) {
        Rect().Rect())) {
            Appear();
            this.addToHead();
                        Music())
                      y.eatMusic.play();
                        Difficulty()){//根据难度给分
                            case 150: y.Score() + 5);break;
                            case 100:y.Score() + 10);break;
                            case 50:y.Score() + 15);break;
                        }
           
        }
    }
(3)蛇将节点添加到头部
public void addToHead() {
        Node node = null;
        switch(head.dir) {
        case L :
            node = new w, l - 1, head.dir);
            break;
        case U :
            node = new w - 1, l, head.dir);
            break;
        case R :
            node = new w, l + 1, head.dir);
            break;
        case D :
            node = new w + 1, l, head.dir);
            break;
        }
        = head;
        head.prev = node;
        head = node;
        size ++;
    }
(4)蛇是否死亡
private void checkDead() {
        w < 0 || l < 0 || w > Table.ROWS || l > Table.COLS)  {
            y.stop();
                      y.life--;
        }
        for(Node n = ; n != null; n = n.next) {
            w == n.row && l == n.col) {
                y.stop();
                              y.life--;
            }
        }
    }
(5)监听键盘事件的代码
public void keyPressed(KeyEvent e) {
        int key = e.getKeyCode();
        switch(key) {
        case KeyEvent.VK_LEFT :
            if(head.dir != Dir.R)
                head.dir = Dir.L;
            break;
        case KeyEvent.VK_UP :
            if(head.dir != Dir.D)
                head.dir = Dir.U;
            break;
    case KeyEvent.VK_RIGHT :
            if(head.dir != Dir.L)
                head.dir = Dir.R;
            break;
        case KeyEvent.VK_DOWN :
            if(head.dir != Dir.U)
                head.dir = Dir.D;
            break;
        }
    }
(6)食物的随机产生
public Food() {
        Int(Table.ROWS-2) + 2, r.nextInt(Table.COLS));
    }
public Food(int row, int col) {
        w = row;
        l = col;
    }
(7)画出闪烁的食物
public void draw(Graphics g) {
        Color c = g.getColor();
        g.setColor(color);
        g.fillOval(Table.BLOCK_SIZE * col, Table.BLOCK_SIZE * row, w, h);
        g.setColor(c);
        if(color == Color.RED) color = Color.YELLOW;
        else color = Color.RED;
    }
其它代买请见游戏源程序
5、调试分析
程序运行主界面
游戏帮助界面
关于界面
英雄榜
游戏界面
高分玩家输入昵称
6、用户使用说明
进入系统后会出现游戏初始界面,上面显示了Greedy Snake的图片,最上面有菜单栏,第一项为游戏,开始可以进入游戏,暂停可以暂停游戏,结束可以结束游戏,重玩可以重新开始,此时游戏玩家分数置零,Life变成初始的3。高分榜可以查看系统中的高分玩家,显示玩家的名次昵称以及分数。最后一项可以退出游戏。第二栏为设置,分别有难度设置河音乐设置,难度设置有三个等级,非别为简单、中等、困难;音乐设置有开和关,此音乐为贪吃蛇吃食物的响声。最后一栏为帮助,有系统帮助和关于。系统帮助为游戏的帮助提示,关于为系统的基本信息。进入游戏后,蛇初始只有一节身体,食物随机出现,会一闪一闪,当蛇吃到食物时会发出声音,吃完后蛇会长长一节,难度越大的蛇的移动速度越快,按空白键可以暂停游戏,吃到食物分数会相应的增加,难度越大的分数上涨越快,当分数达到设定值时,系统会弹出对话框,提示用户输入相应的昵称,将用户的分数和昵称输入到数据库中。
7、附录或参考资料
Java2使用教程 清华大学出版社
J2SE帮助文档
4.课程设计成果
 
所有程序文件一览表
序号
文件名称
作用
与其它文件的关系
1
MainGUI.java
主界面
调用2、3、4、5等类
2
AboutGUI.java
字符串转数组工具类的方法关于界面
调用相应的一些图片
3
HighScoreGUI.java
英雄榜
调用11、12
4
InputNameGUI.java
输入框
调用SQLAccess写入12
5
HelpGUI.java
帮助界面
6
Table.java
游戏界面类
调用7、9等类
7
Snake.java
蛇实体类
调用Food类
9
Food.java
食物实体类
调用Dir枚举类
10
Dir.java
方向累
11
SQLAccess.java
数据库操作类
将数据写入数据库
12
Player.mdb
玩家实体类
记录数据
13
绿.jpg等
界面背景图片
5.课程设计心得
这次的游戏,看着挺简单,但是真正去做就会出现很多问题。游戏最难得还是在一些算法上,例如如何画出一条蛇,那蛇肯定是由一系列结点组成,将这一些结点画出就简化了问题,这些结点如何组成一条蛇,那这个结点得有它的下一个结点,就像链表一样连着,这样才能组成一条蛇,蛇会动,它有方向,所以每个节点都有一个方向。结点出现也利用了系统自带的随机数类能够产生随机整数,再将其画出在此位置。蛇死亡的话有两种情况,第一种是撞到边界,这个判断比较简单,还有就是撞到自身,这个稍微复杂一点,思路就是头部的位置是否与自身身体的其他任意一节重合,这样就算死亡,用循环,来判断是否位置相同。游戏里面用到了线程,用线程的休眠时间可以来控制蛇运动的速度,还可以同时播放声音,同时做几件事。遇到的最大的问题就是当切换面板的时候键盘没有反映,后来在老师的帮助下终于解决了这个问题。主要是原来的面板上有三个按钮,所有就监听按钮事件了,当切换到另一个面板时候所以还在监听按钮而没有监听键盘事件,可能系统默认的是监听按钮事件,总之不是非常懂,看来,只是学无止境,人学的越多遇到的困难就越大,所以遇到的挫折也就会越大,我相信只要我们坚持下去,坚持不断探索新知识,我们会不断进步的。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。