2016-05-03 10 views
0

私はHill氏のコーディングクラスの9年生です!最近、彼は2人のプレイヤーを含むConnect Fourゲームの作成を依頼しています。不正行為を防止します(プレイヤー1は1ターンに置くことができません)。私はコードの作業を始めましたが、ヒルさんは最近赤ちゃんがいて、先週は学校をやめました。私たちの代わりの教師はコーディングについて何も知らないし、私はすでに友達に尋ねてきましたが、私は助けられませんでした。とにかく、要件は2次元配列を使用し、ゲームの「ピース」を列の下にドロップしたときに次の使用可能な位置に落とします。ゲームは6行×7列でなければならず、ゲームをクリアするリセットボタンがあり、「プレーヤー勝ち」カウンターがあります。私はボードを作って勝利をチェックするのに最善を尽くしましたが、何が間違っているのか分かりません。私は、ボタンを2次元のゲームボードにしようとしました。ここで、ボタンは、クリックされると、赤または黒のピースの絵に変わります。私はアマチュアのプログラマーであり、アマチュアな間違いがあることを謝ります。私は完全に立ち往生しており、これが正しいと確信していません。私はとにかく、すべて助けていただければ幸いです!本当にありがとう、良い一日を!ConnectFour Javaゲームの問題

import javax.swing.*; 
import java.awt.GridLayout; 
import java.awt.event.*; 

public class ConnectFourGame 
{ 
    JFrame frame; 
    JPanel panel; 
    final int rowButtons = 6; 
    final int columnButtons = 7; 
    int row, column, rowSelected,columnSelected = 0; 
    int playerTurn = 0; 
    boolean win = false; 
    JButton[][]board = new JButton[6][7]; 
    int[][] grid = new int [6][7]; 
    GridLayout gameBoard = new GridLayout (6,7); 

    final ImageIcon red = new ImageIcon("red.png"); 
    final ImageIcon black = new ImageIcon("black.png"); 
    final ImageIcon blank = new ImageIcon("white.png"); 

    private JButton reset; 
    private JLabel playerWins; 

    //JLabelcheck 


public ConnectFourGame() 
{ 
    frame = new JFrame ("Connect Four Game"); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    panel = new JPanel(); 
    panel.setLayout(gameBoard); 
    for (row = 6; row >= 0; row--) 
    { 
    for (column = 7; column >= 0; column--) 
    { 
    board[6][7] =new JButton(); 
    board[6][7].addActionListener(new boardListener()); 
    panel.add(board[6][7]); 
    } 
} 
frame.setContentPane(panel); 
frame.setSize(700,600); //1400,1200 
frame.setVisible(true); 
frame.pack(); 
//frame.setResizable(false); 
//frame.setLocation(807,170); 

/*reset = new JButton("Reset Game"); 
reset.setBounds(1200,1000,100,170); 
reset.addActionListener(this); 
frame.add(reset);*/ 

/*playerWins = new JLabel("Player Wins"); 
playerWins.setBounds(70,900,100,370); 
frame.add(playerWins);*/ 

/*board[row][column] = new JButton(); 
board[row][column].addActionListener(new boardListener());*/ 
} 
class boardListener implements ActionListener 
{ 
    public void actionPerformed(ActionEvent event) 
    { 
    //String (eventButton) = event.getActionCommand(); 
    if (win = false) 
    { 
    if(playerTurn % 2 == 0) 
    { 
    board[rowSelected][columnSelected].setIcon((red)); 
    } 
    if(playerTurn % 2 == 1) 
    { 
    board[rowSelected][columnSelected].setIcon((black)); 
    } 
    //if (JLabelCheck(columnSelected) == true) 
    { 
    checkWin(); 
    playerTurn = playerTurn + 1; 
    } 
    } 
} 
} 
public boolean checkWin() 
{ 
for (int row = 0; row<6; row++) 
{ 
    for (int column = 0; column < 4; column++) 
    { 
    if(grid[column][row] != 0 && grid [column][row] == grid[column+1][row] && grid [column][row] == grid[column+2][row] && grid [column][row] == grid[column+3][row]); 
{ 
    win = true; 
    } 
} 
} 
for(int row = 0; row<3; row++) 
{ 
for (int column=0; column<7; column++) 
{ 
if(grid[column][row] !=0 && grid [column][row] == grid[column][row+1] && grid [column][row]== grid[column][row+2] && grid [column][row] == grid[column][row+3]); 
    { 
     win = true; 
     } 
    } 
    } 
    for(int row = 0; row<3; row++) 
    { 
    for (int column=0; column<4; column++) 
    { 
    if(grid[column][row] !=0 && grid [column][row] == grid[column][row+1] && grid [column][row]== grid[column][row+2] && grid [column][row] == grid[column][row+3]); 
    { 
     win = true; 
     } 
    } 
    } 
    for(int row = 3; row<6; row++) 
    { 
    for (int column=0; column<4; column++) 
    { 
    if(grid[column][row] !=0 && grid [column][row] == grid[column+1][row-1] && grid [column][row]== grid[column+2][row-2] && grid [column][row] == grid[column+3][row-3]); 
    { 
     win = true; 
     } 
    } 
    } 
    return win; 
    } 

public static void main(String args[]) 
{ 
javax.swing.SwingUtilities.invokeLater(new Runnable() 
{ 
public void run() 
{ 
JFrame.setDefaultLookAndFeelDecorated(true); 
new ConnectFourGame(); 
{ 
} 
} 
} 
); 
} 
} 
+4

