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

📄 scanvas.java

📁 JackyColorLinez源码上传。 我是第一个上传的。
💻 JAVA
字号:
import javax.microedition.lcdui.*;
import javax.microedition.lcdui.game.*;
import javax.microedition.lcdui.Image;
import java.util.*;
import java.io.*;
/**
* <p>Title: Jacky First J2ME Program</p>
*
* <p>Description: 2005-12-19</p>
*
* <p>Copyright: Copyright (c) 2005</p>
*
* <p>Company: Hong</p>
*
* @author Jacky
* @version 1.0
*/

public class SCanvas extends Canvas {
	private Display display;
	private TiledLayer tile;//棋盘
	private TiledLayer balls;//棋盘上的球
	private int upsize;//标题图片距顶端的距离
	private int themenu;//当前高亮显示的菜单项
	private String[] menus;//菜单选项
	private int menuy;//菜单开始的y坐标
	private int bdColumn;//棋盘的列数
	private int bdRow;//棋盘的行数
	private int killBall;//小球消失的最低限度数目
	private int startBall;//开始时显示的小球数量
	private int ballNumber;//彩球的总的颜色数
	private int mx,my;//小球的x,y坐标偏移量(单位:像素)

	//定义常量
	private int GameStart;//游戏开始
	private int GamePause;//游戏暂停
	private int GameOver;//游戏结束
	private int GameStatus;//游戏当前状态
	private int NewGame;//新游戏
	private Random bdRand;//棋盘的随机数
	private Random ballRand;//小球颜色随机数
	private ColorBall cur;//定义一个移动光标
	private Sprite flashcur;//一个选中后出现的光标
	private int[] bp;//小球的索引数组
	private boolean isFailed;//是否失败了
	private int score;//该局的得分
	private int thecol,therow,thecolor;//定义临时的行、列及颜色存储数
	private boolean isFlash;//是否开始显示闪烁光标
	private int[] flashIndex;//闪烁光标的动画索引


	//定义一个移动精灵
	class ColorBall{
		public Sprite ball;//小球精灵
		public int color;//小球的颜色
		public int x,y;//小球的坐标

		//构造函数
		public ColorBall(){
			color=0;
			x=0;
			y=0;
		}
		public ColorBall(int cl,int bx,int by){
			color=cl;
			x=bx;
			y=by;
		}

		//设置小球的颜色
		void setColor(int cl){
			color=cl;
		}

		//设置小球的位置
		void setPosition(int bx,int by){
			x=bx;
			y=by;
		}

		//更新小球
		void refresh(){
			repaint();
		}

		//绘制小球
		void paint(Graphics g){
			if(color==0)
				return;
			try{
				ball=new Sprite(Image.createImage("/"+color+".png"),18,18);
			}catch(IOException e){
				System.err.println("加载图片失败!");
			}
			ball.setPosition(x,y);
			ball.paint(g);
		}

		void paint(Graphics g,String img,int width,int height){
			try{
				ball=new Sprite(Image.createImage(img),width,height);
			}catch(IOException e){
				System.err.println("加载图片失败!");
			}
			ball.setPosition(x,y);
			ball.paint(g);
		}

		//释入资源
		void clear(){
			if(ball!=null){
				ball=null;
			}
		}
	}

	public SCanvas(Display d) {
		super();
		//初始化参数
		display			=d;
		upsize			=20;
		themenu			=0;
		bdColumn		=9;
		bdRow			=9;
		GamePause		=0;
		GameStart		=1;
		GameOver		=2;
		GameStatus		=0;
		menuy			=20;
		killBall		=5;
		startBall		=5;
		mx				=0;
		my				=10;
		ballNumber		=7;
		bdRand			=new Random();
		ballRand		=new Random();
		bp				=new int[81];
		isFailed		=false;
		score			=0;
		thecol			=0;//临时存储的行索引
		therow			=0;//临时存储的列索引
		thecolor		=0;//临时存储的颜色索引
		isFlash			=false;
		flashIndex		=new int[34];
		for(int i=0;i<flashIndex.length;i+=2){
			if(i%2==0){
				flashIndex[i]=1;
			}else{
				flashIndex[i]=2;
			}
		}

		int[] layerMap={
			1,1,1,1,1,1,1,1,1,
			1,1,1,1,1,1,1,1,1,
			1,1,1,1,1,1,1,1,1,
			1,1,1,1,1,1,1,1,1,
			1,1,1,1,1,1,1,1,1,
			1,1,1,1,1,1,1,1,1,
			1,1,1,1,1,1,1,1,1,
			1,1,1,1,1,1,1,1,1,
			1,1,1,1,1,1,1,1,1
		};
		for(int i=0;i<bp.length;i++){
			bp[i]=0;//初始化当前显示为空
			//bp[i]=Math.abs(ballRand.nextInt()%8);
		}

		try{
			tile	=new TiledLayer(bdColumn,bdRow,Image.createImage("/rect.jpg"),18,18);//棋盘
			balls	=new TiledLayer(bdColumn,bdRow,Image.createImage("/ball.png"),18,18);//显示的小球
			flashcur=new Sprite(Image.createImage("/flashcursor.png"),18,18);//创建闪烁的光标
		}
		catch(IOException e){
			System.err.println("加载图片失败!");
		}
		//设置棋盘
		for(int i=0;i<layerMap.length;i++){
			int column=i%bdColumn;
			int row=(i-column)/bdRow;
			tile.setCell(column,row,layerMap[i]);
		}
		for(int i=0;i<bp.length;i++){
			int column=i%bdColumn;
			int row=(i-column)/bdRow;
			balls.setCell(column,row,bp[i]);
		}
		tile.setPosition(0,0);
		balls.setPosition(0,0);

		menus=new String[4];
		menus[0]="开始游戏";
		menus[1]="游戏排行";
		menus[2]="制作小组";
		menus[3]="退出游戏";

		//建立光标
		cur=new ColorBall(0,72,72);
		flashcur.setPosition(72,72);
		flashcur.setFrameSequence(flashIndex);//设置动画索引序列
		flashcur.setVisible(false);//设为不可见
	}

