📄 twins.java
字号:
/* * To change this template, choose Tools | Templates * and open the template in the editor. */package Twins;import javax.microedition.midlet.*;import javax.microedition.lcdui.*;import javax.microedition.*;import java.util.Random;import javax.microedition.lcdui.game.TiledLayer;/** * * @author Null */public class Twins implements Runnable{ private static Random Rnd =new Random(System.currentTimeMillis());//随机数生产成器 private Ant Map[][]=new Ant[8][8]; public TwinsCanvas Root; //父 private Thread thread = null; //用来更新地图数据的,制造动态效果。 private Image Background; //背景 private Image ShowScore; //显示成绩框 private Image Img[]=new Image[2]; //元素图 private TiledLayer TLImg[]=new TiledLayer[2]; //元素图层 private Image BtnImg; //按钮图片 private TiledLayer TLImgBtn; //按钮图层 private int BtnID=-1; //被按下按钮的序号,-1 时没有按下 private boolean IF=true; //是否刷新屏幕。暂时被屏蔽了 private int Score; //当前得分 public static int TotalTime=180; //比赛时间,秒 public static int GraphID; //元素类型 private long StartTime; //开始时间截 private int UseTime; //使用时间 private boolean IsFinish; //是否达到指定分数或时间已经结束 private boolean RunThread=false; //控制动作执行 private boolean IsLockInput; //等待的时候锁住用户输入 //初始化,用于图片载入 Twins() { Background=loadImage("/Images/Pool2.png"); ShowScore=loadImage("/Images/ShowScore.png"); Img[0]=loadImage("/Images/Graph-QQ.png"); Img[1]=loadImage("/Images/Graph-System.png"); TLImg[0]=new TiledLayer(10,10,Img[0],24,24); TLImg[1]=new TiledLayer(10,10,Img[1],24,24); BtnImg=loadImage("/Images/Button.png"); TLImgBtn=new TiledLayer(2,2,BtnImg,60,25); TLImgBtn.setPosition(24, 240); for (int i = 0; i < 8; i++) { for (int j = 0; j < 8; j++) { Map[i][j]=new Ant(); } } thread = new Thread(this); thread.start(); NewGame(); } //开始新游戏,用于初始化以及产生新的地图 public void NewGame() { IsFinish=true; Score=0; StartTime=System.currentTimeMillis(); UseTime=0; NewMap(); IsFinish=false; Ant.TipsTimes=4; Score=0; } //产生新的地图,用于游戏开始以及无解的时候使用 private void NewMap() { for (int i = 0; i < 8; i++) { for (int j = 0; j < 8; j++) { Map[i][j].ID = (byte)Rnd.nextInt(6); } } while(FindSeries()) { MoveMap(); //System.out.println("发现先天连续,正在消去。"); } if (FindWay()==false) { NewMap(); } } //初始化场景,用于绘制背景,分数,进度条等信息 private void InitCanvas(Graphics g) { g.drawImage(Background, 0, 0, 0); g.setColor(255,255,255); g.drawString("得分:" + Score + " "+Clock(),25,220,0); ShowTips(g); g.setColor(255,255,255); g.drawRect(8, 24, 8, 191); g.drawRect(8+192+24, 24, 8, 191); int k; if(UseTime >=TotalTime) { k=190; }else { k=UseTime * 190 /TotalTime; } k=190-k; if(k<50 && Ant.IsShowBox<3) { }else { if(k>50) { g.setColor(0,255,0); }else { g.setColor(255,0,0); } g.fillRect(9, 25+190-k, 7, k); } //g.drawRect(OX-1,OY-1,192+1,192+1); //g.drawRect(OX-2,OY-2,192+3,192+3); ShowButton(g); } //显示按钮 private void ShowButton(Graphics g) { for (int i=0;i<2;i++) { for(int j=0;j<2;j++) { TLImgBtn.setCell(j, i, i*2+j+1); } } switch(BtnID) { case 0: TLImgBtn.setCell(0, 0, 5); break; case 1: TLImgBtn.setCell(1, 0, 6); break; case 2: TLImgBtn.setCell(0, 1, 7); break; case 3: TLImgBtn.setCell(1, 1, 8); break; default: } BtnID=-1; TLImgBtn.paint(g); } //答应地图,将地图用图形化反映出来 private void PainMap(Graphics g) { for(int y=0;y<8;y++) { for(int x=0;x<8;x++) { if(Ant.SeriesMapShowd==false && Map[x][y].IsSerie) { g.fillRect(Ant.OX + y * Ant.GW, Ant.OY + x * Ant.GH, Ant.OX - 1, Ant.OY - 1); } if(Ant.IsMoving==true && Map[x][y].IsSerie==true) { TLImg[GraphID].setCell(y+1, x+1, 0); }else { TLImg[GraphID].setCell(y+1, x+1, Map[x][y].ID+1); } } } TLImg[GraphID].paint(g); Ant.SeriesMapShowd=true; if(IsFinish==false && (Ant.IsShowBox<4 ||Ant.IsPressOKKey)) { //显示当前位置 g.setColor(255, 0, 0); g.drawRect(Ant.OX + Ant.CurX * Ant.GW, Ant.OY + Ant.CurY * Ant.GH, Ant.OX - 1, Ant.OY - 1); } } //废弃的入口函数 public void Pain(Graphics g) { InitCanvas(g); //NewMap(); PainMap(g); //FindWay(); while(FindSeries()) { MoveMap(); //System.out.println("发现先天连续,正在消去。"); } PainMap(g); } //刷新函数,整个类的外部接口,只用来显示数据,不包含动作 public void Flush(Graphics g) { IF=true; Ant.IsShowBox++; Ant.IsShowBox=Ant.IsShowBox % 6; if(IF==false) { return; } IF=false; //开始更新。 InitCanvas(g); //NewMap(); PainMap(g); if(IsFinish) { g.setColor(255, 0, 0); g.drawImage(ShowScore, 40, 40, 0); g.drawString("得分: "+Score , 50, 140, 0); if(TotalTime==180) { Record.Save(Score); } } //System.out.println("更新屏幕完成。"); } //手写笔按下的动作,在这里传入的是坐标,动作激发函数 public boolean Press(int x,int y) { Ant.IsShowTips=false; BtnID=-1; if(x>=24 && x<=144 && y>=240 && y<=290)//按钮入口 { IF=true; //RunThread=true; if(x<=24+60) { if(y<=240+25) { BtnID=0; }else { BtnID=2; } }else { if(y<=240+25) { BtnID=1; }else { BtnID=3; } } if(BtnID!=-1) { DoCommand(BtnID); } return true; } x-=Ant.OX; y-=Ant.OY; if(x<0 || y<0) { return false; } x=x/Ant.GW; y=y/Ant.GH; if(x==Ant.AX && y==Ant.AY ||x>7 || y>7 ||x<0 || y<0)//过滤图片不在的位置 { return false; } if(IsFinish || IsLockInput) { return false; } Ant.CurX=x; Ant.CurY=y; Ant.BX=x; Ant.BY=y; IF=true; RunThread=true; return true; } public void KeyPress(int KeyCode) { Ant.IsShowTips=false; if(IsFinish && (KeyCode!=-5 ||KeyCode!=55)) { NewGame(); return; } if(IsFinish || IsLockInput) { return; } boolean NoMoveBox=false;//检查是否碰壁移动,这种移动是无效的 switch (KeyCode) { case -1:case 50: //上 Ant.CurY--; if (Ant.CurY<0) { Ant.CurY=0; NoMoveBox=true; } break; case -2:case 56 ://下 Ant.CurY++; if (Ant.CurY>7) { NoMoveBox=true; Ant.CurY=7; } break; case -3:case 52://左 Ant.CurX--; if (Ant.CurX<0) { NoMoveBox=true; Ant.CurX=0; } break; case -4:case 54://右 Ant.CurX++; if (Ant.CurX>7) { NoMoveBox=true; Ant.CurX=7; } break; case -5:case 55://确定 NoMoveBox=true; if(Ant.IsPressOKKey) { Ant.IsPressOKKey=false; return; } break; default: return; } if(NoMoveBox==false) { Ant.AX=Ant.BX; Ant.AY=Ant.BY; Ant.BX=Ant.CurX; Ant.BY=Ant.CurY; } if(Ant.IsPressOKKey) { IF=true; RunThread=true; Ant.IsPressOKKey=false; } if(KeyCode==-5 ||KeyCode==55) { Ant.IsPressOKKey=!Ant.IsPressOKKey; } } //执行命令 public void DoCommand(int CmdID) { switch(CmdID) { case 0://NewGame NewGame(); break; case 1://Tips Ant.TipsTimes--; if(Ant.TipsTimes>0) { Ant.IsShowTips=true; } break; case 2://Return //Root.Root.getForm(). Root.Root.getDisplay().setCurrent(Root.Root.getForm()); break; case 3://Exit Root.Root.exitMIDlet(); break; } } //搜寻是否存在路径,当找到一个后,记录他的地图坐标 private boolean FindWay() { int i; int j; // : // | 情况 for (i = 0; i <= 4; i++) { for (j = 0; j <= 7; j++) { if (Map[i][j].ID == Map[i + 2][j].ID && Map[i][j].ID == Map[i + 3][j].ID) { //[i][j]; //[i+1][j]; Ant.Tips[0][0]=(byte)i; Ant.Tips[0][1]=(byte)j; Ant.Tips[1][0]=(byte)(i+1); Ant.Tips[1][1]=(byte)j; //System.out.println("1"); return true; } } } //_ // | 情况 for (i = 0; i <= 5; i++) { for (j = 0; j <= 6; j++) { if (Map[i][j].ID == Map[i + 2][j + 1].ID && Map[i][j].ID == Map[i + 1][j + 1].ID) { //[i][j]; //[i][j + 1); Ant.Tips[0][0]=(byte)i; Ant.Tips[0][1]=(byte)j; Ant.Tips[1][0]=(byte)(i); Ant.Tips[1][1]=(byte)(j+1); //System.out.println("2"); return true; } } } // _ //| 情况 for (i = 0; i <= 5; i++) { for (j = 1; j <= 7; j++) { if (Map[i][j].ID == Map[i + 2][j - 1].ID && Map[i][j].ID == Map[i + 1][j - 1].ID) { //[i][j]; //[i][j - 1); Ant.Tips[0][0]=(byte)i; Ant.Tips[0][1]=(byte)j; Ant.Tips[1][0]=(byte)(i); Ant.Tips[1][1]=(byte)(j-1); //System.out.println("3"); return true; } } } //| //: 情况 for (i = 3; i <= 7; i++) { for (j = 0; j <= 7; j++) { if (Map[i][j].ID == Map[i - 2][j].ID && Map[i][j].ID == Map[i - 3][j].ID)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -