⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cgame.java

📁 贪吃蛇升级版本
💻 JAVA
字号:
//////////////////////////////////////////////////////////////////////////////////// cGame.java//// Project: Minesweeper// Author(s): Gao Lei// Create: 2007-10-12////////////////////////////////////////////////////////////////////////////////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);    	}    }}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -