?? map.java
字號:
/*
* 用戶名 AXL 日 期 2007-7-13 所在公司 常州清華IT
*/
package cn.elva.model;
import java.util.Random;
import cn.elva.Settings;
/**
* @author AXL 數(shù)據(jù)部分,一個內(nèi)部數(shù)組來表示頁面上的具體情況
*/
public class Map
{
public static int LEFTCOUNT = Settings.ROWS * Settings.COLUMNS;
// 讓其最外層的數(shù)據(jù)不顯示,可以解決邊框消除不掉的情況
private int[][] map = new int[Settings.ROWS + 2][Settings.COLUMNS + 2];
// private ArrayPoint prePoint;
// private ArrayPoint currPoint;
// 出現(xiàn)的不同圖片個數(shù)
private int maxKinds = 4;
public Map()
{
init();
}
public int[][] getMap()
{
return map;
}
/**
* 實現(xiàn)了二維數(shù)組的產(chǎn)生
*/
private void init()
{
int[] tempArr = new int[Settings.ROWS * Settings.COLUMNS];
int len = tempArr.length;
// 根據(jù)圖片的種類數(shù)來確定數(shù)組大小,如有64張圖片,每四個為一樣的,則需要圖片數(shù)為64/4=16
for (int i = 0; i < len / maxKinds; i++)
{
tempArr[i * 4] = i + 1;
tempArr[i * 4 + 1] = i + 1;
tempArr[i * 4 + 2] = i + 1;
tempArr[i * 4 + 3] = i + 1;
}
// 打亂一維數(shù)組內(nèi)數(shù)據(jù)的排列
random(tempArr);
// 填充到二維數(shù)組中
for (int i = 1; i < Settings.ROWS + 1; i++)
{
for (int j = 1; j < Settings.COLUMNS + 1; j++)
{
this.map[i][j] = tempArr[(i - 1) * Settings.COLUMNS
+ (j - 1)];
}
}
}
/**
* 將數(shù)組進行重排,使其成無序狀態(tài)
*
* @param array
* 要重排的數(shù)組
*/
private void random(int[] array)
{
Random random = new Random();
int len = array.length;
for (int i = len; i > 0; i--)
{
int j = random.nextInt(i);
int temp = array[i - 1];
array[i - 1] = array[j];
array[j] = temp;
}
}
/**
* 判斷是否在一條直線上,這里不去比較兩者值是否相等,主要用于后面兩個拐點的情況
*
* @param p1
* 之前的點
* @param p2
* 當(dāng)前所點的點
* @return true 相通,false 不通
*/
public boolean oneLineWithoutValue(ArrayPoint p1, ArrayPoint p2)
{
if (horizonMatch(p1, p2))
{
return true;
}
else if (verticalMatch(p1, p2))
{
return true;
}
return false;
}
/**
* 判斷是否在一條直線上,其中包括了垂直和水平兩種情況
*
* @param p1
* 之前的點
* @param p2
* 當(dāng)前所點的點
* @return true 相通,false 不通
*/
public boolean oneLine(ArrayPoint p1, ArrayPoint p2)
{
if (p1.value != p2.value)
{
return false;
}
if (oneLineWithoutValue(p1, p2))
{
return true;
}
return false;
}
/**
* 豎線上的判斷
*
* @param p1
* 之前的點
* @param p2
* 當(dāng)前所點的點
* @return true 相通,false 不通
*/
public boolean verticalMatch(ArrayPoint p1, ArrayPoint p2)
{
if (p1.j != p2.j)
{
return false;
}
if (p1.i > p2.i)
{
ArrayPoint temp = null;
temp = p1;
p1 = p2;
p2 = temp;
}
// 之間的相隔的棋子數(shù)
int spaceCount = p2.i - p1.i;
// 如果相鄰,直接消除
if (spaceCount == 1 && p1.value == p2.value)
{
return true;
}
for (int i = p1.i + 1; i < p2.i; i++)
{
ArrayPoint point = new ArrayPoint(i, p1.j, map[i][p1.j]);
// 只要其值為0就表示沒有棋子
if (point.value != 0)
{
return false;
}
}
return true;
}
/**
* 水平方向的判斷
*
* @param p1
* 之前所選的點
* @param p2
* 當(dāng)前選中的點
* @return true 相通,false 不通
*/
public boolean horizonMatch(ArrayPoint p1, ArrayPoint p2)
{
// 如果行行號不等的話,剛不是水平方向的結(jié)果
if (p1.i != p2.i)
{
return false;
}
if (p1.j > p2.j)
{
ArrayPoint temp = null;
temp = p1;
p1 = p2;
p2 = temp;
}
// 水平相隔棋子數(shù)
int spaceCount = p2.j - p1.j;
// 如果相鄰,直接消除
if (spaceCount == 1 && p1.value == p2.value)
{
return true;
}
for (int i = p1.j + 1; i < p2.j; i++)
{
ArrayPoint p = new ArrayPoint(p1.i, i, map[p1.i][i]);
if (p.value != 0)
{
return false;
}
}
return true;
}
/**
* 判斷前后點擊的是不是同一個點,i,j相同就是一個點
*
* @param p1
* 之前所選的點
* @param p2
* 當(dāng)前選中的點
* @return true 同一個點,false 不同點
*/
private boolean isSameOne(ArrayPoint p1, ArrayPoint p2)
{
if (p1.i == p2.i && p1.j == p2.j)
{
return true;
}
else
{
return false;
}
}
/**
* 帶一個拐點的情況,但不比較值的大小是否相等
*
* @param p1
* 初始點
* @param p2
* 結(jié)束點
* @return true 相通,false 不通
*/
public boolean oneConnerWithoutValue(ArrayPoint p1, ArrayPoint p2)
{
// 獲取P1水平方向的拐點
ArrayPoint p1H = new ArrayPoint(p1.i, p2.j, map[p1.i][p2.j]);
// 獲取P1垂直方向的拐點
ArrayPoint p1V = new ArrayPoint(p2.i, p1.j, map[p2.i][p1.j]);
if (horizonMatch(p1, p1H) && (p1H.value == 0))
{
if (this.verticalMatch(p1H, p2))
{
return true;
}
}
if (verticalMatch(p1, p1V) && (p1V.value == 0))
{
if (horizonMatch(p1V, p2))
{
return true;
}
}
return false;
}
/**
* 帶一個拐點的情況
*
* @param p1
* 初始點
* @param p2
* 結(jié)束點
* @return true 相通,false 不通
*/
public boolean oneConner(ArrayPoint p1, ArrayPoint p2)
{
// 獲取P1水平方向的拐點
ArrayPoint p1H = new ArrayPoint(p1.i, p2.j, map[p1.i][p2.j]);
// 獲取P1垂直方向的拐點
ArrayPoint p1V = new ArrayPoint(p2.i, p1.j, map[p2.i][p1.j]);
if (p1.value != p2.value)
{
return false;
}
if (oneConnerWithoutValue(p1, p2))
{
return true;
}
return false;
}
/**
* 帶兩個拐點的情況,分四個方向走,上下左右,只要一個方向通過,即通過
*
* @param p1
* 初始點
* @param p2
* 結(jié)束點
* @return true 相通,false 不通
*/
public boolean twoConner(ArrayPoint p1, ArrayPoint p2)
{
if (p1.value != p2.value)
{
return false;
}
int count = 0;
ArrayPoint temp = null;
// 左
for (int col = p1.j - 1; col >= 0; col--)
{
temp = new ArrayPoint(p1.i, col, map[p1.i][col]);
if ((temp.value == 0) && this.oneLineWithoutValue(p1, temp))
{
if (this.oneConnerWithoutValue(temp, p2))
{
return true;
}
}
else
{
break;
}
} // 右
count = Settings.COLUMNS + 2 - p1.j;
for (int col = p1.j; col < Settings.COLUMNS + 2; col++)
{
temp = new ArrayPoint(p1.i, col, map[p1.i][col]);
if ((temp.value == 0) && oneLineWithoutValue(p1, temp))
{
if (oneConnerWithoutValue(temp, p2))
{
return true;
}
}
}
// 上
count = p1.i;
for (int row = count - 1; row >= 0; row--)
{
temp = new ArrayPoint(row, p1.j, map[row][p1.j]);
if ((temp.value == 0) && oneLineWithoutValue(p1, temp))
{
if (oneConnerWithoutValue(temp, p2))
{
return true;
}
}
}
// 下
for (int row = p1.i + 1; row < Settings.ROWS + 2; row++)
{
temp = new ArrayPoint(row, p1.j, map[row][p1.j]);
if ((temp.value == 0) && oneLineWithoutValue(p1, temp))
{
if (oneConnerWithoutValue(temp, p2))
{
return true;
}
}
}
//
return false;
}
/**
* 判斷兩點是否匹配,包括直線,一個拐點,兩個拐點三種情況
*
* @param p1
* 初始點
* @param p2
* 結(jié)束點
* @return true 相通,false 不通
*/
public boolean match(ArrayPoint p1, ArrayPoint p2)
{
if (this.isSameOne(p1, p2))
{
return false;
}
if (oneLine(p1, p2))
{
map[p1.i][p1.j] = 0;
map[p2.i][p2.j] = 0;
LEFTCOUNT -= 2;
return true;
}
if (oneConner(p1, p2))
{
map[p1.i][p1.j] = 0;
map[p2.i][p2.j] = 0;
LEFTCOUNT -= 2;
return true;
}
if (twoConner(p1, p2))
{
map[p1.i][p1.j] = 0;
map[p2.i][p2.j] = 0;
LEFTCOUNT -= 2;
return true;
}
return false;
}
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -