1、* 清屏方法* param g 画笔private void clearScreen(Graphics g)g.setColor(0xffffff);g.fillRect(0, 0, width, height);g.setColor(0);public void keyPressed(int keyCode)int action = getGameAction(keyCode);switch(action)case UP:engine.moveUP();break;case DOWN:engine.moveDown();case LEFT:engine.moveLeft();case RIG
2、HT:engine.moveRight();case FIRE:engine.fire(); /选择块public void run() trywhile(true)/延时Thread.sleep(100);/每次判断逻辑engine.action();repaint();catch(Exception e)e.printStackTrace();/逻辑类源代码import java.util.*;import javax.microedition.lcdui.*;* 游戏数据和逻辑类public class GameEngine /*选中块的个数*/private int selectTil
3、eNum = 0;/第一个选择块的行号和列号/*行号*/private int firstRow;/*列号*/private int firstCol;/第二个选择块的行号和列号private int secondRow;private int secondCol;/当前选择框,默认在左上角/*当前选择框的行号*/private int cRow;/*当前选择框的列号*/private int cCol;/*最大行数*/private final int MAX_ROW = 10;/*最大列数*/private final int MAX_COL = 10;/*地图数据,0代表空,数据1-10
4、分别代表十种不同的结构*/private int map = new intMAX_ROWMAX_COL;/*随机数对象*/private Random ran = new Random();/地图区域左上角的坐标private final int LEFTX = 20;private final int LEFTY = 50;/*每个单元格的宽度*/private final int TILE_WIDTH = 20;/*每个单元格的高度*/private final int TILE_HEIGHT = 20;/*连线类型*/private int linkType;/*无法连线*/priva
5、te final int NO_LINK = 0;/*水平连线*/private final int H_LINK = 1;/*垂直联系*/private final int V_LINK = 2;/*一个拐点,先移动x*/private final int ONE_CORNER_FIRSTX = 3;/*一个拐点,先移动y*/private final int ONE_CORNER_FIRSTY = 4;/*两个拐点,待完善*/private final int TWO_CORNER = 5;* 两次拐弯的行号和列号* 数据格式为:* 第一个拐点的行号,第一个拐点的列号,第二个拐点的行号,第
6、二个拐点的列号int p = new int4;public GameEngine()/初始化地图数据initMap();* 初始化地图数据private void initMap()for(int row = 0; row map.length; row+)for(int col = 0; col maprow.length; col+)maprowcol = row + 1;/循环打乱10次int tempRow;int tempCol;int temp;for(int i = 0; i 0)cCol-;* 向右移动选择框public void moveRight()if(cCol cRo
7、w-;* 向下移动选择框public void moveDown()if(cRow c2) /第一块位于右侧for(int col = c1 - 1; col c2; col-)/如果有非空块if(mapr1col != 0)else /第一块位于左侧for(int col = c2 - 1; c1;return true;* 判断块(r1,c1)和块(r2,c2)之间是否是空列private boolean isEmptyCol(int r1,int c1,int r2,int c2)/判断是否位于同一列if(c1 != c2)if(r2 r1)/第一个块在上方for(int row = r
8、1 + 1; r2;if(maprowc1 !else/第二个块在上方for(int row = r2 + 1; r1;* 判断一个块是否为空* param r 块的行号* param c 块的列号* return true代表为空,false代表不空private boolean isEmptyCell(int r,int c)return maprc = 0;* 是否是一次转弯实现连线* return NO_LINK代表没有连线,其他值代表对应的连线类型private int isOneCornerLink(int r1,int c1,int r2,int c2)/先移动行,再移动列if(
9、isEmptyCell(r1,c2) /转折点为空if(isEmptyRow(r1,c1,r1,c2) & isEmptyCol(r1,c2,r2,c2)return ONE_CORNER_FIRSTX;/先移动列,再移动行if(isEmptyCell(r2,c1)/转折点为空if(isEmptyCol(r1,c1,r2,c1) & isEmptyRow(r2,c1,r2,c2) return ONE_CORNER_FIRSTY;/无连接return NO_LINK;* 是否经过2次转折实现连接* return true代表可以连接,false代表不能private boolean isTwo
10、CornerLink(int r1,int c1,int r2,int c2)int result;/正常情况,划分成4个方向/块1向上for(int row = r1 -1; row = 0; row-)/如果有数据不为空,则直接结束该方向的尝试/存储第一个拐点的坐标p0 = row;p1 = c1;/每次都尝试转折,则变成一个转点的操作result = isOneCornerLink(row,c1,r2,c2);/如果可以连接if(result != NO_LINK)/存储第二个拐点的位置switch(result)p2 = row;p3 = c2;p2 = r2;p3 = c1;/块1向下 MAX_ROW;/块1向左for(int col = c1 -1;p0 =
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1