五子棋人人對戰

費力我好大的勁我終於搞定五子棋人人對戰了,關於五子棋人人對戰對於我來說,最頭疼的是斜線連珠問題,我開始用了兩個for循環,可是怎麼也搞不出來,於是就用一個for循環,竟然出來了,無語啊。這是喜劇還是悲劇啊。
對於人人對戰我感覺我們還是在練習重繪以及實例化,思路如下:
1:在接口中定義了五子棋的一些基本常量,
2:畫五子棋棋板以及畫棋子,最關鍵的是重繪的問題,其實在這裏我用最不熟練的就是返回值的問題,關於返回值我有一個比較形象的比喻,就是:一個東西在盒子裏,我們得把它拿出來才能用啊。
3:判斷輸贏,橫縱是很好判斷的,但是斜線就有點考驗腦細胞了,用一個for循環就可以搞定。
這是關於判斷輸贏的類:
public class Win {
// 定義一個數組屬性
private int[][] data;

/**
* 定義一個帶參數的構造器
*/
public Win(int[][] data) {
this.data = data;

}

/**
* 定義四個不同的方法來判斷輸贏
*/
public boolean winRow(int r, int c) {
// 用來標記輸贏的狀態
boolean state = false;

int count = 1;// 計數器從一開始
int value = data[r][c];// 取出單元格的座標
// 循環二維數組的列,往右判斷
for (int j = c + 1; j < data[r].length; j++) {
// 如果棋子是同一個顏色,則計數器加一
if (value == data[r][j]) {
count++;
} else
break;

}
for (int j = c - 1; j >= 0; j--) {
if (value == data[r][j]) {
count++;
} else
break;
}

// 判斷計數器是否爲五,如果是就五子連珠,贏了
if (count >= 5) {
state = true;
}
return state;
}

public boolean winColumn(int r, int c) {
// 用來標記輸贏的狀態
boolean state = false;
int count = 1;

int value = data[r][c];// 取出座標
// 循環二維數組的行,往下判斷
for (int i = r + 1; i < data[c].length; i++) {
// 如果是同一顏色則計數器加一
if (value == data[i][c]) {
count++;
} else
break;
}
for (int i = r - 1; i >= 0; i--) {
// 如果是同一顏色則計數器加一
if (value == data[i][c]) {
count++;
} else
break;
}
if (count >= 5) {
state = true;
}
return state;

}

public boolean winLeft(int r, int c) {
// 用來標記輸贏的
boolean state = false;
int count1 = 1;
int count2 = 1;
// int value = data[r][c];// 取出座標
// // 循環
// for (int i = c + 1; i < data[r].length; i++) {
// for (int j = r + 1; j < data[c].length; j++) {
// if (value == data[i][j]) {
// count1++;
// } else
// break;
// }
// }
// for (int i = c - 1; i >= 0; i--) {
// for (int j = r - 1; j >= 0; j--) {
// if (value == data[i][j]) {
// count2++;
// } else
// break;
// }
// }
// if ((count1 + count2) >= 5) {
// state = true;
// }
int value = data[r][c];// 取出座標
for (int j = c + 1, i = r + 1; j < data[r].length && i < data[c].length; j++, i++) {
if (value == data[i][j]) {
count1++;

} else
break;
}
for (int j = c - 1, i = r - 1; j >= 0 && i >= 0; j--, i--) {
if (value == data[i][j]) {
count2++;
}
}
if ((count1 + count2) >= 5) {
state = true;
}

return state;

}

public boolean winRight(int r, int c) {
boolean state = false;
int count1 = 1;
int count2 = 1;
int value = data[r][c];
for (int j = c + 1, i = r - 1; j < data[r].length && i >= 0; j++, i--) {
if (value == data[i][j]){
count1++;
}
}
for (int j = c - 1, i = r + 1; j >= 0 && i < data[c].length; j--, i++) {
if (value == data[i][j]) {
count2++;

}
}
if ((count1 + count2) >= 5) {
state = true;
}

return state;
}
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章