我製作了一個井字棋遊戲,是的,有些人可能認爲我的程序不太好。我是一個新程序員並且有從未使用過揮杆或任何與此遊戲之前的JAVA GUI有關的東西。該計劃的工作,大多數。當你編譯並運行它,並點擊玩家vs電腦,遊戲得到卡住後3-4回合。我一直在試圖找出幾個小時的問題,似乎無法解決。 代碼很長...任何幫助表示讚賞!CPU模式在3-4回合後停止播放(JAVA SWING)
下面是代碼:http://txt.do/6dvm
我製作了一個井字棋遊戲,是的,有些人可能認爲我的程序不太好。我是一個新程序員並且有從未使用過揮杆或任何與此遊戲之前的JAVA GUI有關的東西。該計劃的工作,大多數。當你編譯並運行它,並點擊玩家vs電腦,遊戲得到卡住後3-4回合。我一直在試圖找出幾個小時的問題,似乎無法解決。 代碼很長...任何幫助表示讚賞!CPU模式在3-4回合後停止播放(JAVA SWING)
下面是代碼:http://txt.do/6dvm
您的計算機的邏輯是有點...缺陷:
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
}
button[0][0].addActionListener(new playerVSComputer()); button[0][1].addActionListener(new playerVSComputer());....
之類的東西可以用循環完成,並且可以幫助您的代碼變得更加清晰。如需進一步的幫助,請發送問題到code review section of stack exchange。
我嘗試了for循環,它幾乎像你說的那樣工作,我會在晚些時候或明天嘗試你的其他建議,但我相信他們工作給予for循環幾乎沒有。非常感謝你!我也會研究你和其他人說的,謝謝! –
我運行程序時得到的警告是r和c的值未被使用。我改變他們爲我的變量,它仍然說...因此,當我嘗試你的列表,它實際上阻止了計算機玩任何O的,但我認爲我做錯了什麼,因爲如果它不工作。我所做的是我複製列表建議,並將r和c變量更改爲行和列。然後,我把我的其他代碼放在if語句和之後的地方。 –
只是讓未來的用戶知道我用過: 'int row,column; do row =(int)(3 * Math.random()); column =(int)(3 * Math.random()); } while(!button [row] [column] .isEnabled());' 並改變了一些布爾值,現在我很確定它的工作原理謝謝! –
沒有人會閱讀所有的代碼。你最好的選擇是:在每個方法中添加日誌記錄到每一個單一的方法。再次運行該應用程序並查看日誌以查看其卡住的位置,然後無法開始反向工作以確定原因。 – Kon
您是否嘗試過使用IDE進行調試?像Eclipse或NetBeans一樣? –
@Kon我已經嘗試過了,而且我幾乎採用了與創建玩家vs玩家遊戲模式完全相同的方式,只是將其更改爲與計算機一起工作,並且它只是卡住了。你不需要閱讀我提供的所有代碼,以防止任何人想運行它。這個問題只發生在最後一堂課,因爲那是它出現的時候 –