2015-01-07 19 views
-2

我製作了一個井字棋遊戲,是的,有些人可能認爲我的程序不太好。我是一個新程序員並且有從未使用過揮杆或任何與此遊戲之前的JAVA GUI有關的東西。該計劃的工作,大多數。當你編譯並運行它,並點擊玩家vs電腦,遊戲得到卡住3-4回合。我一直在試圖找出幾個小時的問題,似乎無法解決。 代碼很長...任何幫助表示讚賞!CPU模式在3-4回合後停止播放(JAVA SWING)

下面是代碼:http://txt.do/6dvm

+6

沒有人會閱讀所有的代碼。你最好的選擇是:在每個方法中添加日誌記錄到每一個單一的方法。再次運行該應用程序並查看日誌以查看其卡住的位置,然後無法開始反向工作以確定原因。 – Kon

+0

您是否嘗試過使用IDE進行調試?像Eclipse或NetBeans一樣? –

+0

@Kon我已經嘗試過了,而且我幾乎採用了與創建玩家vs玩家遊戲模式完全相同的方式,只是將其更改爲與計算機一起工作,並且它只是卡住了。你不需要閱讀我提供的所有代碼,以防止任何人想運行它。這個問題只發生在最後一堂課,因爲那是它出現的時候 –

回答

2

您的計算機的邏輯是有點...缺陷:

int row = (int)(2*Math.random())+1; 
int column = (int)(2*Math.random())+1; 
while (button[row][column].isEnabled()==false) 
{ 
    row = (int)(2*Math.random())+1; 
    column = (int)(2*Math.random())+1; 
} 

尺寸3x3的,你看到的數字其發電任何問題的數組?我在這裏看到的是數字1 < = x < = 2正在生成。這意味着在第1列(或數組索引0)中沒有被選中。這意味着什麼時候,除了第一行和第一列以外的所有位置都會被卡在無限循環中。邏輯應該是:

int row = (int)(3*Math.random()); 
int column = (int)(3*Math.random()); 
while (button[row][column].isEnabled()==false) 
{ 
    row = (int)(3*Math.random()); 
    column = (int)(3*Math.random()); 
} 

或更好:

int row, column; 
do 
{ 
    row = (int)(3*Math.random()); 
    column = (int)(3*Math.random()); 
} while (!button[row][column].isEnabled()); // stop with the == boolean 

這仍然給你留下無限循環,如果沒有行被啓用,一個非常糟糕的執行隨機選擇的,可能需要一段時間,繼承人一個更好的辦法:

// list containing available locations for the computer to choose 
java.util.List<int[]> availableIndexes = new java.util.ArrayList<int[]>(); 

// go through all our buttons and make a list of ones that are enabled 
for(int r=0;r<button.length;r++) { 
    for(int c=0;c<button[r].length;c++) { 
     if(button[r][c].isEnabled()) { 
      availableIndexes.add(new int[]{r, c}); 
     } 
    } 
} 

// see if we can even do anything 
if(availableIndexes.isEmpty()) { 
    // cats game, i dont know what you want to do there.... 
} else { 
    // choose one of our avaible buttons at random 
    int [] randomButtonIndex = availableIndexes.get((int)(Math.random()*availableIndexes.size())); 
    int row = randomButtonIndex[0]; 
    int column = randomButtonIndex[1]; 


    // .... continue what you were doing 
} 


從評論一些其他的東西,我看到:

  • 學習使用IDE,Netbeans,IntelliJ或Eclipse是很好的選擇。
  • 使用數據結構,循環和方法是您的優勢。像button[0][0].addActionListener(new playerVSComputer()); button[0][1].addActionListener(new playerVSComputer());....之類的東西可以用循環完成,並且可以幫助您的代碼變得更加清晰。

如需進一步的幫助,請發送問題到code review section of stack exchange

+0

我嘗試了for循環,它幾乎像你說的那樣工作,我會在晚些時候或明天嘗試你的其他建議,但我相信他們工作給予for循環幾乎沒有。非常感謝你!我也會研究你和其他人說的,謝謝! –

+0

我運行程序時得到的警告是r和c的值未被使用。我改變他們爲我的變量,它仍然說...因此,當我嘗試你的列表,它實際上阻止了計算機玩任何O的,但我認爲我做錯了什麼,因爲如果它不工作。我所做的是我複製列表建議,並將r和c變量更改爲行和列。然後,我把我的其他代碼放在if語句和之後的地方。 –

+0

只是讓未來的用戶知道我用過: 'int row,column; do row =(int)(3 * Math.random()); column =(int)(3 * Math.random()); } while(!button [row] [column] .isEnabled());' 並改變了一些布爾值,現在我很確定它的工作原理謝謝! –