	//开始
	void start(){
		display.setCurrent(this);
		repaint();
	}

	void placeaball(){
		boolean hasZero=false;
		while(true){
			//System.out.println("-------");
			for(int i=0;i<bp.length;i++){
				int column=i%bdColumn;
				int row=(i-column)/bdRow;
				if(balls.getCell(column,row)==0){
					hasZero=true;
				}
			}
			if(hasZero==false){
				isFailed=true;
				return;
			}
			int col=Math.abs(bdRand.nextInt()%9);
			int row=Math.abs(bdRand.nextInt()%9);
			if(balls.getCell(col,row)==0){
				//System.out.println("rol:"+col+"--row:"+row);
				int cl=Math.abs(ballRand.nextInt()%7)+1;
				//存储当前Cell的行列及颜色
				thecol=col;
				therow=row;
				thecolor=cl;
				balls.setCell(col,row,cl);
				return;
			}
		}
	}

	public void paint(Graphics g){
		//测试随机数
		//Random rd=new Random();
		//System.out.println(Math.abs(rd.nextInt()%81));
		//清理画布
		g.setColor(0,0,0);
		g.fillRect(0,0,getWidth(),getHeight());

		//加载棋盘
		tile.paint(g);

		switch(GameStatus){
			case 0:
				int y=20;
				//绘制游戏菜单
				for(int i=0;i<menus.length;i++){
					if(i==themenu){
						g.setColor(0,0,255);
					}else{
						g.setColor(255,255,255);
					}
					int width=Font.getDefaultFont().getHeight()*4;
					g.drawString(menus[i],getWidth()/2-width/2,y,Graphics.TOP|Graphics.LEFT);
					y+=Font.getDefaultFont().getHeight();
				}
				break;
			case 1:
				//游戏开始
				balls.paint(g);
				if(isFlash)
					flashcur.paint(g);
				cur.paint(g,"/cursor.png",18,18);
				g.setColor(255,255,255);
				int height=tile.getHeight();
				g.drawString("Score:"+score,0,height,Graphics.TOP|Graphics.LEFT);
				break;
			case 2:
				//游戏结束
				g.setColor(255,255,255);
				String gameover="是否要结束游戏?";
				g.drawString(gameover,(getWidth()/2-Font.getDefaultFont().getHeight()*gameover.length()/2),getHeight()/2,Graphics.TOP|Graphics.LEFT);
				break;
			default:
				break;
		}
	}
	
