鏈接:https://zhuanlan.zhihu.com/p/36120496
來源:知乎
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。
完成五子棋先想想你要什么
1一個界面
2.下棋子
3.判斷輸贏
4.人機對戰
第一部分 畫一個棋盤
1.要一個界面來放棋盤
2有一個功能選擇區域習慣上他應該在最右邊
3.最好上面要有畫好的格子
起碼大概就是這樣一副畫面

先想想要什么類
1.Jpanel
2.JFrame
3.JButton
4.Jlabel
5.1ButtonGroup//用來裝單選框並且只讓其中一個被選擇
5.JRadioButton()
6Color
7mouselister
8actonmlister
。。。。自己在多想想
首先吧這回個界面規划出來
我會選擇用墨的棋盤類來繼承Jpanel為了重繪的需要
step1 創建一個窗口類
step2 建立本類對象
step3 設置邊框布局
step4 添加按鈕
step1 名字 +大小
step2 讓初始化被選項目
step5 把組建按部就班的按倒窗口上
step6 畫棋盤
簡易自己寫一個接口把要用的通用值存起來
package 五子棋0422;
public interface net {
public static final int x0=35
}
一個類可以繼承多個接口如果沒有static的話就可能重名
復習一下里面的public 共有的
被static修飾的成員變量和成員方法獨立於該類的任何對象。也就是說,它不依賴類特定的實例,被類的所有實例共享
只要這個類被加載,Java虛擬機就能根據類名在運行時數據區的方法區內定找到他們。因此,static對象可以在它的任何對象創建之前訪問,無需引用任何對象,不需要實例化類就已經存在的屬性。並且被共享
用此類來記錄初始坐標和大小以及條數

由此可以寫出循環
for(int i=0;i<line;i++){
// 畫網格
g2.drawLine(x0 + i * size, y0, x0 + i * size, y0 + line * size);
// 橫軸每次向后加一個間隔,縱坐標加為長度;
g2.drawLine(x0, y0 + i * size, x0 + line * size, y0 + i * size);
// 縱軸軸每次向后加一個間隔,橫坐標加為長度;
把方法方放到重回里+畫棋子方法
第二部分
添加上監聽器
監聽器需要繼承
鼠標和事件監聽器
可以直接繼承actionapet類
此時在次監聽器類里需要接收Jpanel'的畫筆以及接收到Jpanel的數組信息
private Mypanel **實例化一個棋盤
並且在構造函數的時候順便傳值
給相應組建添加監聽器
此時我們先不考慮怎么實現功能
先考慮怎么讓電腦把棋子畫板的固定焦點上

左上的坐標應該是本框行和列
右上應該是左加一
左下其實是在下一行
右下在下一行下一列
我們給每一個星星都加上啊邊框
如果如果邊框超過行列就加一

這樣就可以畫爭取的坐標
現在得到了棋盤我們考慮用一個而且為數組來存儲棋子的橫縱坐標 也可用來標記棋子的顏色是否有下棋子
接下來你可以來標記 自己的棋子顏色每下一次改變
並且用數組來記錄
第三部分
實現功能
1.點擊開始給畫板添加監聽器
2.點擊模式選擇人機對戰
3.完成檢查機制
一共有8個方向

public check(int X int Y){
//判斷便利數組
for(int i=0;i<length;i++ ){
for(int j=y;j++;){
向右
if(chessarry[i+1][j]){
比較顏色
1如果等於零跳出
2如果顏色不同跳出
3如果顏色相同+1
最結果輸出count
}
}
}
一共八個方向
}
1如果結果是5的畫輸出默契獲勝
這里直接調用JOptionPane.showMessageDialog輸出
這是簡單的人人對戰
最后是人機對戰
第一階段用到的是權值算法算法
https://chessprogramming.wikispaces.com/Principal+variation這里有一個權值算法的介紹
此處每一次都給它的的空位附上數值
public void ai() {
for (int i = 0; i < chessValue.length; i++) {
for (int j = 0; j < chessValue[i].length; j++) {
// 向右
if (chessarry[i][j] == 0) {
// 向右
String code = "";//初始化
int color = 0;
for (int k = i + 1; k < chessValue.length; k++) {
if (chessarry[k][j] == 0) {
break;//如果沒有棋子
} else {
if (color == 0) {
// 記錄右邊第一個棋子顏色
color = chessarry[k][j];
code += chessarry[k][j];//把數字編程字符串
} else if (color == chessarry[i][j]) {
code += chessarry[k][j];
} else {
code += chessarry[k][j];
break;
}
}
Integer value = hm.get(code);
if (value != null) {
chessValue[i][j] += value;權值疊加
}
// 重新計算下一個點的權值
code = "";
value = 0;
}
}
最后寫一個循環代碼來標記一下
最大的數
Ok
這里應用到hash表
遇到多種棋盤形式