贪吃蛇---java课程设计
- 格式:doc
- 大小:167.00 KB
- 文档页数:17
武汉理工大学
课 程 设 计
课程名称 JAVA 课程设计_
题 目 贪吃蛇程序设计
专 业 电子商务
班 级 ****
学 号 *******
姓 名 ***
成 绩 __________________
指导教师 __________________
20**年**月 **日
课程设计任务书
设计题目:
设计目的:
1.巩固和加深课堂所学知识;
2.学习掌握一般的软件的设计方法和查阅、运用资料的能力;
3.掌握JAVA程序设计语言,面向对象的软件设计思想、方法。
设计任务:(在规定的时间内完成下列任务)
1、任务:设计一个贪吃蛇的游戏
功能要求:能够显示贪吃蛇的运动,能通过键盘控制贪吃蛇的运行,能够处理蛇在运行中个各种情况,以及其它的辅助功能;
要提供主要的设计思路、数据结构的设计。
2、 设计任务要完成设计、编码、测试等过程,给出设计思路、设计说明书、主要的代码的说明、使用说明书。源代码以及可运行的贪吃蛇游戏。
时间安排:
12月28日 布置题目,确定任务、查找相关资料
12月28日~1月7日 功能分析,系统设计,编写程序,调试程序、运行系统;
1月8日 答辩后撰写设计报告。
具体要求:设计报告撰写格式要求(按提供的设计报告统一格式撰写)
具体内容如下:
① 设计任务与要求
② 总体方案与说明
③ 面向对象的设计(主要类的设计)
④ 源程序清单与注释
⑤ 软件主要模块流程图
⑥ 问题分析与解决方案(包括调式记录、调式报告,即在调式过程中遇到的主要问题、解决方法及改进设想);
⑦小结与体会
附录:① 源程序(必须有简单注释) ② 使用说明 ③ 参考资料
指 导 教 师 签 名: 年 月 日
教研室主任(或责任教师)签名: 年 月 日 1.设计任务与要求
1.1设计任务
设计一个贪吃蛇的游戏
功能要求:能够显示贪吃蛇的运动,能通过键盘控制贪吃蛇的运行,能够处理蛇在运行中个各种情况,以及其它的辅助功能;要提供主要的设计思路、数据结构的设计。
设计任务要完成设计、编码、测试等过程,给出设计思路、设计说明书、主要代码的
说明、使用说明书。源代码以及可运行的贪吃蛇游戏。
1.2具体要求:
具体内容如下:
① 设计任务与要求
② 总体方案与说明
③ 面向对象的设计(主要类的设计)
④ 源程序清单与注释
⑤ 软件主要模块流程图
⑥ 问题分析与解决方案(包括调式记录、调式报告,即在调式过程中遇到的主要问题、解决方法及改进设想);
⑦小结与体会
附录:① 源程序(必须有简单注释)
② 使用说明
③ 参考资料
2.总体方案与说明
2.1总体方案
我设计的贪吃蛇主要利用键盘控制蛇的前进移动方向,是否吃到食物,是否撞墙以及是否暂停、开始游戏等。当吃到食物的时候,蛇就自动长大一格,在游戏中可进行暂停和开始操作。中途若是撞到墙或是撞到自己,同样也结束。背景和蛇的颜色可随时更换。
2.2系统模块
根据总体方案,我把贪吃蛇游戏分为:游戏界面设置(即绘图)、贪吃蛇蛇身及运动设置和游戏龙之设置三大模块来设计。
2.2.1游戏界面设置 游戏界面设置包括:游戏区设置、游戏帮助信息设置、游戏分数查看区。
游戏界面使用简单和直观的布局设计,游戏区放置在界面的主题位置上,在游戏区上部放置分数,在游戏区下部放置使用说明帮助,具体设计效果如图2-1所示。
图2-1游戏主题界面设计效果
2.2.2贪吃蛇蛇身及运动设置
贪吃蛇的蛇身设置是整个游戏设计的关键。它的基本思路是:去掉蛇尾,显示并移动出蛇头外蛇身,根据蛇身的运动方向,决定蛇头的位置,完成蛇头吃食物的处理操作,显示蛇头。
而蛇运动的四个方向,则通过按键来控制。蛇吃到一个食物,就加分。每次食物出现的位置不能在蛇身上,如果蛇在运动的过程中撞到自己或者撞墙,则游戏结束,具体效果如图2-2所示,图2-2就是蛇撞到墙之后,提示游戏结束。
图2-2 贪吃蛇撞墙后效果
2.2.3游戏控制设置
游戏控制设置就是控制游戏的暂停与开始。设置PageUp(加速), PageDown(减速)按键来控制速度,设置空格或着p按键来暂停进行中的游戏,设置ENTER或着R或者S按键来开始暂停的游戏。
3.面向对象的设计
贪吃蛇游戏各模块及程序流程有若干类实现,下面阐述各个类的设计与实现。
3.1 GreedSnake类
该类包含六个主要的功能方法,分别是:
(1)构造函数public GreedSnake(),主要用来设置用户控制界面。
(2)public void keyPressed()方法,主要用来对游戏的按键操作进行处理。
(3)void repaint()主要用来绘制游戏界面包括蛇和食物。
(4)private void drawNode()主要用来绘制某一结点。
(5)public void updateScore()方法主要用来改变积分器。
(6)void begin()方法用来控制游戏的开始界面。 3.2.SnakeModel类
该类包含多个功能方法,分别是:
(1)构造函数public SnakeModel(),该方法主要用来初始化游戏界。其中matrix[][]用来存储地图上面的信息,如果什么也没有设置为false,如果有食物或蛇,设置为true;nodeArray,一个LinkedList,用来保存蛇的每 一节;food用来保存食物的位置;而Node类是保存每个位置的信息。
(2)public void changeDirection()方法主要用来改变蛇的运动方向,changeDirection(int newDirection) ,用来改变蛇前进的方向,而且只是 保存头部的前进方向,因为其他的前进方向已经用位置来指明了。其中newDirection必须和原来的direction不是相反方向,所以相反方向的值用了同样的奇偶性。在测试的时候使用了direction%2!=newDirection%2 进行判断。
(3)public boolean moveOn()方法使实现蛇运动的函数,其中moveOn()用来更新蛇的位置,对于当前方向,把头部位置进行相应改变。如果越界,结束;否则,检测是否遇到食物(加头部)或身体(结束);如果什么都没有,加上头部,去掉尾部。由于用了LinkedList数据结构,省去了相当多的麻烦。
(4)public void run()方法主要用来完成游戏主体运行流程控制功能。
(5)private Node createFood()方法用来生成食物及放置地点。
(6)public void speedUp()和()两个方法对蛇运行的速度进行控制。
(7)public void changePauseState() 方法用来改变游戏的状态,是“暂停”还是“继续”。
3.3.Node类
该类只有一个方法Node(),该方法用来定义蛇的结点部分
4.源程序清单与注释
GreedSnake.java
package GreedSnake;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.util.*;
//Main Class
public class GreedSnake implements KeyListener {
JFrame mainFrame;
Canvas paintCanvas; JLabel labelScore;//计分牌
SnakeModel snakeModel = null;// 蛇
public static final int canvasWidth = 300;
public static final int canvasHeight = 400;
public static final int nodeWidth = 10;
public static final int nodeHeight = 10;
//GreedSnake():初始化游戏界面
public GreedSnake() {
//设置界面元素
mainFrame = new JFrame("GreedSnake");
Container cp = mainFrame.getContentPane();
labelScore = new JLabel("分数:");
cp.add(labelScore, BorderLayout.NORTH);
paintCanvas = new Canvas();
paintCanvas.setSize(canvasWidth + 1, canvasHeight + 1);
paintCanvas.addKeyListener(this);
cp.add(paintCanvas, BorderLayout.CENTER);
JPanel panelButtom = new JPanel();
panelButtom.setLayout(new BorderLayout());
JLabel labelHelp;// 帮助信息
labelHelp = new JLabel("按PageUp(加速), PageDown(减速) 来控制速度",
JLabel.CENTER);
panelButtom.add(labelHelp, BorderLayout.NORTH);
labelHelp = new JLabel("按 ENTER 或者 R 或者 S 开始", JLabel.CENTER);
panelButtom.add(labelHelp, BorderLayout.CENTER);
labelHelp = new JLabel("按 空格 或 p 暂停 ", JLabel.CENTER);
panelButtom.add(labelHelp, BorderLayout.SOUTH);
cp.add(panelButtom, BorderLayout.SOUTH);
mainFrame.addKeyListener(this);