ConnectFour Java游戏问题

时间:2016-05-03 05:04:24

标签: java arrays multidimensional-array

我是希尔先生编码班的9年级学生!最近,他要求我们创建一个连接四个游戏,其中涉及两个玩家,防止作弊(因此玩家1不能继续将棋子放在一个转弯等等)并且将像真正的连接四个游戏一样运作!我已经开始研究这个代码了,但是,希尔先生最近生了一个孩子,过去一周一直没有上学。我们的代课老师对编码一无所知,我已经问过我的朋友,但我没有得到帮助。无论如何,要求涉及使用二维数组,并且当从列中下拉时使游戏“碎片”落到下一个可用位置。游戏需要是6行乘7列,有一个清除游戏的重置按钮,并有一个'玩家获胜'计数器。我已经尽力创建董事会并检查胜利,但我不确定是什么问题。我试图制作一个按钮的二维游戏板,按钮会在点击时变成红色或黑色的图片。我很抱歉,因为我是一名业余程序员,因此会出现业余错误。我完全陷入困境,甚至不确定这是否正确。我很感激任何和所有的帮助!非常感谢你,祝你有个美好的一天!

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();
 {
 }
}
}
);
}
}

1 个答案:

答案 0 :(得分:2)

我试着给你一些起点。

  1. 正如@Bethany Louise所提到的,访问索引等于其长度的数组会导致IndexOutOfBoundsException。因此,最高可访问索引的长度为1。数组的第一个索引是0。
  2. 一个建议,使用final int rowButtons = 6;和final int columnButtons = 7;对于初始化和每个for循环内部,可以使用这些值。如果要更改行数,则必须更改多行代码。随着代码的增长,很容易忘记一个值。
  3. 您需要使用行和列,请注意1 ..

    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. 它可能有用,但问问自己在checkWin()方法中检查整个网格是必要的。检查最后一块设置的周围是不够的? (记住数组的界限)

  5. 板[rowSelected] [columnSelected] .setIcon。我没有看到在代码中设置rowSelected和columnSelected值的位置。如果未设置,请尝试弄清楚如何获取这些值。 (提示,调用按钮的动作处理程序,因此按钮知道它已被调用,但他需要记住它的位置。)

  6. 希望它有所帮助。