资源描述
计算机科学与技术专业综合课程设计报告
38
2020年4月19日
文档仅供参考,不当之处,请联系改正。
计算机科学与技术专业12级
《综合课程设计》报告
题目: 贪吃蛇小游戏
成员: 姓名 学号
郝兴明 07051
指导教师: 王金龙
开始日期: 年 12月 7 日
完成日期: 年 01月 8 日
级《综合课程设计》评价表
题 目
贪吃蛇小游戏
指导老师
王金龙
项 目 内 容 简 介
本次综合课程设计的内容为“贪吃蛇”小游戏,游戏操作简单,设计却很复杂,主要实现的内容为:经过键盘控制蛇的移动,判断蛇是否死亡,以及经过相应按钮来控制游戏的进程。
评价
工作量 (□饱满、□达到要求、□不饱满);
运行效果 (□良好、□有小问题、□错误较多);
文档及报告撰写 (□规范、□较规范、 □不规范、□未提交);
答辩 (□优秀、□良好、 □一般、 □较差);
团队分工及协作 (□很好、□较好、 □一般、 □较差)。
成绩
学 号
姓 名
组内分工
贡献排名
成 绩
郝兴明
程序设计、编写、测试、报告
答辩小组签字
青岛理工大学课程设计任务书
姓 名 组内分工
郝兴明 程序设计、编写、测试、报告
院 (系): 计算机工程
专 业: 计算机科学与技术
任务起至日期: 12月 7 日 至 01月 8 日
课程设计题目: 贪吃蛇小游戏
主要内容及要求:
“贪吃蛇”小游戏主要应实现以下几个方面的功能:
1. 经过方向键控制蛇的移动
2.蛇吃到食物后身体变长
3.食物的随机产生
4.蛇吃到自己身体或墙后死亡
5.蛇在移动过程中能够暂停/继续
6.可手动停止游戏
工作计划安排:
12月07日--- 12月10日 需求分析
12月11日--- 12月15日 概要设计
12月16日--- 12月20日 框架搭建
12月21日--- 12月30日 详细功能设计
12月31日--- 01月03日 程序测试
01月04日--- 01月05日 书写报告
01月06日 项目答辩
第1部分 概述
1. 内容简介
“贪吃蛇”是一款经典的小游戏,以其操作简单、娱乐性强而广受欢迎。一条蛇在封闭的围墙内移动,在围墙内随机出现一个食物,经过键盘的方向键来控制蛇的移动,当蛇吃到食物后蛇的身体长一节,同时出现一个新的食物等待蛇去吃,如果蛇在移动过程中蛇头吃到自己身体或者吃到围墙的石头,则蛇死亡,游戏结束。
作为一个小游戏,设计中必须要考虑人机交互和用户体验,因此游戏界面应简洁直观,让用户可直接了解游戏的操作。
“贪吃蛇”的设计对java编程的提高和进阶是一次很好的锻炼机会。本次设计使用java语言,经过GUI编程、线程、事件监听等技术来实现游戏的开发,功能虽然较少,但游戏的基本功能都具备,可正常进行游戏。
2. 功能介绍
“贪吃蛇”小游戏的设计较复杂,要想实现所有功能需要很高的技术要求和很强的编程能力。由于本人技术能力欠缺,因此只能实现基本的游戏功能,经过画图的方法来显示出蛇的身体,食物的位置和墙的位置。主要操作是经过键盘的方向键来控制蛇的移动方向,无效方向要忽略;当蛇吃到食物时蛇的身体变长一节,同时产生一个新的食物;蛇吃到自己身体或者吃到石头时死亡,游戏结束;在游戏控制区域可经过相应按钮来控制游戏的运行进度。
3. 设计环境
本次游戏设计的环境及开发工具如下:
运行环境:Windows 7
编程语言:java
开发环境:eclipse
第2部分 需求分析
1. 用户特点分析
游戏开发成功后,可适用于各类人群使用,因此要求界面简单,操作方便, 不需要进行专门培训就能够学会如何操作
2. 功能需求
2.1图形界面的需求
游戏画布区主要包括蛇的身体出现的位置,食物随机出现的位置,墙的固定位置,以及蛇可移动的区域。
游戏控制区域显示按钮及操作提示。
2.2属性需求
在可使用性方面,要求各个功能实现简单,操作方便,系统处理正确;整个系统恢复性能号,链接速度快,以确保系统可适用性好。
另外,还要求系统的可扩展性、可维护性、可移植性良好。
2.3功能模块需求
软件开发过程中的功能模块设计,主要解决实现该游戏需求的程序模块设计问题。包括如何把该游戏划分成若干个模块、决定各个模块之间的接口、模块之间穿的的信息,以及模块结构的设计等。
2.3.1游戏功能
本游戏主要完成以下几方面的功能:
1) 游戏控制功能
2) 界面布局
3) 其它辅助功能
2.3.2功能模块划分
根据游戏需求,整个游戏主要划分为游戏界面和游戏控制两个模块。见图2.1 。游戏界面是整个游戏的运行区域,可动态的观察游戏过程。游戏控制是用来控制游戏进程的,能够开始游戏,暂停/继续游戏,停止游戏。
贪吃蛇游戏
游戏界面模块
游戏控制模块
图2.1 游戏模块划分
第3部分 系统设计
1. 系统流程图
系统流程图是描绘系统物理模型的传统工具。它的基本思想是用图形符号描绘系统里面的每个部件,表示信息在各个部件之间流动的情况。
开始游戏
控制蛇移动
身体变长
是否吃到自己
是 是
是否吃到食物
否
否
是否撞墙
否 游戏结束
蛇死亡
是
图3.1 系统流程图
2.类模块设计
本次设计遵循MVC设计模式,主要类之间的关系如下:
Snake类
(蛇类)
Game类
(主面板)
Controller类(控制器)
Ground类
(墙类)
Food类
(食物类)
图3.2 MVC设计模式体现
Snake类:设置蛇的属性,以及蛇的产生、移动、吃食物、死亡等方法。
Food类:设置食物的随机产生和是否被吃掉等方法。
Controller类:监听Snake类以及按键事件,并进行处理。
Game类:用来控制游戏进程和界面的显示。
3.各类的详细设计
表3.1 Snake类
成员
作用
private boolean pause;
判断是否暂停
private boolean life;
判断蛇是否死亡
private boolean isMoving;
判断蛇是否在移动
private LinkedList<Point>body;
存放蛇的身体节点
private void init();
初始化方法
public void move();
蛇的移动方法
public void drawMe(Graphics g);
画出蛇的身体
public void start();
让蛇开始移动
public void die();
让蛇死亡
表3.2 Food类:
Public void newFood(Point p);
设置食物产生的位置
Public Boolean isSnakeEatFood(Snake snake);
判断蛇是否吃到食物
public void drawMe(Graphics g);
在画布上画出食物
表3.3 Ground类:
Private int[][] rocks;
存放石头的数组
Public Ground();
初始化石头
Public Boolean isSnakeEatRock(Snake snake);
判断是否吃到石头
Public Point getPoint();
设置食物产生的位置
public void drawMe(Graphics g);
在画布上画出石头
表3.4 Controller类:
Public Controller(Snake snake,Food food,Ground ground,GamePanel gamePanel);
初始化控制器类
Public void keyPressed(KeyEvent e);
监听按键事件
Public void snakeMoved(Snake snake);
监听蛇的移动
Public void newGame();
创立新游戏
Public void setSnake(Snake snake);
设置蛇
第4部分 系统实现
1. 界面展示
“贪吃蛇”小游戏适合广大群体,故界面应以简洁直观为主,让
玩家一眼便可了解游戏的操作。具体游戏界面如下:
游戏初始化界面
图 4.1 游戏初始化界面
游戏开始界面
图 4.2 游戏开始运行界面
游戏结束界面
图 4.3 游戏结束界面
2.游戏的具体实现代码
2.1游戏画布区
public void display(Snake snake,Food food,Ground ground){
System.out.println("GamePanel's display");
this.snake = snake;
this.food = food;
this.ground = ground;
this.repaint();
}
protected void paintComponent(Graphics g){
g.setColor(new Color(0xcfcfcf));
g.fillRect(0, 0, Global.WIDTH * Global.CELL_SIZE, Global.HEIGHT * Global.CELL_SIZE);
if(ground != null && snake != null && food != null){
this.ground.drawMe(g);
this.snake.drawMe(g);
this.food.drawMe(g);
}
}
2.2控制区
private static final long serialVersionUID = 1L;
private final JButton button_start = new JButton("开始游戏");
private final JButton button_wait = new JButton("暂停游戏");
private final JButton button_stop = new JButton("停止游戏");
private final JLabel label_tips = new JLabel("方向键控制蛇的移动");
public GameOptionPanel(){
super();
setLayout(null);
setFocusable(false);
setVisible(true);
button_start.setFont(new Font("楷体", Font.PLAIN, 17));
button_wait.setFont(new Font("楷体", Font.PLAIN, 17));
button_stop.setFont(new Font("楷体", Font.PLAIN, 17));
label_tips.setFont(new Font("楷体", Font.PLAIN, 25));
button_start.setFocusable(false);
button_wait.setFocusable(false);
button_stop.setFocusable(false);
label_tips.setFocusable(false);
button_start.setBounds(10, 10, 110, 40);
button_wait.setBounds(145, 10, 110, 40);
button_stop.setBounds(280, 10, 110, 40);
label_tips.setBounds(70, 70, 300, 40);
add(button_start);
add(button_wait);
add(button_stop);
add(label_tips);
}
public JButton getStartButton(){
return button_start;
}
public JButton getWaitButton(){
return button_wait;
}
public JButton getStopButton(){
return button_stop;
}
public JLabel getTipsLabel(){
return label_tips;
}
2.3蛇的移动
public void move(){
if(!(oldDirection + newDirection == 0)){
oldDirection = newDirection;
}
System.out.println("Snake's move");
oldTail = body.removeLast();
int x = body.getFirst().x;
int y = body.getFirst().y;
switch(oldDirection){
case UP:
y--;
if(y < 0){
y = Global.HEIGHT -1;
}
break;
case DOWN:
y++;
if(y == Global.HEIGHT){
y = 0;
}
break;
case LEFT:
x--;
if(x < 0){
x = Global.WIDTH - 1;
}
break;
case RIGHT:
x++;
if(x == Global.WIDTH){
x = 0;
}
break;
}
Point newHead = new Point(x,y);
body.addFirst(newHead);
}
2.4监听按键
public void keyPressed(KeyEvent e){
if(!snake.isPause()&&snake.isLive()&&snake.isMoving()){
switch(e.getKeyCode()){
case KeyEvent.VK_UP:
snake.changeDirection(Snake.UP);
break;
case KeyEvent.VK_DOWN:
snake.changeDirection(Snake.DOWN);
break;
case KeyEvent.VK_LEFT:
snake.changeDirection(Snake.LEFT);
break;
case KeyEvent.VK_RIGHT:
snake.changeDirection(Snake.RIGHT);
break;
}
}
}
2.5画出蛇的身体
public void drawMe(Graphics g){
g.setColor(Color.BLUE);
for(Point p:body){
g.fill3DRect(p.x * Global.CELL_SIZE, p.y * Global.CELL_SIZE, Global.CELL_SIZE, Global.CELL_SIZE, true);
}
}
2.6随机产生食物
public Point getPoint(){
Random radom = new Random();
int x = 0, y = 0;
do{
x = radom.nextInt(Global.WIDTH);
y = radom.nextInt(Global.HEIGHT);
}while(rocks[x][y]==1);
return (new Point(x,y));
}
2.7初始化墙
public Ground(){
for(int x=0;x<Global.WIDTH;x++){
rocks[x][0] = 1;
rocks[x][Global.WIDTH-1] = 1;
}
for(int y=0;y<Global.HEIGHT;y++){
rocks[0][y] = 1;
rocks[Global.HEIGHT-1][y] = 1;
}
}
第5部分 系统测试
5.1测试概述
进行软件测试是对系统的性能、完善程度以及安全性进行测试,在现今这个科技发达的时代,软件应用于各个领域,如果一个软件未经过细致的系统测试就投入使用,在使用过程中一旦出现问题后果将不堪设想,这不但仅是对用户负责,更是对开发人员自身负责,经过系统测试不断地发现问题和解决问题,在以后的工作中就会减小这些漏洞出现的几率,不断地完善每一个软件是每一个软件开发人员共同的愿望。因此,进行系统测试是十分必要的。
在进行本次游戏设计的过程中,对于软件的测试一直贯穿始终,对于在开发过程中的代码和文档,以及系统完成后都在进行测试。测试并不但仅是为了找出错误,经过分析错误产生的原因和错误的发生趋势,能够帮助项目管理者发现当前软件开发过程中的缺陷,以便及时改进。
测试主要分5种,即单元测试、集成测试、确认测试和白盒测试和黑盒测试。 本次游戏测试主要采用黑盒测试方法,检查游戏功能是否能实现。
5.2 详细测试
5.2.1测试一
测试内容:是否能正常开始游戏
测试方法:点击开始按钮
预期结果:游戏区出现蛇、食物和墙,蛇会移动
测试结果:和预期一样,祥见图5.1
图 5.1 开始按钮测试
5.2.2测试二
测试内容:是否能暂停/继续游戏
测试方法:点击暂停/继续按钮
预期结果:点击暂停后蛇停止移动,按钮变为继续游戏,点击继续后沿原方向移动,按钮变为暂停游戏。
测试结果:和预期一样,祥见图5.2和图5.3
图5.2 暂停游戏测试
图5.3 继续游戏测试
5.2.3测试三
测试内容:蛇是否能吃食物身体变长
测试方法:控制蛇移动去吃食物
预期结果:吃食物后蛇身体变长一节,同时产生一个新的食物
测试结果:和预期一样,祥见图5.4
图5.4 蛇吃食物测试(蛇身体默认为3节)
5.2.4测试四
测试内容:蛇撞墙是否会死
测试方法:控制蛇移动去撞墙
预期结果:蛇死亡不再移动,游戏结束
测试结果:和预期一样,祥见图5.5
图5.5 蛇撞墙死亡测试
5.2.5测试五
测试内容:蛇吃到自己身体是否会死
测试方法:控制蛇移动让蛇头吃到自己身体
预期结果:蛇死亡不再移动,游戏结束
测试结果:和预期一样,祥见图5.6
图5.6 蛇吃到自己身体测试
第6部分 系统总结
本次课程设计从游戏界面和游戏控制两方面实现了比较完善的功能,因为本人能力有限,还需要学习的地方很多,因此还是不尽完美,有很多能够优化的地方,但游戏的基本功能都很齐全,相比之前做的管理系统类的设计,应该能够说是又上升了一个层次。
虽然在设计中遇到了很多困难,比如说为了修改一个小小的bug而花费一整天,重新去学习新的知识,改了一次又一次等等,可是终于功夫不负有心人,游戏的功能都基本上实现了,作为一个学习计算机的人,特别是一个即将毕业的大四学生,更需要有坚持不懈的毅力和不断学习新知识的激情,困难只是我们走向成功的阶梯。当你克服一个一个的困难后,会感到满满的成就感。
总体来说,这次课设对我自己是一次很好的锻炼机会,不但把以前学到的只是温习了一遍,还学习到了很多新知识,而且还提高了敲代码的能力。对设计中遇到的问题,经过仔细思考和查阅资料,使得问题得以解决,对自己以后独立思考解决问题的能力也有很大帮助。
参考文献
1 李芝兴 杨瑞龙. Java程序设计之网络编程(第2版). 清华大学出版社, .7
2 张海藩 牟永敏. 软件工程导论(第6版). 清华大学出版社, .7
展开阅读全文