	//小球放下后按规则消掉5个或以上的小球
	int killball(int col,int row,int thecolor){
		int lcol,rcol,urow,drow,lucol,lurow,rdcol,rdrow,rucol,rurow,ldcol,ldrow;
		int hballnum,vballnum,pballnum,nballnum,killedballnum,kb,i,j;
		//横
		lcol=col;
		rcol=col;
		//竖
		urow=row;
		drow=row;
		//捺
		lucol=col;
		lurow=row;
		rdcol=col;
		rdrow=row;
		//撇
		rucol=col;
		rurow=row;
		ldcol=col;
		ldrow=row;
		//各方向小球数
		hballnum=0;
		vballnum=0;
		pballnum=0;
		nballnum=0;
		killedballnum=0;
		kb=0;
		i=0;
		j=0;
		
		//横:先水平左后水平右
		for(i=lcol;i>=0;i--){
			if(balls.getCell(i,row)!=thecolor){
				lcol=i+1;
				break;
			}else if(i==0&&balls.getCell(i,row)==thecolor){
				lcol=0;
				break;
			}
		}
		for(i=rcol;i<=8;i++){
			if(balls.getCell(i,row)!=thecolor){
				rcol=i-1;
				break;
			}else if(i==8&&balls.getCell(i,row)==thecolor){
				rcol=8;
				break;
			}
		}
		//竖:先垂直上后垂直下
		for(i=urow;i>=0;i--){
			if(balls.getCell(col,i)!=thecolor){
				urow=i+1;
				break;
			}else if(i==0&&balls.getCell(col,i)==thecolor){
				urow=0;
				break;
			}
		}
		for(i=drow;i<=8;i++){
			if(balls.getCell(col,i)!=thecolor){
				drow=i-1;
				break;
			}else if(i==8&&balls.getCell(col,i)==thecolor){
				drow=8;
				break;
			}
		}
		//撇:先右上后左下
		if((8-rucol)<=rurow){
			for(i=rucol,j=rurow;i<=8&&j>=0;i++,j--){
				if(balls.getCell(i,j)!=thecolor){
					rucol=i-1;
					rurow=j+1;
					break;
				}else if(i==8&&balls.getCell(i,j)==thecolor){
					rucol=i;
					rurow=j;
					break;
				}
			}
		}else{
			for(i=rucol,j=rurow;i<=8&&j>=0;i++,j--){
				if(balls.getCell(i,j)!=thecolor){
					rucol=i-1;
					rurow=j+1;
					break;
				}else if(j==0&&balls.getCell(i,j)==thecolor){
					rucol=i;
					rurow=j;
					break;
				}
			}
		}
		
		if((8-ldrow)<=ldcol){
			for(i=ldcol,j=ldrow;i>=0&&j<=8;i--,j++){
				if(balls.getCell(i,j)!=thecolor){
					ldcol=i+1;
					ldrow=j-1;
					break;
				}else if(j==8&&balls.getCell(i,j)==thecolor){
					ldcol=i;
					ldrow=j;
					break;
				}
			}
		}else{
			for(i=ldcol,j=ldrow;i>=0&&j<=8;i--,j++){
				if(balls.getCell(i,j)!=thecolor){
					ldcol=i+1;
					ldrow=j-1;
					break;
				}else if(i==0&&balls.getCell(i,j)==thecolor){
					ldcol=i;
					ldrow=j;
					break;
				}
			}
		}
		//捺:先左上后右下
		if(lucol<=lurow){
			for(i=lucol,j=lurow;i>=0&&j>=0;i--,j--){
				if(balls.getCell(i,j)!=thecolor){
					lucol=i+1;
					lurow=j+1;
					break;
				}else if(i==0&&balls.getCell(i,j)==thecolor){
					lucol=i;
					lurow=j;
					break;
				}
			}
		}else{
			for(i=lucol,j=lurow;i>=0&&j>=0;i--,j--){
				if(balls.getCell(i,j)!=thecolor){
					lucol=i+1;
					lurow=j+1;
					break;
				}else if(j==0&&balls.getCell(i,j)==thecolor){
					lucol=i;
					lurow=j;
					break;
				}
			}
		}
		if(rdcol>=rdrow){
			for(i=rdcol,j=rdrow;i<=8&&j<=8;i++,j++){
				if(balls.getCell(i,j)!=thecolor){
					rdcol=i-1;
					rdrow=j-1;
					break;
				}else if(i==8&&balls.getCell(i,j)==thecolor){
					rdcol=i;
					rdrow=j;
					break;
				}
			}
		}else{
			for(i=rdcol,j=rdrow;i<=8&&j<=8;i++,j++){
				if(balls.getCell(i,j)!=thecolor){
					rdcol=i-1;
					rdrow=j-1;
					break;
				}else if(j==8&&balls.getCell(i,j)==thecolor){
					rdcol=i;
					rdrow=j;
					break;
				}
			}
		}
		//计算消失的小球数
		hballnum=rcol-lcol+1;
		vballnum=drow-urow+1;
		pballnum=rucol-ldcol+1;
		nballnum=rdcol-lucol+1;
		if(hballnum>=5){
			killedballnum+=hballnum;
			kb++;
		}
		if(vballnum>=5){
			killedballnum+=vballnum;
			kb++;
		}
		if(pballnum>=5){
			killedballnum+=pballnum;
			kb++;
		}
		if(nballnum>=5){
			killedballnum+=nballnum;
			kb++;
		}
		if(kb==0){
			killedballnum=0;
		}else if(kb==1){
			
		}else if(kb==2){
			killedballnum-=1;
		}else if(kb==3){
			killedballnum-=2;
		}else if(kb==4){
			killedballnum-=3;
		}

		//清除小球
		if(hballnum>=5){
			for(int y=lcol;y<=rcol;y++){
				balls.setCell(y,row,0);
			}
		}
		
		if(vballnum>=5){
			for(int k=urow;k<=drow;k++){
				balls.setCell(col,k,0);
			}
		}
		
		if(pballnum>=5){
			for(i=ldcol,j=ldrow;i<=rucol&&j>=rurow;i++,j--){
				balls.setCell(i,j,0);
			}
		}
		
		if(nballnum>=5){
			for(i=lucol,j=lurow;i<=rdcol&&j<=rdrow;i++,j++){
				balls.setCell(i,j,0);
			}
		}

		return killedballnum;
	}