あなたの問題は何ですか、あなたは(もので、多分あなたはクリーンアップこの質問をすべきで、ほとんどの読者はあなたの先生の人生を気にしないことに注意してください?)より特異的であることができる –

+0

あなたのインスタンス変数内の配列に問題があります。インデックスは0から始まり、0ではなく1から始まることに注意してください。たとえば、 'board [6] [7]'などの値に値を代入しようとすると、ArrayIndexOutOfBoundsExceptionがスローされます。 'board [5] [6]'となります。 –

+0

高校に通って英語を学んでいる間、かなりの時間をかけてください。これは、より整理されたコードを作成し、スタックオーバーフローの問題を改善するのに役立ちます。 –

答えて

2

私はあなたにいくつかの出発点を教えてください。

  1. @Bethany Louiseが述べたように、長さが等しいインデックスを持つ配列にアクセスすると、IndexOutOfBoundsExceptionが発生します。したがって、最もアクセス可能なインデックスはlength-1です。配列の最初のインデックスは0です。
  2. 1つのアドバイス、最終的なintを使用するrowButtons = 6;そして最後のint columnButtons = 7;初期化のために、そしてforループの中で、値を使用することができます。たとえば、行数を変更する場合は、コードを複数行で変更する必要があります。コードが大きくなるにつれて、1つの値を忘れることは簡単です。
  3. あなたはそれが動作しますが、checkWin()メソッド内でグリッド全体をチェックすることnecassaryである自分自身に尋ねることができる

    for (row = 6; row >= 0; row--) 
    { 
        for (column = 7; column >= 0; column--) 
        { 
        board[6][7] =new JButton(); 
        board[6][7].addActionListener(new boardListener()); 
        panel.add(board[6][7]); 
        } 
    } 
    
  4. ...行と列を使用する必要があり、1に注意してください。最後に設定した部分の周りを確認するだけでは不十分ですか?

  5. ボード[rowSelected] [columnSelected] .setIcon(念頭に配列境界を保ちます)。 rowSelectedとcolumnSelectedの値がコード内でどこに設定されているのかわかりません。それが設定されていない場合は、それらの値を取得する方法を把握してみてください。 (ヒント、ボタンのアクションハンドラが呼び出されるので、ボタンは呼び出されたことがわかりますが、ボタンの位置を覚えておく必要があります)。

希望します。