游戏设计报告

时间:2024.4.7

20##-20##学年第一学期

J2ME程序设计》

游戏设计报告

第一章、开发平台与技术概述

  1.1开发环境

  操作系统:Microsoft Windows XP

  程序语言:Java 2

  开发包:Sun Java(TM) Wireless Toolkit 2.5.2 for CLDC

  IDE:Eclipse 3.2

  1.2WTKECLIPSEJAM的介绍

(1)    WTK 的全称是Sun J2ME Wireless Toolkit —— Sun的无线开发工具包。这一工具包的设计目的是为了帮助开发人员简化j2me的开发过程。使用其中的工具可以开发与 Java Technology for the Wireless Industry (JTWI, JSR 185) 规范兼容的设备上运行的j2me 应用程序。该工具箱包含了完整的生成工具、实用程序以及设备仿真器。到本文写作时为止可以获取有四个版本,分别是1.0.4, 2.0, 2.1和2.2。每个版本都包括英语,日语,简体中文,繁体中文4个语种包。

WTK是Sun提供的一个开发工具包。目前各大手机厂商往往把WTK经过自身的简化与改装,推出适合自身产品,如SonyEricsson,Nokia Developer’s suit等,都属于此种类型;而通过JBuilder, Eclipse等IDE,J2ME开发包工具可以被绑定在这些集成开发环境中,进一步提高开发效率。

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

Eclipse是一个开放源代码的软件开发项目,专注于为高度集成的工具开发提供一个全功能的、具有商业品质的工业平台。它主要由Eclipse项目、Eclipse工具项目和Eclipse技术项目三个项目组成,具体包括四个部分组成——Eclipse Platform、JDT、CDT和PDE.JDT支持Java开发、CDT支持C开发、PDE用来支持插件开发,Eclipse Platform则是一个开放的可扩展IDE,提供了一个通用的开发平台。它提供建造块和构造并运行集成软件开发工具的基础。

1.3JAVA语言介绍

  (1)面向对象
  面向对象其实是现实世界模型的自然延伸。现实世界中任何实体都可以看作是对象。对象之间通过消息相互作用。另外,现实世界中任何实体都可归属于某类事物,任何对象都是某一类事物的实例。如果说传统的过程式编程语言是以过程为中心以算法为驱动的话,面向对象的编程语言则是以对象为中心以消息为驱动。用公式表示,过程式编程语言为:程序=算法+数据;面向对象编程语言为:程序=对象+消息。

  (2)平台无关性
  Java是平台无关的语言是指用Java写的应用程序不用修改就可在不同的软硬件平台上运行。平台无关有两种:源代码级和目标代码级。C和C++具有一定程度的源代码级平台无关,表明用C或C++写的应用程序不用修改只需重新编译就可以在不同平台上运行。

  (3)分布式

  分布式包括数据分布和操作分布。数据分布是指数据可以分散在网络的不同主机上,操作分布是指把一个计算分散在不同主机上处理。

  (4)可靠性和安全性
  Java最初设计目的是应用于电子类消费产品,因此要求较高的可靠性。Java虽然源于C++,但它消除了许多C++不可靠因素,可以防止许多编程错误。首先,Java是强类型的语言,要求显式的方法声明,这保证了编译器可以发现方法调用错误,保证程序更加可靠;其次,Java不支持指针,这杜绝了内存的非法访问;第三,Java的自动单元收集防止了内存丢失等动态内存分配导致的问题;第四,Java解释器运行时实施检查,可以发现数组和字符串访问的越界,最后,Java提供了异常处理机制,程序员可以把一组错误代码放在一个地方,这样可以简化错误处理任务便于恢复。

  (5)多线程
  线程是操作系统的一种新概念,它又被称作轻量进程,是比传统进程更小的可并发执行的单位。

