淮 海 工 学 院 计算机工程学院
课程设计报告
设计名称: 面向对象课程设计
选题名称: 疯狂贪吃蛇
姓 名: ^ ^ 学 号: ^ ^
专业班级: 软件工程 ^ ^
系 (院): 计算机工程学院
设计时间: 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.课程设计成果 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
所有程序文件一览表
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
5.课程设计心得 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
这次的游戏,看着挺简单,但是真正去做就会出现很多问题。游戏最难得还是在一些算法上,例如如何画出一条蛇,那蛇肯定是由一系列结点组成,将这一些结点画出就简化了问题,这些结点如何组成一条蛇,那这个结点得有它的下一个结点,就像链表一样连着,这样才能组成一条蛇,蛇会动,它有方向,所以每个节点都有一个方向。结点出现也利用了系统自带的随机数类能够产生随机整数,再将其画出在此位置。蛇死亡的话有两种情况,第一种是撞到边界,这个判断比较简单,还有就是撞到自身,这个稍微复杂一点,思路就是头部的位置是否与自身身体的其他任意一节重合,这样就算死亡,用循环,来判断是否位置相同。游戏里面用到了线程,用线程的休眠时间可以来控制蛇运动的速度,还可以同时播放声音,同时做几件事。遇到的最大的问题就是当切换面板的时候键盘没有反映,后来在老师的帮助下终于解决了这个问题。主要是原来的面板上有三个按钮,所有就监听按钮事件了,当切换到另一个面板时候所以还在监听按钮而没有监听键盘事件,可能系统默认的是监听按钮事件,总之不是非常懂,看来,只是学无止境,人学的越多遇到的困难就越大,所以遇到的挫折也就会越大,我相信只要我们坚持下去,坚持不断探索新知识,我们会不断进步的。 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论