电子科技大学成都学院云计算系
实践专周设计报告
课 程 名 称: JAVA实践专周
设 计 题 目: 贪吃蛇设计
指导 教师 组: 黄曼绮 陈虹君
学生姓名学号:_ 屈太源 1341310131
关林燕 1341310113
云计算系制
20##年12月
目 录
第1章 贪吃蛇游戏项目概述......................................................................................... 1
1.1 设计思路.................................................................................................................... 1
1.2 程序概述.................................................................................................................... 1
1.3 程序流程图................................................................................................................ 2
第2章 总体设计............................................................................................................. 3
2.1 程序设计模块的划分................................................................................................ 3
2.2 类说明........................................................................................................................ 4
第3章 游戏说明............................................................................................................. 6
3.1 游戏说明.................................................................................................................... 6
3.2 单及菜单单项说明.................................................................................................... 6
3.3 工具键说明................................................................................................................ 7
第4章 运行效果及核心代码......................................................................................... 8
4.1 游戏运行效果截图.................................................................................................... 8
4.2 核心代码.................................................................................................................... 9
第5章 总结................................................................................................................... 18
参考文献......................................................................................................................... 19
致谢................................................................................................................................. 20
第1章 贪吃蛇游戏项目概述
1.1 设计思路
贪吃蛇游戏设计与实现,主要分为以下二个模块:游戏主界面模块和游戏控制模块。在此只实现游戏的游戏主界面模块、游戏控制模块。并且只是实现移动速度、暂停、重新开始等功能。
游戏主界面模块:
游戏的主界面是进入游戏后,能够给玩家第一感官的部分,主要包括游戏图形区域界面、游戏的速度选择更新界面、新生方块的预览、暂停游戏按钮、重新开始游戏按钮。从很大程度上决定了玩家对游戏的兴趣问题,因此,游戏的主界面应该力求美观,爽心悦目。
游戏控制模块:
这个模块是游戏的中心环节,主要完成控制游戏的开始、暂停、重新开始等功能。为了能够给玩家一个很好的游戏环境,这部分应该做到易懂、易操作。
本设计所开发的是基于Java的一个贪吃蛇游戏软件,主要实现游戏的速度控制、游戏的暂停、游戏的退出等功能,分为: 游戏主界面模块、游戏控制模块以二个模块。
1.2 程序概述
本程序是一个利用Java应用软件制作的贪食蛇小游戏。在游戏过程中,用户通过点击小键盘区的方向键来控制蛇的运行方向;游戏运行过程中,如果想暂停,只需要按F3键即可。重新开始游戏的按键为F2。当蛇没有吃到食物且碰到墙壁或自己的身体时游戏结束。
本程序的另一个功能是在程序运行窗口的左上角显示,用户在游戏过程中的移动和长度。
1.3 程序流程图
否
是
图1-1 程序流程图
第2章 总体设计
2.1 程序设计模块的划分
根据游戏需求中游戏所要实现的功能,整个游戏分为二个模块进行具体的设计如图2-1所示。
游戏控制模块的主要框架如图2-2所示。
游戏暂停控制:点击“F3”按钮,游戏暂停;再单击,游戏继续。
游戏重新开始控制:点击“F2”键后,点击确定,即游戏重新开始。
游戏退出控制:点击“F4”键好,点击确定,退出游戏界面。
2.2 类说明
此工程共有9个类,2个文件。这9个类的作用如下:
Direction类:表示方向的类,其中定义了方向的属性。
Foot类:表示食物的类,定义了随机产生食物坐标、画食物等行为。
Game类:其中只有一个方法,即程序入口。
GameFrame类:表示游戏界面的类,定义了游戏界面的设计和一些行为,如制作菜单、判定游戏结束、记录分数等。
GameThread类:表示游戏线程类,定义了继续游戏、暂停游戏、设置速度档等行为。
KeyMonittor类:表示键盘按键的适配器类,定义了处理按键事件的行为。
Map类:表示地图的类,定义了根据地图模式画出地图的行为。
Node类:表示蛇中的一个节点,定义构造节点,画节点等行为。
Snake类:表示蛇的类,定义了初始化蛇,蛇移动、加尾、去尾、加头、吃食物、判断蛇死、画蛇等行为。
Help.txt:游戏说明文件。
Record.txt:记录分数信息的文件。
第3章 游戏说明
3.1 游戏说明
一、游戏规则说明
1) 运行程序出现游戏界面,蛇头自动向右移动。
2) 食物随机产生,但不能再障碍物中生成。
3) 蛇吃到食物,则蛇的身体变长一节。
4) 蛇每吃一个食物加3分。
5) 默认每三十分提升一个档次。
6) 蛇吃到自己的身体游戏结束。
7) 蛇不能穿越自己的身体运行。
8) 默认每个速度都走完后更换地图并速度恢复默认值,积分归零。
3.2 单及菜单单项说明
1. “游戏”菜单。
1) 开始/重新开始
2) 暂停/继续
3) 保存分数
4) 查看分数记录
5) 退出
2. “设置模式”菜单速度选择。
6) 地图切换
7) 蛇身模式切换
8) 游戏模式切换
3. “帮助”菜单
游戏说明
3.3 工具键说明
1) 按键盘的“上”、“下”、“左”、“右”键控制蛇头的移动方向。
2) 按“F1”键重新开始。
3) 按“空格”键暂停/继续。
4) 按数字键设计蛇的移动速度,逐渐加快。
5) 按“F2”键更换地图。
6) 按“F3”键切换普通蛇/彩蛇,默认普通蛇身。
7) 按“F4”键更换游戏模式,蛇撞墙死还是从另一端出现,默认撞墙不死。
第4章 运行效果及核心代码
4.1 游戏运行效果截图
图4-1 地图模式2运行效果
图4-2 无障碍模式运行效果
图4-3 游戏结束画面
4.2 核心代码
//Direction.java
public class Direction{
/**
* 定义四个静态的最终变量,表示方向,常量值可以任意
*LEFT:方向为左
*RIGHT:方向为右
*UPPER:方向为上
*DOWN:方向为下
public static final int LEFT=-1;
public static final int RIGHT=1;
public static final int UPPER=-2;
public static final int DOWN=2;
//Node. Java
import java.awt.Color;
import java.awt.Graphics;
import java.util.Random;
class Node{
/**
*m:节点的横格坐标
*n:节点的竖格坐标
*direction:节点的移动方向
*next:下一个节点
*pre:前一个节点
*/
int m;//横格
int n;//竖格
int direction=Derection .LEFT;
Node next=null;
Node pre=null;
/*构造方法*/
public Node (int m, int n,int direction){
this.m=m;
this.n=n;
this.direction=direction;
/*绘制节点。根据蛇身的模式选择绘制普通蛇的节点或彩蛇的节点 */
void draw (graphics g){
Random r= new Random();//得到随机数对象
Color c =g.getColor();//得到画笔原来的颜色
*若为彩蛇,则蛇身为橙色
*若为普通蛇身,则蛇身颜色随机产生
if (GameFrame.SNAKESTYLE==2)
g.setColor(Color.ORANGE);
else
g.setColor(new Color(r.nextInt(256),r.nextInt(256),r.nextInt(256)));
/*将格子坐标换算成像素坐标画矩形
*节点矩形比一个格子的宽,高小2像素
*视觉效果是蛇身中有间隙
*/
g.fillRect(GameFrame.CELL_SIZE*m,GameFrame.CELL_SIZE*n,
GameFrame.CELL_SIZE-2,GameFrame.CELL_SIZE-2);
g.setColor(c);//恢复原来的画笔颜色
}
}
//Snake.java
import java,awt.Color;
import java,awt.Graphics;
import java,awt.event.KeyEvent;
public class Snake{
/**
*head:蛇头节点
*tail:蛇尾节点
*size:蛇身的长度
*gameFrame:游戏框架对象
*n:蛇的第一个节点
*life:默认蛇有生命
Node head =null;
Node tail=null;
int size=0;
GameFrame gameFrame;
boolean life=true;
Node n = new Node(1,15,Direction.RIGHT);
/*构造方法,蛇的初始节点共4个*/
public Snake(GameFrame gameFrame){
head=n;
tail=n;
size=1;
this.gameFrame=gameFrame;
for(int i=0;i<3;i++)
this.addHead();
/*增加尾节点*/
public void addTail(){
Node node=null;
switch(tail.direction){
case Direction.LEFT;
node=new Node(tail.m+1,tail.n,tail.direction);
break;
case Direction.UPPER;
node=new Node(tail.m,tail.n+1,tail.direction);
break;
case Direction.RIGHT;
node=new Node(tail.m-1,tail.n,tail.direction);
break;
case Direction.DOWN;
node=new Node(tail.m,tail.n+1,tail.direction);
break;
tail.next=node;
node.pre=tail;
tail=node;
size++;
/*删除尾节点*/
public void delTail(){
if(size==0)
return;
tail=tail.pre;
tail.next=null;
}
/*增加头节点*/
public void addHead(){
Node node=null;
switch(head.direction){
case Direction.LEFT;
node=new Node(head.m-1,head. n,head. direction);
break;
case Direction.UPPER;
node=new Node(head.m,head. n-1,head. direction);
break;
case Direction.RIGHT;
node=new Node(head.m+1,head. n,head. direction);
break;
case Direction.DOWN;
node=new Node(head.m,head. n+1,head. direction);
break;
}
node. next=head;
head. pre=node;
head= node;
size++;
}public void actionPerformed(ActionEvent e){}
/*构造方法,初始化游戏界面,为框架注册按键监听器,游戏开始*/
/*保存分数记录*/
public void saveRecord(){
String name=JOptionPane.showInputDialog(“准备保存!请输入你的姓名”);
//输入框输入姓名
String content=”姓名:”+name+” ”+”成绩: ”+score; //要保存的内容
RandomAccessFile raf;//随机存取文件
String contentToCn=null;//字符编码转换后的内容
/* 若输入框单击“确定”按钮,则保存;否则单击“取消”按钮,则放弃保存 */
if(name!=null){
try{
//为了字符串不显示乱码,需要转换为中文字符编码,如“GBK”
contentToCn=new String(content.getBytes(“GBK”),”ISO8859_1”);
//建随机存取文件对象
raf=new RandomAccessFile(“scr\\record.txt”,”rw” );
//文件指针指向文件尾
raf.seek(raf.length());
//写出内存
raf.writeBytes(contentToCn+”\r\n”);
//关闭资源
raf.close();
//显示保存成功
JOptionPane.showMessageDialog(null,”分数记录保存成功”);
}catch(FileNotFoundException e){
System.out.println(“记录文件找不到!”);
}catch(IOException e){
System.out.println(“写数据出错!”);
}
}else JOptionPane.showMessageDialog(null,”你已经取消保存”);
}
private int score=0;//成绩,初值为0
/*打开文本文件,查看其内容*/
public void openTxt(MenuItem item){
String title=null;
String filePath=null;
if(item==desprition){//若菜单项为“游戏说明”
title=” 帮助文件 ”;
filePath=” src\\help.txt”;
else if(item==viewRcord){//
title=” 成绩记录文件 ”;
filePath=”src\\record.txt ”;
JFrame note=new JFrame(title);//新建框架
note.setSize(400,600).;//设置大小
JTextArea jta=new JTextArea();//新建文本区域
note.add(jta);//构建外观
note.setVisible(true);//设置可见性
try{
FileReader in =newFileReader(filePath);//文件字符输入流
String s=””;
int b;
while(b=in.read())!=-1{//循环读入
s=s+((char)b);
jta.append(s);//向文本区域中追加内存
}catch(FileNotFoundException e){
System.out.println(“帮助文件找不到!”);
}catch(IOException e){
System.out.println(“读取数据出错!”);
GameThread th=new GameThread(this);//th:游戏线程对象
public class Game{
public static void main(String[]args){
new GameFrame();
}
class GameThread extends Thread{
private Boolean pause=false;//暂停标志为假
private int speed=120;//默认速度3档,即每步间隔120ms
GameFrame gameFrame;
//构造方法
public GameThread(GameFrame gameFrame) {
this.gameFrame= gameFrame;
}
第5章 总结
通过这次课程设计,我对这学期所学的JAVA语言程序设计有一个更深刻的了解,将所学的知识应用于实践,由于所学知识有限,为了使游戏能够实现自己预先的构想,我通过上网和去图书馆找程序,比较好的流程图及功能模块,不断阅读修改代码使程序达到预期所要实现的目标,完成课程设计后,可以感觉到自己对Java程序的又有了新的认识。总之,通过本次的课程设计,使我平时学到的理论知识得到了很好地升华,理论与实际得到一次很好的结合,为我今后参加工作打下了坚实的基础,使我受益匪浅。
参考文献
[1]java2实用教程(第四版)清华大学出版社.,2001.101~2012.804
[2]数据库系统概论(第四版)高等教育出版社2006.504~2013.522
[3]王保罗.Java面向对象程序设计[M]. 北京:清华大学出版社,20##年
[4]高林,周海燕.Jsp网上书店系统与案例分析[M]. 北京:人民邮电出版社,20##年
[5]刘腾红,孙细明.信息系统分析与设计[M]. 北京:科学出版社,20##年
致谢
我要首先感谢我们的任课老师陈虹君和实践课程辅导我们的黄曼绮老师,经过一周的时间,终于完成了实践专周所布置的任务,在此次实验当中遇到了很多了问题,经过老师的悉心帮助和耐心的指导,还有老师不厌其烦的解答以及同学对我的帮助,才使我完成了这次实验,在此,我向帮助我的老师及同学表示由衷的感谢!
电子科技大学成都学院
2017届实践专周成绩评定表