第二章 J2ME及其体系结构概述
2.1 J2ME简介
    现在JAVA-JAVA2 Platform大致可分为J2SE、J2EE、J2ME三类。J2SE为JAVA-JAVA2 Platform 的标准版,通常在PC上使用的JAVA。J2EE是在J2SE的API上,扩展了给企业使用EJB与Servlet等主要使用在服务器上的功能。而J2ME则是面向家电和通信工具等微小设备。
J2ME的目标是微小设备,这类设备有许多种类,在这些设备的J2ME当中,定义了CDC(Connected Device Configuration),CLDC(Connected Limited Device Configuration)这两个Configuration。
CDC是以能用在个人网关、下一代移动电话、PDA(个人数字助理)、家电设备、POS终端、车辆导航系统等上运行为前提设计出来的。CLDC,是以能使用在移动电话、PDA(个人数字助理)、家电设备、POS终端等上面为前提设计出来的。

2.2 J2ME体系结构
配置和简表:配置定义了一个设计在一系列类似硬件上运行的Java平台的能力。J2me的目标是家电与嵌入式设备,这类设备有很多种类,对应这些设备的J2me当中,定义了CDC(连接设备配置)和CLDC(受限接设备配置)两个配置,配置所提供的类函数只有Java.lang, Java.io,Java..util包等J2SE等核心类的子集。CLDC是与手机相关的,它实际是定义一个设备制造商用来实现Java运行环境的标准,第三方开发者只需要遵循这个标准。CLDC主要影响Java开发和软件发布的以下方面:
1)目标设备的特性;
2)安全模型:安全模型有两个部分,虚拟机和应用程序安全。虚拟机安全层的目的是保护下面的设备不受任何执行代码可能引起的损害。

2.3 移动信息设备简表概述
2.3.1 MIDP的目标硬件环境
1)显示 :96*54象素,1位颜色,大约1:1比例;
2)输入: (a)单手键盘或者小键盘;
(b)双手的QWERTV键盘;

(c)触摸屏。  
3)内存:  (a)128KB非易失性内存,供MIDP组件使用;
(b)8KB的非易失性内存,供应用程序生成的永久数据使用;
(c)32KB的易失性内存,供Java堆使用。
4)网络:  (a)双响无线网络,可间歇性连接;
(b)通常是很有限的带宽。
2.3.2  MIDP应用程序
在MIDP上运行的Java程序被称为MIDlet。MIDlet是服从一些关于它运行环境和程序打包的一些规则。其运行环境是启动MIDlet,这是设备内置应用管理器的任务。应用程序能访问到下面的一些资源:(1)震动文件中的所有文件。(2)MIDlet描叙文件的内容(JAD)。
2.3.3  CLDC和MIDP库中的类
打包:MIDlet应用一般采用震动文件的形式。这个文件应该包含运行应用程序需要的类和所有的资源文件,它也应该包含一个叫manifest.mf的清单文件。保存在震动文件中的清单文件是一个简单的文本文件,包含属性值。
应用程序描叙(JADs)在移动电话网络上传送大量的数据,需要有一个描叙文件让用户在没有下载整个包之前来查看一下MIDlet震动的细节。

第三章手机游戏开发过程
3.1 贪吃蛇游戏的规则简介

贪吃蛇游戏的规则简介
在贪吃蛇游戏中,玩家操作由小方块连接而成的蛇,去吃随机散落在画面内的小方块,每吃一块就增加一小方块长度,要是撞壁以及撞自己的尾,就属于失败,如无失败则直到通关为止。
屏幕的长度的行向为11单位,纵向为18单位。在这个范围内,玩家通过操作方向键来控制蛇的运动方向。该游戏的最大特色是屏幕自适应,无论各种手机,PDA的屏幕大小如何,该游戏总是能获得最佳的显示效果。

 



3.2  详细设计
本游戏的操作流程:用户在启动MIDlet后,即进入游戏主画面,屏幕开始显示为欢迎画面。用户按下[启动]按钮后,就可以开始玩游戏。当用户想暂停时,再次按一下[启动]按钮开始,游戏就暂停了,在暂停的情况下再按[开始]按钮,游戏继续运行。任何时候按[EXIT]按钮退出,游戏MIDlet都会终止。
 
                         图:游戏流程转换过程

