java簡易五子棋


作者:倪屁屁
鏈接: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​chessprogramming.wikispaces.com

這里有一個權值算法的介紹

此處每一次都給它的的空位附上數值

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表

遇到多種棋盤形式


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM