//界面类代码
import javax.microedition.lcdui.Canvas;
import javax.microedition.lcdui.Graphics;
import java.util.*;
import javax.microedition.lcdui.*;
/**
* 连连看游戏界面
*/
public class LinkCanvas extends Canvas implements Runnable{
/**游戏逻辑类*/
GameEngine engine;
/**屏幕宽度*/
int width;
/**屏幕高度*/
int height;
public LinkCanvas(){
//创建对象
engine = new GameEngine();
//获得屏幕的高度和宽度
width = getWidth();
height = getHeight();
//启动线程
Thread t = new Thread(this);
t.start();
}
/**
* 绘制方法
*/
protected void paint(Graphics g) {
//清屏
clearScreen(g);
//绘制地图
engine.paintMap(g);
//绘制选择框
engine.paintSelectArea(g);
//绘制连线
engine.paintLinkLine(g);
}
/**
* 清屏方法
* @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();
break;
case LEFT:
engine.moveLeft();
break;
case RIGHT:
engine.moveRight();
break;
case FIRE:
engine.fire();//选择块
break;
}
}
public void run() {
try{
while(true){
//延时
Thread.sleep(100);
//每次判断逻辑
engine.action();
repaint();
}
}catch(Exception e){
e.printStackTrace();
}
}
}
//逻辑类源代码
/**
* 游戏数据和逻辑类
*/
class GameEngine {
/**选中块的个数*/
private int selectTileNum = 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分别代表十种不同的结构*/
private int[][] map = new int[MAX_ROW][MAX_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;
/**无法连线*/
private 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;
/**
* 两次拐弯的行号和列号
* 数据格式为:
* 第一个拐点的行号,第一个拐点的列号,第二个拐点的行号,第二个拐点的列号
*/
int[] p = new int[4];
public GameEngine(){
//初始化地图数据
initMap();
}
/**
* 初始化地图数据
*/
private void initMap(){
for(int row = 0;row < map.length;row++){
for(int col = 0;col < map[row].length;col++){
map[row][col] = row + 1;
}
}
//循环打乱10次
int tempRow;
int tempCol;
int temp;
for(int i = 0;i < 10;i++){
for(int row = 0;row < map.length;row++){
for(int col = 0;col < map[row].length;col++){
//随机行号
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;
}
}
}
}
}
/**
* 绘制地图数据
* @param g 画笔
*/
public void paintMap(Graphics g){
for(int row = 0;row < map.length;row++){
for(int col = 0;col < map[row].length;col++){
//如果没有数据,则跳过
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);
}
}
}
}
/**
* 绘制选择框
* @param g 画笔
*/
public void paintSelectArea(Graphics g){
//绘制当前选择框
g.setColor(0xff00);
g.drawRect(LEFTX + cCol * TILE_WIDTH, LEFTY + cRow * TILE_HEIGHT, TILE_WIDTH, TILE_HEIGHT);
g.setColor(0);
//绘制选中项
switch(selectTileNum){
case 1: //选择一个
g.setColor(0xff0000);
g.drawRect(LEFTX + firstCol * TILE_WIDTH, LEFTY + firstRow * TILE_HEIGHT, TILE_WIDTH, TILE_HEIGHT);
g.setColor(0);
break;
case 2: //选中两个
g.setColor(0xff0000);
g.drawRect(LEFTX + firstCol * TILE_WIDTH, LEFTY + firstRow * TILE_HEIGHT, TILE_WIDTH, TILE_HEIGHT);
g.drawRect(LEFTX + secondCol * TILE_WIDTH, LEFTY + secondRow * TILE_HEIGHT, TILE_WIDTH, TILE_HEIGHT);
g.setColor(0);
break;
}
}
/**
* 绘制方块连线
* @param g 画笔
*/
public void paintLinkLine(Graphics g){
//如果无连线,则直接返回
if(linkType == NO_LINK){
return;
}
//根据连线类型实现绘制
//绘制到方块的中心点
switch(linkType){
case H_LINK://水平
case V_LINK://垂直
paintLine(g,firstRow,firstCol,secondRow,secondCol);
break;
case ONE_CORNER_FIRSTX://一个拐弯,先移动X
//水平线
paintLine(g,firstRow,firstCol,firstRow,secondCol);
//垂直线
paintLine(g,firstRow,secondCol,secondRow,secondCol);
break;
case ONE_CORNER_FIRSTY://一个拐弯,先移动Y
//水平线
paintLine(g,firstRow,firstCol,secondRow,firstCol);
//垂直线
paintLine(g,secondRow,firstCol,secondRow,secondCol);
break;
case TWO_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);
break;
}
//逻辑代码,清除连接类型
linkType = NO_LINK;
}
/**
* 绘制两个方块中心点的连线
* @param g 画笔
* @param r1 方块1的行号
* @param c1 方块1的列号
* @param r2 方块2的行号
* @param c2 方块2的列号
*/
private void paintLine(Graphics g,int r1,int c1,int r2,int c2){
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);
}
/**
* 向左移动选择框
*/
public void mo
评论0