版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、信息科学与工程学院Java项目实训课程设计任务书 题目: 贪吃蛇小游戏的设计与开发 学 号: 姓 名: 专 业: 班 级: 指导教师: 职称: 完成时间: 2016年 5 月-2016年 6 月枣庄学院信息科学与工程学院制2016年6 月课程设计任务、要求及成绩评定课程设计的任务综合运用数据库知识、Java语言程序设计知识,独自完成一个Java项目的开发。具体要求:1. 需求分析:项目应具有的基本功能。2. 数据库的设计3. 信息系统的总体设计4. 信息系统的详细设计5. 设计小结:总结课程设计的过程、体会及建议。6. 其他:参考文献等。【注意事项】l 题目自定,同样系统不能完全相同,否则以不
2、及格计。l 必须要有系统总体功能图和系统设计流程图。l 如果有数据库,则必须要有数据库E-R图。指导教师签字: 日期: 指导教师评语成绩:_ 指导教师签字: 日期: 课程设计所需软件、硬件等n 硬件环境:Iterl(R) Core(TM)2 Duo CPU,主频2.31GHz;内存3G; 硬盘320G以上;1024768显示分辨率n 软件环境:JDK1.6及以上版本、Eclipse集成软件。 课程设计进度计划起至日期工作内容备注5.6-5.255.26-5.285.29-5.306.16.20需求分析系统总体设计系统详细设计系统测试和调试参考文献、资料索引序号文献、资料名称编著者出版单位1Ja
3、va语言程序设计(第二版)李尊朝,苏军中国铁道出版社2java大学基础教程(第六版)刘晓莉电子工业出版社3Java编程思想(第四版)埃史尔(美),译者:陈昊鹏机械工业出版社21目 录前言-2 一、设计任务与要求21.1设计任务21.2具体要求2二、概要设计22.1设计思路-22.2程序结构图-22.3系统流程图-3三、详细设计-4四、设计结果与分析-5五、心得体会-7六、附录(源代码)-7前言“贪吃蛇”游戏是一个经典的游戏,它因操作简单、娱乐性强而广受欢迎。本文基于Java技术开发环境,开发了一个操作简单、界面美观、功能较齐全的“贪吃蛇”游戏。整个游戏程序分六个类模块,实现了游戏的开始、暂停、
4、结束。通过本游戏的开发,达到学习Java技术和熟悉软件开发流程的目的。一、设计任务与要求1.1设计任务设计一个贪吃蛇的游戏功能要求:能够显示贪吃蛇的运动,能通过键盘控制贪吃蛇的运行,能够处理蛇在运行中各种情况,以及其它的辅助功能。设计任务要完成设计、编码、测试等过程,给出设计思路、主要代码。源代码以及可运行的贪吃蛇游戏。1.2具体要求具体内容如下:1) 设计任务与要求2)总体方案与说明3)面向对象的设计(主要类的设计)4)源程序清单与注释 5) 软件主要模块流程图6)问题分析与解决方案7)小结与体会二、概要设计2.1设计思路通过分析该程序基本需要以下几个类:Text(Main方法)、Snake
5、(蛇)、Food(食物)、Yard(窗口)、Map(地图)、Node(节点)、PaintThread(线程)、Dir(方向)、KeyMonitor(键盘监听)。主要实现蛇运动的基本操作和一些事件反应、游戏分数的记录、暂停、重新开始、更改蛇蛇颜色,蛇的移动速度,地图、死亡模式的改变等功能。本程序运用Java语言知识,用面向对象的思维设计“贪吃蛇”游戏。2.2程序结构图2.3系统流程图三、详细设计类、方法、属性说明:(1)成员变量1. 表1 主要成员变量(属性)成员变量描述变量类型名称文件菜单中子菜单“新建”JMenuItemmFile_New编辑菜单中子菜单“撤消”JMenuItemmEdit_
6、Undo格式菜单中子菜单“颜色”JMenuformatMenu_Color帮助菜单中子菜单“帮助主题”MenuItemmHelp_HelpTopics(2)方法2. 表2 主要方法方法名功能备注Notepad4()描述记事本无Text.setBackground(Color.black)设置编辑区默认背景色无Text.setForeground(Color.black)设置编辑区默认前景色无四、设计结果与分析运行程序出现游戏界面,蛇(Snake)头自动向前移动,用键盘的上(Up)下(Down)左(Left)右(Right)键控制蛇头的移动方向。游戏窗体中在随机位置出现紫色的食物(Food)。1
7、、每吃一个加5分2、默认撞墙不死3、默认速度34、默认地图15、默认普通蛇身6、默认30分提升一个速度档次7、默认每个速度都走完后更换地图并且速度恢复默认,积分归零。功能键:1、按F1重新开始2、按空格键暂停/继续3、按1/2/3/4/5数字键设置蛇的移动速度(逐渐变快)4、按F2更换地图(3种)5、按F3普通蛇/彩蛇的切换6、按F4更换游戏模式(蛇撞到最外围为死亡还是从另一端返回)运行结果如下图所示:程序开始的界面吃到食物得分界面当蛇碰撞到自己的身体时,游戏结束。五、心得体会通过这次课程设计,我对这学期所学的JAVA语言程序设计有一个更深刻的了解,将所学的知识应用于实践,由于所学知识有限,为
8、了使游戏能够实现自己预先的构想,我通过上网和去图书馆找程序,比较好的流程图及功能模块,不断阅读修改代码使程序达到预期所要实现的目标,完成课程设计后,可以感觉到自己对Java程序的又有了新的认识。总之,在这一次的课程设计过程中,我查阅了大量的资料,对Java有了一点初步的认识,对于软件工程这些辅助性的教材也巩固了不少,为我这次的课设提供了很大的帮助,锻炼了我的能力让我掌握了一门新的程序设计语言:java语言,系统地学习了数据库方面的知识,并更进一步提高了我在程序设计、调试方面的技巧。更重要的是,它还让我认识到了自己的不足,在编程方面,我仅仅是刚刚入门而已,以后的道路任重道远,需要我不断的丰富自己
9、、充实自己,这样才能在程序设计方面有所收获。六、附录:源程序代码1、 Snake.javaimport java.awt.Color;import java.awt.Graphics;import java.awt.event.KeyEvent;public class Snake Node head = null;Node tail = null;int size = 0;Yard y;Node n = new Node(1, 2, Dir.D);public Snake(Yard y) head = n;tail = n;size = 1;this.y = y;for(int i=0;i3
10、;i+)this.Headadd();public void Tailadd() Node node = null;switch (tail.dir) case L :node = new Node(tail.m+1, tail.n, tail.dir);break;case U :node = new Node(tail.m, tail.n+1, tail.dir);break;case R :node = new Node(tail.m-1, tail.n, tail.dir);break;case D :node = new Node(tail.m, tail.n+1, tail.dir
11、);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 Headadd() Node node = null;switch (head.dir) case L:node = new Node(head.m - 1, head.n, head.dir);break;case U:node = new Node(head.m, head.n - 1, head.d
12、ir);break;case R:node = new Node(head.m + 1, head.n, head.dir);break;case D:node = new Node(head.m, head.n + 1, head.dir);break;node.next = head;head.pre = node;head = node;size+;public void draw(Graphics g) if (size = 0)return;move();for (Node n = head; n != null; n = n.next) if(head=n)g.setColor(C
13、olor.BLUE);if(n.dir=Dir.L|n.dir=Dir.R)g.fillOval(n.m*Yard.B_WIDTH, n.n*Yard.B_WIDTH, Yard.B_WIDTH, Yard.B_WIDTH-3);elseg.fillOval(n.m*Yard.B_WIDTH, n.n*Yard.B_WIDTH, Yard.B_WIDTH-3, Yard.B_WIDTH);elsen.draw(g);public void Deadif() switch(Yard.STYLE)case 2:if (head.m 0 | head.n = (Yard.WIDTH / Yard.B
14、_WIDTH)| head.n = (Yard.HEIGHT / Yard.B_WIDTH) y.stop();break;case 1:int cols = Yard.WIDTH / Yard.B_WIDTH;int rows = Yard.HEIGHT / Yard.B_WIDTH;if(head.m = cols) head.m = 0;else if (head.n = rows) head.n = 30/Yard.B_WIDTH;break;for (Node p = head.next; p != null; p = p.next) if (head.m = p.m & head.
15、n = p.n) y.stop();switch (Yard.MAP) case 1:/地图1break;case 2:/地图2for (int j = 10; j Yard.WIDTH/Yard.B_WIDTH-10; j +)if(head.m=j&head.n=10)y.stop();for (int j = 10; j Yard.WIDTH/Yard.B_WIDTH-10; j +)if(head.m=j&head.n=20)y.stop();break;case 3:/地图3for (int j = 10; j Yard.WIDTH/Yard.B_WIDTH-10; j +)if(h
16、ead.m=j&head.n=10)y.stop();for (int j = 10; j Yard.WIDTH/Yard.B_WIDTH-10; j +)if(head.m=j&head.n=20)y.stop();for (int j = 20; j 26; j +)if(head.m=Yard.WIDTH/Yard.B_WIDTH-10&head.n=j)y.stop();for (int j = 5; j 10; j +)if(head.m=10&head.n=j)y.stop();break;default:break;void move() Yard.MOVECHECK = tru
17、e;Headadd();Deltail();Deadif();public void eat(food e) if (y.f.getM() = y.s.head.m & y.f.getN() = y.s.head.n)e.reAppear();this.Tailadd();y.setscore(y.getscore() + 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;
18、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;2、 Food.javaimport java.awt.Color;import java.awt.Graphics;import java.util.Random;public clas
19、s Food public static int FOODSTYLE = 1;private int m = r.nextInt(Yard.WIDTH / Yard.B_WIDTH);/ 横格private int n = r.nextInt(Yard.HEIGHT / Yard.B_WIDTH - 30/Yard.B_WIDTH) + 30/Yard.B_WIDTH;/ 竖格public static Random r = new Random();public int getM() return m;public void setM(int m) this.m = m;public int
20、 getN() return n;public void setN(int n) this.n = n;public void reAppear() this.m = r.nextInt(Yard.WIDTH / Yard.B_WIDTH);this.n = r.nextInt(Yard.HEIGHT / Yard.B_WIDTH - 30/Yard.B_WIDTH) + 30/Yard.B_WIDTH;public void draw(Graphics g) switch (Yard.MAP) case 2:/地图1for (int j = 10; j Yard.WIDTH/Yard.B_W
21、IDTH-10; j +)if(m=j&n=10)this.reAppear();for (int j = 10; j Yard.WIDTH/Yard.B_WIDTH-10; j +)if(m=j&n=20)this.reAppear();break;case 3:/地图2for (int j = 10; j Yard.WIDTH/Yard.B_WIDTH-10; j +)if(m=j&n=10)this.reAppear();for (int j = 10; j Yard.WIDTH/Yard.B_WIDTH-10; j +)if(m=j&n=20)this.reAppear();for (
22、int j = 20; j 26; j +)if(m=Yard.WIDTH/Yard.B_WIDTH-10&n=j)this.reAppear();for (int j = 5; j 10; j +)if(m=10&n=j)this.reAppear();break;default:break;Color old = g.getColor();g.setColor(new Color(100, 13, 250);g.fillOval(m * Yard.B_WIDTH, n * Yard.B_WIDTH, Yard.B_WIDTH,Yard.B_WIDTH);g.setColor(old);3、
23、 Yard.javaimport java.awt.Color;import java.awt.Font;import java.awt.Frame;import java.awt.Graphics;import java.awt.event.KeyEvent;import java.awt.event.WindowAdapter;import java.awt.event.WindowEvent;public class Yard extends Frame public static final int WIDTH = 600;public static final int HEIGHT
24、= 480;public static final int B_WIDTH = 15;private int score = 0;public static int MAP =1;/地形public static int STYLE =1;/模式public static int SBODY =1;/蛇身颜色模式public static boolean MOVECHECK= true;PaintThread th = new PaintThread(this);private boolean gameover = false;public boolean isGameover() retur
25、n gameover;public void setGameover(boolean gameover) this.gameover = gameover;public Yard()Color c = new Color(0,166,0);this.setTitle(贪吃蛇);this.setLocation(200, 200);this.setSize(WIDTH, HEIGHT);this.setBackground(c);this.setResizable(false);this.setVisible(true);this.addWindowListener(new WindowAdap
26、ter() / 匿名的局部类Overridepublic void windowClosing(WindowEvent e) setVisible(false);System.exit(0););this.addKeyListener(new KeyMonitor();th.start();Food f = new Food();Snake s = new Snake(this);Overridepublic void paint(Graphics g) / 画格Color old = g.getColor();Map.draw(g);f.draw(g);/ 画蛋s.draw(g);/ 画蛇s
27、.eat(f);g.setColor(Color.YELLOW);g.drawString(score: + score, 10, 60);g.setFont(new Font(宋体, Font.BOLD, 50);if (gameover) g.setColor(Color.black);g.fillRect(0, 0, WIDTH, HEIGHT);g.setColor(Color.YELLOW);g.drawString(游戏结束!, 200, 180);g.setFont(new Font(宋体, Font.BOLD, 30);g.drawString(score: + score,
28、10, 60);th.pause();g.setColor(old);this.ScoreCheck(g);public void ScoreCheck(Graphics g)if(score = 30) th.install(90);if(score =60) th.install(60);if(score = 90)th.install(120);MAP+;if(MAP = 4)g.setColor(Color.black);g.fillRect(0, 0, WIDTH, HEIGHT);g.setColor(Color.YELLOW);g.drawString(恭喜你通全关了!, 130
29、, 180);g.setFont(new Font(宋体, Font.BOLD, 30);g.drawString(score: + score, 10, 60);th.pause();elseg.setColor(Color.black);g.fillRect(0, 0, WIDTH, HEIGHT);g.setColor(Color.YELLOW);g.drawString(恭喜你过关了!, 130, 180);g.drawString(下一关载入中., 130, 280);g.setFont(new Font(宋体, Font.BOLD, 30);g.drawString(score:
30、+ score, 10, 60);try th.sleep(3000); catch (InterruptedException e) e.printStackTrace();f.reAppear();th.reStart();public void stop() gameover = true;public int getscore() return score;public void setscore(int i) score = i;public void processKey(int key, KeyEvent e) if(MOVECHECK)s.keyPressed(e);MOVEC
31、HECK = false;switch (key) case KeyEvent.VK_SPACE:if (!th.isPause()th.pause();elseth.go_on();break;case KeyEvent.VK_F1:th.reStart();break;case KeyEvent.VK_1:th.install(300);break;case KeyEvent.VK_2:th.install(200);break;case KeyEvent.VK_3:th.install(120);break;case KeyEvent.VK_4:th.install(90);break;
32、case KeyEvent.VK_5:th.install(50);break;case KeyEvent.VK_F2:MAP = MAP%3+1;f.reAppear();th.reStart();break;case KeyEvent.VK_F4:STYLE = STYLE%2+1;f.reAppear();th.reStart();break;case KeyEvent.VK_F3:SBODY = SBODY%2+1;break;default :break;4、 Map.javaimport java.awt.Color;import java.awt.Graphics;public
33、class Map public static void draw(Graphics g)Color old = g.getColor();g.setColor(new Color(100, 0, 0);switch (Yard.MAP) case 1:/地图1break;case 2:/地图2for (int j = 10; j Yard.WIDTH/Yard.B_WIDTH-10; j +)g.fillRect(j*Yard.B_WIDTH, 10*Yard.B_WIDTH, Yard.B_WIDTH, Yard.B_WIDTH);for (int j = 10; j Yard.WIDTH
34、/Yard.B_WIDTH-10; j +)g.fillRect(j*Yard.B_WIDTH, 20*Yard.B_WIDTH, Yard.B_WIDTH, Yard.B_WIDTH);break;case 3:/地图3for (int j = 10; j Yard.WIDTH/Yard.B_WIDTH-10; j +)g.fillRect(j*Yard.B_WIDTH, 10*Yard.B_WIDTH, Yard.B_WIDTH, Yard.B_WIDTH);for (int j = 10; j Yard.WIDTH/Yard.B_WIDTH-10; j +)g.fillRect(j*Ya
35、rd.B_WIDTH, 20*Yard.B_WIDTH, Yard.B_WIDTH, Yard.B_WIDTH);for (int j = 20; j 26; j +)g.fillRect(Yard.WIDTH/Yard.B_WIDTH-10)*Yard.B_WIDTH, j*Yard.B_WIDTH, Yard.B_WIDTH, Yard.B_WIDTH);for (int j = 5; j 10; j +)g.fillRect(10*Yard.B_WIDTH, j*Yard.B_WIDTH, Yard.B_WIDTH, Yard.B_WIDTH);break;default :break;
36、g.setColor(old);5、PaintThread.javaclass PaintThread extends Thread private boolean pause = false;private int speed = 120;Yard y;public PaintThread(Yard y) this.y = y;public void go_on() this.pause = false;public boolean isPause() return pause;public void pause() this.pause = true;public void reStart() this.install(120);y.setscore(0);this.pa
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 镇2025年柠檬黄脉病综合防控专项行动方案安岳柠檬黄脉病补贴
- 防汛物资仓库可行性研究报告
- 青海婴儿车生产建设项目可行性研究报告
- 高标准农田建设项目实施方案、可研报告编制技术方案
- 高速公路工程可行性研究报告(投资估算及资金筹措)
- 黄冈建筑垃圾循环再利用建设项目可行性研究报告
- 第十届安徽省全屋智能设计集成职业技能竞赛(制冷空调系统安装维修工)备赛试题库(含答案)
- 产品专员工作汇报
- 2025年护师类之儿科护理主管护师真题练习试卷A卷附答案
- 2025年证券从业之证券市场基本法律法规押题练习试题A卷含答案
- 2025年船舶租赁合同协议书模板
- 江苏省宿迁市泗阳县2024-2025学年高一上学期11月期中物理试题(含答案)
- 2025年注册兽医《兽医临床诊疗学》备考题库及答案解析
- 2025年小学五年级数学上学期单元测试专项训练(含答案)
- 2025宁夏交通建设投资集团有限公司校园招聘和社会招聘230人(1号)考试笔试备考试题及答案解析
- 2025汉中市级机关遴选公务员及选聘事业单位人员(54人)笔试考试备考试题及答案解析
- 2025广东广州市海珠区教育系统高校“优才计划”招聘68人笔试考试参考试题及答案解析
- 甘肃省陇南市西和县2025-2026学年八年级上学期周期学业能力评鉴数学试卷(含解析)
- 2025品牌情绪与增长白皮书
- 2025年中小学课外读物进校园落实情况自查报告
- 防爆弹课件教学课件
评论
0/150
提交评论