3.2.1代码设计
(1)游戏地图代码设计
   游戏地图是蛇的活动范围和食物随机散落的范围,游戏的容器为行向为11单位,纵向为18单位,如下代码:
private final int iX = 10;  //地图的开始坐标
    private final int iY = 10;  //
 private final int SWIDTH = 16;  //图标的宽度
    private final int iCells = 240; //地图的列数
    private final int iRows = 320;  //地图的行数
       private final int iBoxW = SWIDTH*iCells; //地图的宽
采用二维绘图工具:二维绘图工具drawLine采用4个参数——直线起点的x、y坐标值和直线终点x、y的坐标值,例如:
graphics.drawLine(50,0,100,0);
这行代码会从位置(50,0)到(100,0)绘制一条直线。
绘制一个矩形是一个类似的过程,不同的只是需要用起点加上宽度和高度的方式来指定这个对象。可以绘制透明的或者填充的矩形,甚至可以绘制圆角的矩形。4个绘制矩形的方法是:drawRect、drawRoundedRect、fillRect和fillRoundedRect。
(2)贪吃蛇和食物的代码设计
屏幕的长度为行向为320单位,纵向为240单位;在这个范围内,玩家操作方向键控制蛇的运动方向。该游戏的最大特色是屏幕自适应,无论各种手机,PDA的屏幕大小如何,该游戏总是能获得最佳的显示效果。

贪吃蛇最初由10个小正方形组成,小正方形是蛇的身体和游戏容器的组成部分。食物也由一块小正方形组成,并且随机散落在游戏框图的区域内,每次只出现唯一的一个,待玩家操作游戏完成一个任务后面,再出现下个食物,小蛇每吃一个食物就增加一个长度。实现代码如下:
public int getCell(){
  return iCell;
 }
 public int getRow(){
  return iRow;
 }
    public void show(){
        sLabel.setVisible(true);
    }
    public boolean isVisible(){
        return sLabel.isVisible();
    }
    public void hide(){
        sLabel.setVisible(false);
    }
    protected void setPosition(int row, int cell){
  iCell = cell;
  iRow  = row;
        sLabel.setBounds(cell*SWIDTH, row*SWIDTH, SWIDTH, SWIDTH);
    }
 public void moveUp(){
  if(iRow>0)
   setPosition(--iRow,iCell);
  else
   setTouch();
 }
 public void moveDown(){
  if(iRow<iBoxH-1)
   setPosition(++iRow,iCell);
  else
   setTouch();

 }
 public void moveLeft(){
  if(iCell>0)
   setPosition(iRow,--iCell);
  else
   setTouch();
 }
 public void moveRight(){
  if(iCell<iBoxW-1)
   setPosition(iRow,++iCell);
  else
   setTouch();
 }
 static boolean getTouch(){
  return isTouch;
 }
 static void setTouch(){
  isTouch = true;
 }
 static void setImTouch(){
  isTouch = false;
 }
 public Snake clone(){
  Snake tem = new Snake();
  tem.setPosition(this.getRow(),this.getCell());
  return tem;
 }
 
