连连看J2ME源代码Word格式文档下载.docx
《连连看J2ME源代码Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《连连看J2ME源代码Word格式文档下载.docx(22页珍藏版)》请在冰豆网上搜索。
*清屏方法
*@paramg画笔
privatevoidclearScreen(Graphicsg){
g.setColor(0xffffff);
g.fillRect(0,0,width,height);
g.setColor(0);
publicvoidkeyPressed(intkeyCode){
intaction=getGameAction(keyCode);
switch(action){
caseUP:
engine.moveUP();
break;
caseDOWN:
engine.moveDown();
caseLEFT:
engine.moveLeft();
caseRIGHT:
engine.moveRight();
caseFIRE:
engine.fire();
//选择块
publicvoidrun(){
try{
while(true){
//延时
Thread.sleep(100);
//每次判断逻辑
engine.action();
repaint();
}catch(Exceptione){
e.printStackTrace();
//逻辑类源代码
importjava.util.*;
importjavax.microedition.lcdui.*;
*游戏数据和逻辑类
publicclassGameEngine{
/**选中块的个数*/
privateintselectTileNum=0;
//第一个选择块的行号和列号
/**行号*/
privateintfirstRow;
/**列号*/
privateintfirstCol;
//第二个选择块的行号和列号
privateintsecondRow;
privateintsecondCol;
//当前选择框,默认在左上角
/**当前选择框的行号*/
privateintcRow;
/**当前选择框的列号*/
privateintcCol;
/**最大行数*/
privatefinalintMAX_ROW=10;
/**最大列数*/
privatefinalintMAX_COL=10;
/**地图数据,0代表空,数据1-10分别代表十种不同的结构*/
privateint[][]map=newint[MAX_ROW][MAX_COL];
/**随机数对象*/
privateRandomran=newRandom();
//地图区域左上角的坐标
privatefinalintLEFTX=20;
privatefinalintLEFTY=50;
/**每个单元格的宽度*/
privatefinalintTILE_WIDTH=20;
/**每个单元格的高度*/
privatefinalintTILE_HEIGHT=20;
/**连线类型*/
privateintlinkType;
/**无法连线*/
privatefinalintNO_LINK=0;
/**水平连线*/
privatefinalintH_LINK=1;
/**垂直联系*/
privatefinalintV_LINK=2;
/**一个拐点,先移动x*/
privatefinalintONE_CORNER_FIRSTX=3;
/**一个拐点,先移动y*/
privatefinalintONE_CORNER_FIRSTY=4;
/**两个拐点,待完善*/
privatefinalintTWO_CORNER=5;
*两次拐弯的行号和列号
*数据格式为:
*第一个拐点的行号,第一个拐点的列号,第二个拐点的行号,第二个拐点的列号
int[]p=newint[4];
publicGameEngine(){
//初始化地图数据
initMap();
*初始化地图数据
privatevoidinitMap(){
for(introw=0;
row<
map.length;
row++){
for(intcol=0;
col<
map[row].length;
col++){
map[row][col]=row+1;
//循环打乱10次
inttempRow;
inttempCol;
inttemp;
for(inti=0;
i<
10;
i++){
//随机行号
tempRow=Math.abs(ran.nextInt()%10);
//随机列号
tempCol=Math.abs(ran.nextInt()%10);
//如果不是同一个单元格,则交换数据
if(!
((tempRow==row)&
&
(tempCol==col))){
temp=map[row][col];
map[row][col]=map[tempRow][tempCol];
map[tempRow][tempCol]=temp;
*绘制地图数据
publicvoidpaintMap(Graphicsg){
//如果没有数据,则跳过
if(map[row][col]==0){
continue;
}else{//绘制方块
//绘制方框
g.drawRect(LEFTX+col*TILE_WIDTH,LEFTY+row*TILE_HEIGHT,TILE_WIDTH,TILE_HEIGHT);
//绘制数字
g.drawString(String.valueOf(map[row][col]),LEFTX+col*TILE_WIDTH+5,
LEFTY+row*TILE_HEIGHT+4,
Graphics.TOP|Graphics.LEFT);
*绘制选择框
publicvoidpaintSelectArea(Graphicsg){
//绘制当前选择框
g.setColor(0xff00);
g.drawRect(LEFTX+cCol*TILE_WIDTH,LEFTY+cRow*TILE_HEIGHT,TILE_WIDTH,TILE_HEIGHT);
//绘制选中项
switch(selectTileNum){
case1:
//选择一个
g.setColor(0xff0000);
g.drawRect(LEFTX+firstCol*TILE_WIDTH,LEFTY+firstRow*TILE_HEIGHT,TILE_WIDTH,TILE_HEIGHT);
case2:
//选中两个
g.drawRect(LEFTX+secondCol*TILE_WIDTH,LEFTY+secondRow*TILE_HEIGHT,TILE_WIDTH,TILE_HEIGHT);
*绘制方块连线
publicvoidpaintLinkLine(Graphicsg){
//如果无连线,则直接返回
if(linkType==NO_LINK){
return;
//根据连线类型实现绘制
//绘制到方块的中心点
switch(linkType){
caseH_LINK:
//水平
caseV_LINK:
//垂直
paintLine(g,firstRow,firstCol,secondRow,secondCol);
caseONE_CORNER_FIRSTX:
//一个拐弯,先移动X
//水平线
paintLine(g,firstRow,firstCol,firstRow,secondCol);
//垂直线
paintLine(g,firstRow,secondCol,secondRow,secondCol);
caseONE_CORNER_FIRSTY:
//一个拐弯,先移动Y
paintLine(g,firstRow,firstCol,secondRow,firstCol);
paintLine(g,secondRow,firstCol,secondRow,secondCol);
caseTWO_CORNER:
//块1到第一个拐点的连线
paintLine(g,firstRow,firstCol,p[0],p[1]);
//两个拐点之间的连线
paintLine(g,p[0],p[1],p[2],p[3]);
//第二个拐点到块2的连线
paintLine(g,p[2],p[3],secondRow,secondCol);
//逻辑代码,清除连接类型
linkType=NO_LINK;
*绘制两个方块中心点的连线
*@paramr1方块1的行号
*@paramc1方块1的列号
*@paramr2方块2的行号
*@paramc2方块2的列号
privatevoidpaintLine(Graphicsg,intr1,intc1,intr2,intc2){
g.drawLine(LEFTX+c1*TILE_WIDTH+TILE_WIDTH/2,
LEFTY+r1*TILE_HEIGHT+TILE_HEIGHT/2,
LEFTX+c2*TILE_WIDTH+TILE_WIDTH/2,
LEFTY+r2*TILE_HEIGHT+TILE_HEIGHT/2);
*向左移动选择框
publicvoidmoveLeft(){
if(cCol>
0){
cCol--;
*向右移动选择框
publicvoidmoveRight(){
if(cCol<
MAX_COL-1){
cCol++;
*向上移动选择框
publicvoidmoveUP(){
if(cRow>
cRow--;
*向下移动选择框
publicvoidmoveDown(){
if(cRow<
MAX_ROW-1){
cRow++;
*确定键逻辑处理
publicvoidfire(){
//如果选择的块为空,则直接返回
if(map[cRow][cCol]==0){
//选中的块的数量增加1
selectTileNum++;
//判别存储位置
//第一次选择
firstRow=cRow;
firstCol=cCol;
//第二次选择
//选择同一个块,2个选择块都失去选中
if((firstRow==cRow)&
(firstCol==cCol)){
selectTileNum=0;
secondRow=cRow;
secondCol=cCol;
*判断(r1,c1)块和(r2,c2)块中间是否为空行
*不包含这两个块
*@paramr1块1的行号
*@paramc1块1的列号
*@paramr2块2的行号
*@paramc2块2的列号
*@returntrue代表为空,false代表不为空
privatebooleanisEmptyRow(intr1,intc1,intr2,intc2){
//判断是否位于同一行
if(r1!
=r2){
returnfalse;
//判断两个块的相对位置
if(c1>
c2){//第一块位于右侧
for(intcol=c1-1;
col>
c2;
col--){
//如果有非空块
if(map[r1][col]!
=0){
}else{//第一块位于左侧
for(intcol=c2-1;
c1;
returntrue;
*判断块(r1,c1)和块(r2,c2)之间是否是空列
privatebooleanisEmptyCol(intr1,intc1,intr2,intc2){
//判断是否位于同一列
if(c1!
=c2){
if(r2>
r1){//第一个块在上方
for(introw=r1+1;
r2;
if(map[row][c1]!
}else{//第二个块在上方
for(introw=r2+1;
r1;
*判断一个块是否为空
*@paramr块的行号
*@paramc块的列号
*@returntrue代表为空,false代表不空
privatebooleanisEmptyCell(intr,intc){
returnmap[r][c]==0;
*是否是一次转弯实现连线
*@returnNO_LINK代表没有连线,其他值代表对应的连线类型
privateintisOneCornerLink(intr1,intc1,intr2,intc2){
//先移动行,再移动列
if(isEmptyCell(r1,c2)){//转折点为空
if(isEmptyRow(r1,c1,r1,c2)&
isEmptyCol(r1,c2,r2,c2)){
returnONE_CORNER_FIRSTX;
//先移动列,再移动行
if(isEmptyCell(r2,c1)){//转折点为空
if(isEmptyCol(r1,c1,r2,c1)&
isEmptyRow(r2,c1,r2,c2)){
returnONE_CORNER_FIRSTY;
//无连接
returnNO_LINK;
*是否经过2次转折实现连接
*@returntrue代表可以连接,false代表不能
privatebooleanisTwoCornerLink(intr1,intc1,intr2,intc2){
intresult;
//正常情况,划分成4个方向
//块1向上
for(introw=r1-1;
row>
=0;
row--){
//如果有数据不为空,则直接结束该方向的尝试
//存储第一个拐点的坐标
p[0]=row;
p[1]=c1;
//每次都尝试转折,则变成一个转点的操作
result=isOneCornerLink(row,c1,r2,c2);
//如果可以连接
if(result!
=NO_LINK){
//存储第二个拐点的位置
switch(result){
p[2]=row;
p[3]=c2;
p[2]=r2;
p[3]=c1;
//块1向下
MAX_ROW;
//块1向左
for(intcol=c1-1;
p[0]=