【问题标题】:ConnectFour Java Game Issues连接四个 Java 游戏问题
【发布时间】:2016-05-03 05:04:23
【问题描述】:

我是希尔先生编程课的 9 年级学生!最近,他要求我们创建一个四人连线游戏,该游戏涉及两名玩家,防止作弊(因此玩家 1 不能在一个回合中继续放置棋子等),并且将像真正的四人游戏一样运行!我已经开始编写代码,但是,Hill 先生最近生了一个孩子,并且过去一周一直失学。我们的代课老师对编码一无所知,我已经问过我的朋友,但没有得到帮助。无论如何,要求涉及使用二维数组,并让游戏“棋子”在下降到列时下降到下一个可用位置。游戏需要 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();
 {
 }
}
}
);
}
}

【问题讨论】:

  • 你的问题是什么,能说的更具体一点吗(还要注意大部分读者并不关心你的老师生活,所以也许你应该清理一下这个问题?)
  • 您的实例变量中的数组有问题。请记住,索引是从零开始的,这意味着计数从 0 而不是 1 开始。当您尝试为 board[6][7] 之类的东西赋值时,这会引发 ArrayIndexOutOfBoundsException,因为最高有效索引将是 board[5][6]
  • 在高中学习英语作文时,请花相当多的时间。这将帮助您编写更有条理的代码和更好的 Stack Overflow 问题。

标签: java arrays multidimensional-array


【解决方案1】:

我试着给你一些工作的起点。

  1. 正如@Bethany Louise 所提到的,访问索引等于其长度的数组会导致IndexOutOfBoundsException。因此,最高可访问索引是长度为 1。数组的第一个索引是 0。
  2. 一个建议,使用 final int rowButtons = 6;最后 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. board[rowSelected][columnSelected].setIcon。我看不到代码中设置 rowSelected 和 columnSelected 值的位置。如果未设置,请尝试弄清楚如何获取这些值。 (提示,按钮的动作处理程序被调用,所以按钮知道它被调用了,但他需要记住它的位置。)

希望对你有帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-07-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-31
    • 1970-01-01
    • 1970-01-01
    • 2014-12-06
    相关资源
    最近更新 更多