(3)操作控制代码设计
MIDP的游戏设计,本质上就是用一个线程或者定时器产生重绘事件,用线程和用户输入改变游戏状态。这个游戏也不例外,启动MIDlet后,就立即生成一个重绘线程,该线程每隔50ms绘制一次屏幕。当然,重绘时有一些优化措施,并不是屏幕上所有的像素都需要重绘,而是有所选择,比如游戏画布上那些已经固定下来的就不需重绘。游戏画布是一个CommandListener,可以接受用户键盘命令,控制蛇的左移,右移,下移,上移。其代码如下:
public void move(){
  hide();
  if(aoSnakes[0].getRow()==Food.getRow()&&aoSnakes[0].getCell()==Food.getCell())
   eat();
  Snake tempSnakes[] = new Snake[iLen-1];
  for(int i=0;i<tempSnakes.length;i++){
   tempSnakes[i] = aoSnakes[i].clone();
  }
  switch(heading){
   case 37:
    aoSnakes[0].moveLeft();
    break;
   case 38:
    aoSnakes[0].moveUp();
    break;
   case 39:
    aoSnakes[0].moveRight();
    break;
   case 40:
    aoSnakes[0].moveDown();
    break;
   default:
    break;

整个游戏的流程控制体现在游戏画布对象的paint()方法里。paint()根据当前的游戏状态,绘制出当时的游戏画面。欢迎画面和Game Over画面的绘制相当简单,游戏暂停画面的绘制也相当容易,就是设立标志,让paint()执行的时候无需真正执行重绘动作。
 
第四章 程序的调试与运行
4.1游戏的调试
在手机游戏方面,游戏的控制和图片的设置是游戏的基本能力,为了方便玩家操作游戏,把玩家常用的操作键设为游戏最常用的控制键,并通过J2ME简单有效的编码,使玩家可以重新设置自己的熟悉的键。本游戏不设立关卡,而是随着游戏积分的增加,游戏将自动增加游戏的难度,如加快游戏速度和随小蛇长度的增加,游戏的操作难度也会增大。如玩家进入游戏(如下图),操作小蛇,
 
               图:游戏界面图

去吃随机散落在游戏区内的食物,每吃一个食物就增加小蛇一个单位长度,并随着长度的增加,游戏的速度将增加,而小蛇的长度增加也会增加玩家的操作难度。
如果玩家操作小蛇碰壁或者由于小蛇长度太长而蛇头撞到小蛇的身体任何部位,均属于失败,玩家得重新游戏开始(如下图)。但游戏将自动纪录你的得分,并且保存你的游戏最高得分。
      

图:游戏失败的两种情况

4.2 游戏的运行环境
目标硬件环境:
1:显示: 240*320象素;
2:输入:(a)单手键盘或者小键盘;
         (b)双手的QWERTV键盘;
         (c)触摸屏。
3)内存  (a)128KB非易失性内存,供MIDP组件使用;
         (b)8KB的非易失性内存,供应用程序生成的永久数据使用;
         (c)32KB的易失性内存,供Java堆使用。

 
第五章  总结
    通过本次J2ME手机游戏设计,让我更深刻的了解程序设计的基本思想,巩固了J2ME程序设计的基本知识。本次课程设计所开发的手机游戏,实现了手机游戏的一些基本和必需的功能。如游戏的界面设置,游戏动画的设置,玩家的控制键设置,游戏的保存和游戏纪录的保存,游戏的开始和暂停等功能。但游戏功能还存在着很多不足,首先,对游戏的动画设计不够熟悉,技巧性不强,界面的设置也不够美观。这些对于玩家来说是非常重要,将直接决定本游戏的生存能力。其次,有些功能不能实现。这次游戏的功能没能做到十全十美,是由于自身能力的不足和时间的限制,没有对游戏的开发进行进一步研究,还有很多地方需要改进。

致    谢

通过这次毕业设计开阔了我的视野,增添了自己挑战的信心。在实现的过程当中得到很多人的帮助,在此,要特别感谢我的指导老师耐心细致的指导,使我从中受益匪浅。

参考文献
[1] J2ME实用教程[M].北京:人民邮电出版社.2007.1
[2]J2ME游戏编程[M].北京:清华大学出版社.2005.11
[3]孙淑敏.Java2游戏开发北京[M].北京:清华大学出版社.2005
[4]史斌星.Java基础编程贯通教材 [M]. 北京:清华大学出版社.2005
[5]杨绍方.Java 程序基础设计 [M]. 北京:科学出版社.2005

附部分代码:


SnakeMIDlet.java 文件

//文件名:SnakeMIDlet.java

package snake;

import javax.microedition.midlet.*;

import javax.microedition.lcdui.*;

public class SnakeMIDlet extends MIDlet {

    SnakeCanvas displayable = new SnakeCanvas();

    public SnakeMIDlet() {

        Display.getDisplay(this).setCurrent(displayable);

    }

    public void startApp() {}

    public void pauseApp() {}

    public void destroyApp(boolean unconditional) {}

}

cGame.java文件

////////////////////////////////////////////////////////////////////////////////

//

// cGame.java

//

//

// Author(s): Xu Qinghui

// Create: 20##-12-1

////////////////////////////////////////////////////////////////////////////////

package code;

import java.util.Random;

import javax.microedition.lcdui.*;

////////////////////////////////////////////////////////////////////////////////

class cGame extends Canvas implements Runnable

{

         private static final int STATEPLAY          = 0;

         private static final int STATELOST          = 1;

         private static final int STATEWIN            = 2;

         private static final int KEY_UP               = 1;

         private static final int KEY_DOWN                 = 2;

         private static final int KEY_LEFT           = 3;

         private static final int KEY_RIGHT        = 4;

         private static final int KEY_FIRE            = 5;

        

         public static int   s_width     = 0;

         public static int   s_height     = 0;

         public static long updates                = 0;

         public static Random rand;                      

        

         private int maxRand = 1000;

         private int map_x         = 10;

         private int map_y         = 10;

         private int map_w        = 16;

         private int map_h         = 16;

        

         private int key_x          = map_x / 2;

         private int key_y          = map_y / 2;

         private int snake_w       = 8;

         private int snake_h        = 8;

    private int pos_x = map_x / 2;

    private int pos_y = map_y / 2;

    private int aspect_x= 0;

    private int aspect_y= 1;

    private int    snake_max = 50;

    private int    snake_min  = 5;

    private int    snake_n               = snake_min;

    private int    gameState = STATEPLAY;

    private int level               = 1;

    private long sleepTime   =300;

   

    private int[]  snake_x               = new int[ snake_max ];

    private int[]  snake_y               = new int[ snake_max ];

   

         private int[][] map;

         private boolean isShowInfo   = false;

         private Font        font           = Font.getFont( Font.FACE_SYSTEM, Font.STYLE_BOLD, Font.SIZE_LARGE );

         private Thread     thread;                                                      

         private Image[] imgGameBg  = new Image[4];

         private Image[] imgItem                  = new Image[3];

         private Gif[]        gold            = new Gif[5];

         private Gif[]        dung           = new Gif[2];

         private Gif           fungus;

        

         cGame()

    {

                   setFullScreenMode(true);

                   s_width = getWidth(); 

                   s_height= getHeight(); 

                   rand  = new Random( System.currentTimeMillis() );

                   try

                   {

             for( int i=0; i<gold.length; i++ )

             {

                        gold[i]= new Gif("gold", 5, 19, 15 );

             }

             for( int i=0; i<dung.length; i++ )

             {

                        dung[i]= new Gif("dung", 6, 21, 30 );

                        dung[i].life = -2;  // --life

             }

            

             fungus = new Gif("fungus", 12, 25, 23 );

             fungus.setFormTime

             (

                        new int[] { 2000,  150,  150,  150,

                                               150,  200,  100,  100,

                                               200,  150,  200,  200

                        }

             );

             fungus.life = 5;             // --life +5

             fungus.isShow = false;

            

                            for( int i=0; i<imgItem.length; i++ )

                            {

                                     imgItem[i]=Image.createImage("/pics/item_16_"+i+".png");

                            }

                            Image temp         = Image.createImage("/pics/bg_tile_0.png");

                            Graphics gn;                                                                                                    

                            for( int i=0; i<imgGameBg.length; i++ ) 

                            {

                                     imgGameBg[i] = Image.createImage(16, 16);

                                     gn = imgGameBg[i].getGraphics();

                                     gn.drawImage(temp, -i*16, 0, gn.LEFT|gn.TOP);

                            }

                            gn     = null;

                            temp = null;        

                            System.gc();

                   }catch(Exception e){ e.printStackTrace(); }

                   rePlay( level );

                   thread  = new Thread(this);

                   thread.start();      

         }

   

    public void run()

    {

    while( true )

    {

               try

               {

                        updates++;                   

                        repaint();

                        serviceRepaints();

                        thread.sleep(sleepTime);

               }catch(Exception e)

               {

                        e.printStackTrace();

               }

    }

    }

   

    public void paint(Graphics g)

    {

    g.setClip(0, 0, s_width, s_height);

    g.setColor(0x000000);                            

    g.fillRect(0, 0, s_width, s_height);

    for( int i=0; i<map_x; i++ )                     

    {

               for( int j=0; j<map_y; j++ )

           {

                        g.drawImage(imgGameBg[ map[i][j] ], j*map_h, i*map_w, g.LEFT|g.TOP);

           }      

    }

    for( int i=0; i<gold.length; i++ )

    {

             gold[i].paint(g);

    }

    for( int i=0; i<dung.length; i++ )

    {

               dung[i].paint(g);

    }

    if( snake_n>20 )

    {

               fungus.isShow = true;

               fungus.paint( g );

    }

   

    paintSnake( g );

    if( isShowInfo || gameState != STATEPLAY ) 

    {

               g.setColor(0xFFFFFF);                                    

           for( int i=0; i<=map_y; i++ ) // |||   

           {

                    g.drawLine(i*map_w, 0, i*map_w, map_h*map_x);

           }

           for( int i=0; i<=map_x; i++ )         // ===        

           {

                    g.drawLine(0, i*map_h, map_y*map_w, i*map_h);

           }

               g.setFont( font );

    }

    g.setColor( 0xff0000 );

    g.setFont( font );

    g.drawString( "life:"+snake_n, 2,  2, 0 );

    g.drawString( "level:"+level,  2, 18, 0 );

    }

    void paintSnake( Graphics g )

    {

    g.setColor(0x0000FF);                  

        for( int i=snake_n; i>0; i-- )

        {

           snake_x[i] = snake_x[i-1];

           snake_y[i] = snake_y[i-1];

               g.fillRect(snake_x[i]-snake_w/2, snake_y[i]-snake_h/2, snake_w, snake_h);

     }

        snake_x[0] += aspect_x*8;

        snake_y[0] += aspect_y*8;

        g.setColor(0x6666FF);  

        g.fillRect(snake_x[0]-snake_w/2, snake_y[0]-snake_h/2, snake_w, snake_h);

    if( snake_x[0]<0 || snake_x[0]>s_width || snake_y[0]<0 ||snake_y[0]>s_height )

    {

               rePlay(level);

    }

              

    for( int i=snake_min; i<snake_n; i++ )

    {

           if( isIntersect(snake_x[0], snake_y[0],     snake_w, snake_h,

                                                snake_x[i], snake_y[i], snake_w, snake_h )

                    )

           {

                    rePlay(level);

           }

                   

    }

   

    for( int i=0; i<gold.length; i++ )

        {

           if( isIntersect(snake_x[0],               snake_y[0],                   snake_w,    snake_h,

                                                gold[i].pos_x,      gold[i].pos_y,      gold[i].w, gold[i].h )

             )

           {

                    addSnake( gold[i].life );

                    gold[i].setPos();

           }

        }

    for( int i=0; i<dung.length; i++ )

        {

           if( isIntersect(snake_x[0],               snake_y[0],                   snake_w,    snake_h,

                                                dung[i].pos_x,     dung[i].pos_y,     dung[i].w, dung[i].h )

             )

           {

                    addSnake( dung[i].life );

                    dung[i].setPos();

           }

        }

   

    if( fungus.isShow && isIntersect(snake_x[0],           snake_y[0],                   snake_w,    snake_h,

                        fungus.pos_x,     fungus.pos_y,      fungus.w, fungus.h )

                     )

                   {

                            addSnake( fungus.life );

//                          fungus.isShow =false;

                            fungus.setPos();

                   }

   

    }

   

    boolean isIntersect(int x1,int y1, int w1, int h1, int x2, int y2, int w2, int h2)

    {

    if( Math.abs(x2-x1) < (w1+w2)/2 && Math.abs(y2-y1) < (h1+h2)/2 )

    {

               return true;

    }

    else

               return false;

    }

   

    public void keyPressed(int key)

    {

    key = Math.abs(key);

    System.out.println("key="+key);

    switch( key )

    {

              case KEY_NUM2:

             case KEY_UP:

                        if( gameState != STATEPLAY )    

                                 break;

                        else

                        {

                                 if( aspect_y <= 0)

                                 {

                                          aspect_x =  0;

                                          aspect_y = -1;

                                 }

                        }

             break;

             case KEY_NUM8:

             case KEY_DOWN:

                        if( gameState != STATEPLAY )

                                 break;

                        else

                        {

                                 if( aspect_y >= 0)

                                 {

                                          aspect_x =  0;

                                           aspect_y = +1;

                                 }

                        }

             break;

             case KEY_NUM4:

             case KEY_LEFT:

                        if( gameState != STATEPLAY )    

                                 break;

                        else

                        {

                                 if( aspect_x <= 0)

                                 {

                                          aspect_y =  0;

                                           aspect_x = -1;

                                 }

                        }

             break;

             case KEY_NUM6:

             case KEY_RIGHT:

                        if( gameState != STATEPLAY )

                                 break;

                        else

                        {

                                 if( aspect_x >= 0)

                                 {

                                          aspect_y =  0;

                                           aspect_x = +1;

                                 }

                        }

             break;

             case KEY_FIRE:

             case KEY_NUM5:

                        if( gameState == STATEPLAY )

                        {

//                               addSnake();

//                               System.out.println("snake_n="+snake_n);

                        }

             break;

             case KEY_NUM1:               

             break;

             case KEY_NUM3:               

                        isShowInfo = !isShowInfo;

             break;

             case KEY_NUM0:               

                        rePlay( level );             

             break;

    }

    this.repaint();

    }

   

    private void addSnake(int life)

    {

    int s_n = snake_n;

    snake_n += life;

                   if( snake_n >= snake_max )

                   {

                            level++;

                            rePlay(level);

                   }

                   else if( snake_n < snake_min )                 //game over

                   {

                            rePlay(level);

                   }

                   else if( life>0 )

                   {

                            for( int i=s_n; i<snake_n; i++ )

                            {

                                     snake_x[i] = -snake_w;

                                     snake_y[i] = -snake_h;

                            }

                   }

    }

    public void rePlay( int level )

    {

    sleepTime = 300-level*20;

    map_x                 = s_height/16;

    map_y                 = s_width/16;

    key_x                 = map_x>>1;

    key_y                 = map_y>>1;

                   gameState   = STATEPLAY;

                   map         = new int[map_x][map_y];

                   isShowInfo         = false;

                   snake_n               = snake_min;

                   aspect_x     = 0;

                   aspect_y     = 0;

                   try

                   {

                            Image temp         = Image.createImage("/pics/bg_tile_"+(level%2)+".png");

                            Graphics gn;                                                                                                    

                            for( int i=0; i<imgGameBg.length; i++ ) 

                            {

                                     imgGameBg[i] = Image.createImage(16, 16);

                                     gn = imgGameBg[i].getGraphics();

                                     gn.drawImage(temp, -i*16, 0, gn.LEFT|gn.TOP);

                            }

                            gn     = null;

                            temp = null;        

                            System.gc();

                   }catch(Exception e){ e.printStackTrace(); }

                  

                   for( int i=0; i<map_x; i++ )   //draw bg

                   {

                            for( int j=0; j<map_y; j++ )

                            {

                                     int r = rand.nextInt(maxRand);

                                     for( int k=0; k<imgGameBg.length; k++ )

                                     {

                                               if( r < maxRand>>k+1  )

                                               {

                                                        map[i][j] = k;

                                               }

                                     }

                            }

                   }

    for( int i=0; i<snake_n; i++ ) //init snake

    {

               snake_x[i] = s_width >>1;

               snake_y[i] = s_height>>1;//-(i*snake_h);

    }

    }

}

更多相关推荐:
游戏体验报告

手游体验报告之《崩坏学园2》编者:何健锋基本信息游戏名称:崩坏学园2(简称:崩坏2)游戏类型:横版动作ACG手游游戏标签:横版、射击、Q萌、没节操游戏平台:安卓游戏大小:179.31MB开发商:miHOYO小提…

游戏程序报告

湖南科技大学游戏程序设计报告游戏名称自助游科大指导教师专业班级学号姓名自助游科大一游戏程序设计目的我把这个游戏定位于小型3D游戏关于构思每年都有想考进科大的学子和已经进入科大校园的新一届的学子然而校园对他们来说...

游戏体验报告

龙之谷游戏体验报告及中东市场推广摘要本文通过对游戏龙之谷的体验写出相关的体验报告并结合自身对中东市场的一些看法对该游戏的中东市场推广提出几点拙见关键词游戏体验推广20xx年7月13日上映的动画电影龙之谷之破晓骑...

android游戏报告

20xx20xx第一学期期末作业报告课程名称移动终端游戏开发学院软件学院专业软件工程班级学号姓名左杭成绩20xx年12月29日基于Android的移动终端游戏设计与实现1游戏概述桌球游戏是一个充满操作性的游戏桌...

游戏自行审核报告

科技有限公司关于手机网络游戏的自行审核报告游戏软件是本公司自主研发的手机游戏软件并于年月日原始取得了中华人民共和国国家版权局颁发的证书号软著登字第号计算机软件著作权登记证书本公司产品及服务内容审核委员会简称自审...

游戏评测报告模版

神魔遮天游戏评测报告评测人评测日期1游戏基本信息2游戏配置3测试环境31测试人员配置32测试总时长小时33测试结束时等级级4游戏评测部分41评分标准每个单项的评分标准范围为010分10分为满分所有单项的评分请根...

主流网络游戏分析报告

主流网络游戏分析报告绿色征途地下城与勇士魔兽世界主流游戏分析综合分析报告By展佳20xx34产品分析1绿色征途在线情况绿色征途于10月23日开启封测在5天内同时在线突破10万人半个月内同时在线突破15万人目前应...

网络游戏开发实训报告

湖北民族学院信息工程学院实训报告课程网络游戏开发实训题目基于VC++的网络五子棋游戏系别计算机系专业数字媒体姓名**学号**指导教师**20**年6月25日一、实训目的1.掌握网络游戏程序设计的相关知识2.理解…

大学生网络游戏状况调查报告

关于大学生网络游戏调查报告网络作为一个新兴的信息传播工具近几年在大学里日趋流行受到愈来愈多的大学生的青睐网上聊天发email给好友网上浏览新闻网络对当今大学生的影响已经深入到其生活的方方面面尽管网络存在着诸多优...

亚伦各类棋牌游戏体验报告(手游)

各类棋牌游戏体验1明天我跟鸿鹏会去拜访JJ斗地主一方面谈百度争霸赛的事一方面去跟他们的产品运营取取经他们是用户做的比较深入的棋牌CP2我们手里有赢话费斗地主的总平台数据我们深入分析一下他们的数据情况3多酷斗地主...

网络游戏立项报告

网络游戏立项报告游戏名称365夜OL游戏类型Q版3DMMORPG运行环境PC平台发行地域中国大陆用户分析根据目前市场较成熟的产品相关数据显示1525岁为网络游戏的主流用户群此类用户的特点在于接受新生事物强敢于尝...

关于大学生网络游戏调查报告

调查题目大学生网络游戏调查报告班级小组名称B11512刘智星陆建臣蔡定军齐琦田策分工情况问卷设计人员刘智星调查人员齐琦田策资料整理人员陆建臣执笔人蔡定军一调查目的和调查经过1自从网络游戏进入中国它便始终受到众多...

游戏报告(32篇)