📄 scanvas.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 + -