编程类本科毕业论文

  导语:欢迎来到CN人才网,下面是小编整理的基于java的贪吃蛇游戏编程类的毕业论文,欢迎大家阅读借鉴!

  编程类毕业设计(论文)-基于java的贪吃蛇游戏开发

  前言

  随着3G的到来,让人们的目光聚集到一个新兴的互联网终端

  ——手机上。手机的随身性让玩家有了随时随地完游戏的可能。据我调查行业分析师也对这一行业持普遍的乐观态度。yramid Researcher 的最新报告显示,手机游戏市场正在稳步发展。用户数从2008年的1.83亿到现在将增长到3亿。据报告分析,2014年,市场 规模有望达到180亿美元。

  手机游戏的发展有以下推动因素

  1. 更好更快的无限网络以及易于操作的手机终端改善了用户

  的体验;

  2. 触摸屏,3D动画处理能力以及在线互动能力让游戏开发商把游戏做的更好;

  3.苹果应用商店模式刺激作用。

  J2ME是一种针对移动电话和PDA这样的小型设备的Java语言。大部分的手机厂商都迫切希望Java手机推广应用。上千万的手机已经到了消费者手中。它已经极大的提高了移动电话支持游戏的能力。它有着比SMS或WAP 更好控制的界面。允许使用子图形动画。并且可以通过无限网络连接到远程服务器。支持Java的手机的普及,所以目前它成为最好的移动游戏开发环境。J2ME不是手机上配置的唯一解释语言,但是它是许多厂商支持的行业标准。一些专用的解释语言也在某些区域有上着上佳的表现。如北美的Qualcomm的BREM和一些韩国运营上支持的名为GVM的标准。

  基于以上分析,Java手机游戏的开发具有重要的意义。

  1.1.5健壮性

  Java致力于检查程序在编译和运行时的错误,并自动回收内存,减 少了内存出错的可能性。Java取消了C语言的结构、指针、#define语句、多重继承、goto语句、操作符、重载等不易被掌握的特性,提供垃圾收集器自动回收不用的内存空间。

  1.2 J2ME介绍

  虽然 Java 已经被用到许多企业级软体上,可是其实骨子里面还是非常适合用在嵌入式系统之中。Java平台演进到Java2后,Java平台分别针对不同领域的需求被分成四个版本,亦即J2EE、J2SE、J2ME以及JavaCard中J2ME定位在消费性电子产品的应用上。这个版本针对资源有限的电子消费产品的需求精简核心类库,并提供了模块化的架构让不同类型产品能够随时增加支持的能力。这个版本的应用层面相当广泛,会是未来Java平台发展的重点项目。

  J2ME在1999年的JavaOne开发人员大会上初次亮相,它的目标是面向智能无线设备和小型计算机设备的开发人员。J2ME的一个关键优点是,J2ME与所有支持Java的设备都是兼容的。支持Java的设备就是任何运行Java虚拟机器的计算机。Motorola、Nokia等生产厂商都生产支持Java的设备。

  JAVJ2ME平台是由配置(Configuration)和简表(Profile)构成的。配置是提供给最大范围设备使用的最小类库集合,在配置中同时包含Java虚拟机。简表是针对一系列设备提供的开发包集合。在J2ME

  中还有一个重要的概念是可选包(Optional Package),它是针对特定设备提供的类库,比如某些设备是支持蓝牙的,针对此功能J2ME中制定了JSR82(Bluetooth API)提供了对蓝牙的支持。 目前,J2ME中有两个最主要的配置,分别是Connected Limited Devices Configuration(CLDC)和Connected Devices

  Configuration(CDC)。

  net]

  1.3 关于ECLIPSE

  Eclipse 是一个开放源代码的、基于 Java 的可扩展开发平台。就其本身而言,它只是一个框架和一组服务,用于通过插件组件构建开发环境。幸运的是,Eclipse 附带了一个标准的插件集,包括 Java 开发工具(Java Development Tools,JDT)。

  虽然大多数用户很乐于将 Eclipse 当作 Java IDE 来使用,但 Eclipse 的目标不仅限于此。Eclipse 还包括插件开发环境(Plug-in

  Development Environment,PDE),这个组件主要针对希望扩展 Eclipse 的软件开发人员,因为它允许他们构建与 Eclipse 环境无缝集成的工具。由于 Eclipse 中的每样东西都是插件,对于给 Eclipse 提供插件,以及给用户提供一致和统一的集成开发环境而言,所有工具开发人员都具有同等的发挥场所。

  这种平等和一致性并不仅限于 Java 开发工具。尽管 Eclipse 是使用 Java 语言开发的,但它的用途并不限于 Java 语言;例如,支持诸如

  C/C++、COBOL 和 Eiffel 等编程语言的插件已经可用,或预计会推出。Eclipse 框架还可用来作为与软件开发无关的其他应用程序类型的基础,比如内容管理系统。Eclipse 是一个开放源代码的、基于 Java 的可扩展开发平台。就其本身而言,它只是一个框架和一组服务,用于通过插件组件构建开发环境。

  1.4 WTK介绍

  WTK 的全称是Sun J2ME Wireless Toolkit —— Sun的无线开发工具包。这一工具包的设计目的是为了帮助开发人员简化j2me的开发过程。使用其中的工具可以开发与 Java Technology for the Wireless Industry (JTWI, JSR 185) 规范兼容的设备上运行的j2me 应用程序。 WTK是用来开发MIDP的,为了让MIDlet可以顺利编译和执行,WTK必须具有CLDC和MIDP的类库,WTK可以帮助我们省去额外安装调试这些类库的时间

  2.需求分析

  2.1游戏的介绍

  游戏的名称叫“贪吃蛇”,节:一条蛇可以看成有许多正方形的“小格子”拼凑成,我把它称作节。节是蛇身上最小的单位。 段:当许多节连成一条直线,我称它为段。贪吃蛇只有一段,如果它拐弯就变成两段。

  链表:用来保存每一段的状态,链表的元素单位是段。且链

  表的最后一个元素表示蛇的头部段。

  坐标系:MIDP中的坐标以左上角那点为(0,0),向右则x递增,向下则y递增。

  2.2游戏开发的可行性

  游戏开发至今已经有30多年,在这个短暂的时期里,随着硬件的水平的提高。游戏开发新技术层出不穷,经典游戏比比皆是,游戏这个名称一直存在于每个人的日常生活中。因此,游戏对于现代人的成长历程,绝对是一个不可或缺的重要角色.而从技术方面来看,现在的java技术也融入了手机中。这些都为开发的这款贪吃蛇游戏提供了条件。

  2.3设计目的

  综合运用在校所学的知识和技能,设计开发贪吃蛇游戏,使自己熟悉应用系统的开发的过程,培养独立思考的能力,校验学习效果和动手能力,提高工程实践能力。

  2.4游戏需求

  给出一条小蛇和随机出现一个食物,当小蛇吃到食物时就加分。

  2.4.1游戏界面需求

  良好的用户界面,有分数显示和暂停。

  3. 游戏开发

  3.1游戏主界面的开发

  屏幕的背景用白色,由于屏幕高比宽长,所以取以宽为边长的矩形区域作为游戏区域,下面的部分作为分数、信息区域。

  图一(游戏的主界面)

  3.2 绘制蛇身

  protected void paint(Graphics g) {

  //清屏

  g.setColor(0, 255, 0);

  g.fillRect(0,0,width,height);

  g.setColor(0);

  //绘制蛇身

  for(int i = 0;i < snakeNum;i++){

  g.fillRect(snake[i][0],snake[i][1],SNAKEWIDTH,SNAKEWIDTH); }

  //绘制食物

  if(b){

  g.fillRect(foodX,foodY,SNAKEWIDTH,SNAKEWIDTH); }

  }

  3.3创建初始“蛇”及“蛇”的移动

  蛇的初始长度为5,边长为10个像素(背景为黄色),蛇头初始位于屏幕(100,30),方向向左,用向量表来记录每个蛇的位置以及方向。

  部分参考代码如下:

  private void move(int direction){

  //蛇身移动

  for(int i = snakeNum - 1;i > 0;i--){

  snake[i][0] = snake[i - 1][0];

  snake[i][1] = snake[i - 1][1];

  }

  }

  3.4 吃掉食物,蛇身增长

  当小蛇吃掉食物后,会增长,

  部分代码:

  /**

  * 吃掉食物,自身增长

  */

  private void eatFood(){

  //判别蛇头是否和食物重叠

  if(snake[0][0] == foodX && snake[0][1] == foodY){ snakeNum++;

  generateFood();

  }

  }

  3.4随机产生食物

  部分代码:

  * 产生食物

  * 说明:食物的坐标必须位于屏幕内,且不能和蛇身重合 */

  private void generateFood(){

  while(true){

  foodX = Math.abs(random.nextInt() % (width - SNAKEWIDTH + 1)) / SNAKEWIDTH * SNAKEWIDTH;

  foodY = Math.abs(random.nextInt() % (height - SNAKEWIDTH + 1)) / SNAKEWIDTH * SNAKEWIDTH; boolean b = true;

  for(int i = 0;i < snakeNum;i++){

  if(foodX == snake[i][0] && snake[i][1] == foodY){

  b = false;

  break;

  }

  }

  if(b){

  break;

  }

  }

  }case RIGHT:

  if(direction != DIRECTION_LEFT){

  direction = DIRECTION_RIGHT;

  }

  break;

  case FIRE:

  //暂停和继续

  isPaused = !isPaused;

  break;

  }

  }

  3.6 判断游戏结束

  只有一种游戏结束的方式,即蛇头碰到蛇身游戏结束。

  参考代码:

  private boolean isGameOver(){

  //边界判别

  if(snake[0][0] < 0 || snake[0][0] > (width - SNAKEWIDTH) || snake[0][1] < 0 || snake[0][1] > (height - SNAKEWIDTH)){ return true;

  }

  //碰到自身

  for(int i = 4;i < snakeNum;i++){

  if(snake[0][0] == snake[i][0]

  && snake[0][1] == snake[i][1]){

  return true;

  }

  }

  return false;

  }

  4游戏测试与发布

  4.1游戏运行的效果图

  图一表示小蛇正在移动

  图二表示,随机产生一个食物

  图三表示小蛇吃掉食物增长后继续移动

  4.2 测试结果

  程序运行良好,未出现bug.

  5.自我评价和总结

  5.1遇到的问题及解决办法

  先是图形化界面的设计,一直想不出好的办法,最后翻看了教程才解决了这个问题,后来在蛇的移动上也遇到了些问题。上网查了一下,才知道蛇身是由一连串的基本图形组成的,每过1秒检查前面是什么,如果是空的,就把图画成普通身子的样子。再在前方在画一个头,并将其左标记入数组,数组要足够大,在把尾巴画成背景色,如果前面是食物,尾巴就不删除。这个里面的难点就是数组里面的操作

  /**已经使用的节点数量*/

  int snakeNum;

  /**贪吃蛇运动方向,0代表向上,1代表向下,2代表向左,3代表向右*/ int direction;

  /*移动方向*/

  /**向上*/

  private final int DIRECTION_UP = 0;

  /**向下*/

  private final int DIRECTION_DOWN = 1;

  /**向左*/

  private final int DIRECTION_LEFT = 2;

  /**向右*/

  private final int DIRECTION_RIGHT = 3;

  /**游戏区域宽度*/

  int width;

  /**游戏区域高度*/

  int height;

  /**蛇身单元宽度*/

  private final byte SNAKEWIDTH = 4;

  /**是否处于暂停状态,true代表暂停*/

  boolean isPaused = false;

  /**是否处于运行状态,true代表运行*/

  boolean isRun = true;

  /**时间间隔*/

  private final int SLEEP_TIME = 300;

  /**食物的X坐标*/

  int foodX;

  /**食物的Y坐标*/

  int foodY;

  /**食物的闪烁控制*/

  boolean b = true;

  /**Random对象*/

  Random random = new Random();

  public SnakeCanvas() {

  //初始化

  init();

  width = this.getWidth();

  height = this.getHeight();

  //启动线程

  new Thread(this).start();

  }

  /**

  * 初始化开始数据

  */

  private void init(){

  //初始化节点数量

  snakeNum = 7;

  //初始化节点数据

  for(int i = 0;i < snakeNum;i++){

  snake[i][0] = 100 - SNAKEWIDTH * i;

  snake[i][1] = 40;

  }

  //初始化移动方向

  direction = DIRECTION_RIGHT;

  //初始化食物坐标

  foodX = 100;

  foodY = 100;

  }

  protected void paint(Graphics g) {

  //清屏

  g.setColor(0, 255, 0);

  g.fillRect(0,0,width,height);

  g.setColor(0);

  //绘制蛇身

  for(int i = 0;i < snakeNum;i++){

  g.fillRect(snake[i][0],snake[i][1],SNAKEWIDTH,SNAKEWIDTH); }

  //绘制食物

  if(b){

  g.fillRect(foodX,foodY,SNAKEWIDTH,SNAKEWIDTH);

  }

  }

  private void move(int direction){

  //蛇身移动

  for(int i = snakeNum - 1;i > 0;i--){

  snake[i][0] = snake[i - 1][0];

  snake[i][1] = snake[i - 1][1];

  //第一个单元格移动

  switch(direction){

  case DIRECTION_UP:

  snake[0][1] = snake[0][1] - SNAKEWIDTH;

  break;

  case DIRECTION_DOWN:

  snake[0][1] = snake[0][1] + SNAKEWIDTH;

  break;

  case DIRECTION_LEFT:

  snake[0][0] = snake[0][0] - SNAKEWIDTH;

  break;

  case DIRECTION_RIGHT:

  snake[0][0] = snake[0][0] + SNAKEWIDTH;

  break;

  }

  }

  /**

  * 吃掉食物,自身增长

  */

  private void eatFood(){

  //判别蛇头是否和食物重叠

  if(snake[0][0] == foodX && snake[0][1] == foodY){

  snakeNum++;

  generateFood();

  }

  }

  /**

  * 产生食物

  * 说明:食物的坐标必须位于屏幕内,且不能和蛇身重合 */

  private void generateFood(){

  while(true){

  foodX = Math.abs(random.nextInt() % (width - SNAKEWIDTH + 1)) / SNAKEWIDTH * SNAKEWIDTH;

  foodY = Math.abs(random.nextInt() % (height - SNAKEWIDTH + 1)) / SNAKEWIDTH * SNAKEWIDTH; boolean b = true;

  for(int i = 0;i < snakeNum;i++){

  if(foodX == snake[i][0] && snake[i][1] == foodY){

  b = false;

  break;

  }

  if(b){

  break;

  }

  }

  }

  /**

  * 判断游戏是否结束

  * 结束条件:

  * 1、蛇头超出边界

  * 2、蛇头碰到自身

  */

  private boolean isGameOver(){

  //边界判别

  if(snake[0][0] < 0 || snake[0][0] > (width - SNAKEWIDTH) || snake[0][1] < 0 || snake[0][1] > (height - SNAKEWIDTH)){ return true;

  }

  //碰到自身

  for(int i = 4;i < snakeNum;i++){

  if(snake[0][0] == snake[i][0]

  && snake[0][1] == snake[i][1]){

  return true;

  }

  }

  return false;

  }

  /**

  * 事件处理

  */

  public void keyPressed(int keyCode){

  int action = this.getGameAction(keyCode);

  //改变方向

  switch(action){

  case UP:

  if(direction != DIRECTION_DOWN){

  direction = DIRECTION_UP;

  }

  break;

  case DOWN:

  if(direction != DIRECTION_UP){

  }

  //重新绘制

  repaint();

  long end = System.currentTimeMillis();

  //延时

  if(end - start < SLEEP_TIME){

  Thread.sleep(SLEEP_TIME - (end - start)); }

  }

  }catch(Exception e){}

  }

  }

本文已影响6827
上一篇:物流工程本科毕业论文 下一篇:地理本科毕业论文

相关文章推荐

|||||