连连看J2ME源代码Word格式文档下载.docx

上传人:b****5 文档编号:21766155 上传时间:2023-02-01 格式:DOCX 页数:22 大小:18.75KB
下载 相关 举报
连连看J2ME源代码Word格式文档下载.docx_第1页
第1页 / 共22页
连连看J2ME源代码Word格式文档下载.docx_第2页
第2页 / 共22页
连连看J2ME源代码Word格式文档下载.docx_第3页
第3页 / 共22页
连连看J2ME源代码Word格式文档下载.docx_第4页
第4页 / 共22页
连连看J2ME源代码Word格式文档下载.docx_第5页
第5页 / 共22页
点击查看更多>>
下载资源
资源描述

连连看J2ME源代码Word格式文档下载.docx

《连连看J2ME源代码Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《连连看J2ME源代码Word格式文档下载.docx(22页珍藏版)》请在冰豆网上搜索。

连连看J2ME源代码Word格式文档下载.docx

  *清屏方法

  *@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]=

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 外语学习 > 英语学习

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1