	//更新分数
	void updatescore(int killedballnumber){
		switch(killedballnumber){
			case 5:
				score+=10;
				break;
			case 6:
				score+=12;
				break;
			case 7:
				score+=18;
				break;
			case 8:
				score+=28;
				break;
			case 9:
				score+=42;//一直线42、非直线60
				break;
			case 10:
				score+=82;
				break;
			case 11:
				score+=108;
				break;
			case 12:
				score+=138;
				break;
			case 13:
				score+=142;
				break;
			case 14:
				score+=146;
				break;
			case 15:
				score+=150;
				break;
			case 16:
				score+=154;
				break;
			case 17:
				score+=158;
				break;
			case 18:
				score+=162;
				break;
			case 19:
				score+=166;
				break;
			case 20:
				score+=170;
				break;
			case 21:
				score+=174;
				break;
			case 22:
				score+=178;
				break;
			case 23:
				score+=182;
				break;
			case 24:
				score+=186;
				break;
			case 25:
				score+=190;
				break;
			case 26:
				score+=194;
				break;
			case 27:
				score+=198;
				break;
			case 28:
				score+=202;
				break;
		}
	}
	
	public void keyPressed(int keyCode){
		//从keyCode获取游戏动作
		//System.out.println(keyCode);
		int action=getGameAction(keyCode);

		if((keyCode==53 || keyCode==-5) && themenu==0 && GameStatus==0){
			//重新开始新的一局
			for(int i=0;i<bp.length;i++){
				int column=i%bdColumn;
				int row=(i-column)/bdRow;
				balls.setCell(column,row,0);
			}
			score=0;
			isFailed=false;
			for(int i=1;i<=5;i++){
				placeaball();
			}
			GameStatus=1;
		}else if((keyCode==-7) && GameStatus==1){
			GameStatus=0;
		}else if((keyCode==53 || keyCode==-5) && themenu==3 && GameStatus==0){
			GameStatus=2;
		}
		//按下向下或向上按钮
		if(GameStatus==GamePause){
			//菜单操作
			switch(action){
				case UP:
					if(--themenu<0)
						themenu=menus.length-1;
					break;
				case DOWN:
					if(++themenu>=menus.length)
						themenu=0;
					break;
			}
		}else if(GameStatus==GameStart){
			//游戏开始后的操作
			switch(action){
				case UP:
					if(cur.y<=0)
						cur.setPosition(cur.x,144);
					else
						cur.y-=18;
					break;
				case DOWN:
					if(cur.y>=144)
						cur.setPosition(cur.x,0);
					else
						cur.y+=18;
					break;
				case LEFT:
					if(cur.x<=0)
						cur.setPosition(144,cur.y);
					else
						cur.x-=18;
					break;
				case RIGHT:
					if(cur.x>=144)
						cur.setPosition(0,cur.y);
					else
						cur.x+=18;
					break;
				case FIRE:
					//选中小球后出现一个闪烁的光标
					if(balls.getCell(cur.x/18,cur.y/18)!=0){
						flashcur.setVisible(true);
						flashcur.setPosition(cur.x,cur.y);
						isFlash=true;
					}
					if(isFlash&&balls.getCell(cur.x/18,cur.y/18)==0){
						int x=balls.getCell(flashcur.getRefPixelX()/18,flashcur.getRefPixelY()/18);
						balls.setCell(flashcur.getRefPixelX()/18,flashcur.getRefPixelY()/18,0);
						balls.setCell(cur.x/18,cur.y/18,x);
						int ballnumber=killball(cur.x/18,cur.y/18,x);
						updatescore(ballnumber);
						flashcur.setVisible(false);
						flashcur.setPosition(cur.x,cur.y);
						if(ballnumber<5){
							for(int i=1;i<=3;i++){
								placeaball();
								int y=killball(thecol,therow,thecolor);
							}
						}
						isFlash=false;
					}
					break;
			}
		}else if(GameStatus==GameOver){
			//游戏结束时的操作
			if(keyCode==53 || keyCode==-5){
				//结束游戏代码
			}else{
				GameStatus=1;
				return;
			}
		}
		repaint();
	}
}

⌨️ 快捷键说明

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