《java贪吃蛇课程设计.docx》由会员分享,可在线阅读,更多相关《java贪吃蛇课程设计.docx(11页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、java贪吃蛇课程设计 1设计目的 1.1背景 近年来,Java作为一种新的编程语言,以其简单性、可移植性和平台无关性等优点,得到了广泛地应用,特别是Java与万维网的完美结合,使其成为网络编程和嵌入式编程领域的首选编程语言。JBuilder是Borland公司用于快速开发Java应用的一款优秀的集成开发环境,它以其友好的开发界面、强大的组件支持等优点,得到广大程序员的接受和认可。 “贪吃蛇”游戏是一个经典的游戏,它因操作简单、娱乐性强而广受欢迎。本文基于Java技术和JBuilder开发环境,开发了一个操作简单、界面美观、功能较齐全的“贪吃蛇”游戏。整个游戏程序分为二个功能模块,六个类模块,
2、实现了游戏的开始、暂停、结束。通过本游戏的开发,达到学习Java技术和熟悉软件开发流程的目的。 本文在介绍Java相关技术和国内外发展现状的基础上,对“贪吃蛇”游戏的整个生命周期的各个开发阶段进行了详细地介绍。首先,分析了开发本游戏软件的可行性,重点分析本设计所采用的技术的可行性。其次,从游戏主界面等几方面,分析了本游戏的功能需求;从可使用性和安全性方面分析了属性需求。然后,进行了游戏的概要设计和详细设计,这也是本文的重点。概要设计给出二个功能模块的主框架以及六个类模块的函数调用关系;详细设计介绍了Java2标准运行环境的配置,重点给出各个类模块的程序流程图以及UML图,列表介绍了各个类包含的
3、变量、使用的方法,展示了游戏的界面。为了保证程序代码的正确性和功能实现的可靠性,本文还介绍了游戏软件的程序调试过程和功能测试结果。 1.2目标 本软件是针对贪吃蛇小游戏的JAVA程序,利用方向键来改变蛇的运行方向,空格键暂停或继续游戏,并在随机的地方产生食物,吃到食物就变成新的蛇体,碰到壁或自身则游戏结束,否则正常运行。 2 总体设计 2.1 设计思路 本系统主要是完成贪吃蛇游戏的基本操作。用户可以自己练习和娱乐。本系统需要满足以下几点要求: (1) 利用方向键来改变蛇的运行方向。 (2) 空格键暂停或继续游戏,并在随机的地方产生食物。 (3) 吃到食物就变成新的蛇体,碰到壁或自身则游戏结束,
4、否则正常运行。 2.2 设计说明 本系统共包括1个java源文件和7个类文件。 1.类之间的关系如图 2.1所示。 图2.1类之间的关系2java源文件及其功能如表所示。 表2.2java源文件及其功能 3关键技术 3.1 关键技术及实现 程序关键在于表示蛇的图形及蛇的移动。用一个小矩形快表示蛇的一节身体,身体每长一节,增加一个矩形块,蛇头用俩节表示。移动时必须从蛇头开始,所以蛇不能向相反的方向移动,如果不按任意键,蛇自行在当前方向上前移,但按下有效方向键后,蛇头朝着该方向移动,一步移动一节身体,所以按下有效方向键后,先确定蛇头的位置,而后蛇的身体随蛇头移动,图形的实现是从蛇头新位置开始画出蛇
5、,这时,由于未清屏的原因,原来的蛇的位置和新蛇的位置差一个单位,所以看起来蛇多一节身体,所以将蛇的最后一节用背景色覆盖。食物的出现与消失也是画矩形块和覆盖矩形块。 3.2 设计原理 1.主类SnakeGame 主类为此程序的入口,定义了SnakeFrame的对象frame,开始运行此程序。 2.类SnakeFrame (1)成员变量见表3.1 表3.1主要成员变量 (2)方法见表3.2 表3.2主要方法 3.类Snake (1)成员变量见表3.3 表3.3主要成员变量 (2)方法见表3.4 表3.4主要方法 4.类Node (1)成员变量见表3.5 5.类SnakePanel 此类为画蛇的面板
6、类,是实现红蓝间隔画蛇身算法的类。 6.类StatusRunnable 此类为线程的子类,实现记录状态的功能。 7.类SnakeRunnable 此类为线程的子类,实现蛇运动以及记录分数的功能。 4 程序流程 4.1系统结构图 如图4.1所示 图4.1系统结构图 5主要源代码 1.记录状态的代码 class StatusRunnable implements Runnable public StatusRunnable(Snake snake, JLabel statusLabel, JLabel scoreLabel) this.statusLabel = statusLabel; this
7、.scoreLabel = scoreLabel; this.snake = snake; public void run() String sta = ; String spe = ; while (true) switch (snake.status) case Snake.RUNNING: sta = Running; break; case Snake.PAUSED: sta = Paused; break; case Snake.GAMEOVER: sta = GameOver; break; statusLabel.setText(sta); scoreLabel.setText(
8、 + snake.score); try Thread.sleep(100); catch (Exception e) private JLabel scoreLabel; private JLabel statusLabel; private Snake snake; 2.蛇运动以及记录分数的代码 class SnakeRunnable implements Runnable public SnakeRunnable(Snake snake, Component component) this.snake = snake; ponent = component; public void ru
9、n() while (true) try snake.move(); component.repaint(); Thread.sleep(snake.speed); catch (Exception e) private Snake snake; private Component component; class Snake boolean isRun; ArrayList body; Node food; int derection; int score; int status; int speed; public static final int SLOW = 500; public s
10、tatic final int MID = 300; public static final int FAST = 100; public static final int RUNNING = 1; public static final int PAUSED = 2; public static final int GAMEOVER = 3; public static final int LEFT = 1; public static final int UP = 2; public static final int RIGHT = 3; public static final int D
11、OWN = 4; public Snake() speed = Snake.SLOW; score = 0; isRun = false; status = Snake.PAUSED; derection = Snake.RIGHT; body = new ArrayList(); body.add(new Node(60, 20); body.add(new Node(40, 20); body.add(new Node(20, 20); makeFood(); 3.在随机的地方产生食物的代码 public void makeFood() Node node = new Node(0, 0)
12、; boolean isInBody = true; int x = 0, y = 0; int X = 0, Y = 0; int i = 0; while (isInBody) x = (int) (Math.random() * 15); y = (int) (Math.random() * 20); X = x * Node.W; Y = y * Node.H; for (i = 0; i body.size(); i+) if (X = body.get(i).x & Y = body.get(i).y) break; if (i body.size() isInBody = tru
13、e; else isInBody = false; food = new Node(X, Y); 4.改变运行方向的代码 public void changeDerection(int newDer) if (derection % 2 != newDer % 2) derection = newDer; public void move() if (isEaten() body.add(0, food); score += 10; makeFood(); else if (isCollsion() isRun = false; status = Snake.GAMEOVER; else if (isRun) Node node = body.get(0); int X = node.x; int Y = node.y; switch (derection) case 1: X -= Node.W; break; case 2: Y -= Node.H; break; case 3: X += Node.W; break; case 4: Y += Node.H; break; body.add(0, new Node(X, Y); body.remove(body.size() - 1); 6 运行结果 6.1各功能界面截图