2015-12-22 143 views
0

我有一个很奇怪的问题,我有一个方法noOfPlayers,询问游戏中的玩家数量,一旦我有游戏中的玩家数量,我要求他们的每个名字反过来。一旦我得到了玩家的名字,就会创建一个框架,要求他们指定他们想要选择的计数器。当他们点击紫色宝石(出于测试目的)时,它应该在控制台中打印出玩家的名字,但for循环似乎不起作用。任何想法如何让环路正常工作?来自for循环的打印元素

public class setupPlayers extends JFrame implements ActionListener { 
    int intOfPlayers, purpleClick = 0, orangeClick = 0, iceClick = 0, greenClick = 0; 
    ArrayList<Player> arrayOfPlayers = new ArrayList<Player>(); 
    JButton purpleGemBTN, greenGemBTN, iceCubeBTN, orangeGemBTN; 
    JFrame organisationPanel; 
    JPanel titleChoiceCounter, counterSelector; 
    ImageIcon finalCounter; 
    private static Dialog d; 

    public setupPlayers() {} 

    public void noOfPlayers() { 
     try { 
      String inputValue = JOptionPane.showInputDialog("Please input the number of players"); 
      intOfPlayers = Integer.parseInt(inputValue); 
      if (intOfPlayers > 4) { 
       JOptionPane.showMessageDialog(null, "Only 1-4 can play!", "Error!", JOptionPane.ERROR_MESSAGE); 
       noOfPlayers(); 
       intOfPlayers = 0; 
      } 

      for (int z = 0; z < intOfPlayers; z++) { 
       String playerName = JOptionPane.showInputDialog("Player " + (z + 1) + " please input your name"); 
       chooseCounter(); 
       arrayOfPlayers.add(new Player(playerName, (z + 1), null, 0)); 
      } 
     } catch (NumberFormatException e) { 
      JOptionPane.showMessageDialog(null, "You did not enter the number of players, please enter the number of players", "Error!", JOptionPane.ERROR_MESSAGE); 
      noOfPlayers(); 
     } 
    } 

    public void chooseCounter() { 
     Frame window = new Frame(); 

     ImageIcon purpleGemImg = new ImageIcon("C:\\Users\\Anonymous\\Documents\\pink.png"); 
     ImageIcon greenGemImg = new ImageIcon("C:\\Users\\Anonymous\\Documents\\yellow.png"); 
     ImageIcon orangeGemImg = new ImageIcon("C:\\Users\\Anonymous\\Documents\\brown.png"); 
     ImageIcon iceCubeImg = new ImageIcon("C:\\Users\\Anonymous\\Documents\\white.png"); 

     d = new Dialog(window, "Please select your counter", true); 
     d.setLayout(new GridLayout(2, 2)); 
     d.setLocation(400, 300); 
     d.setSize(500, 500); 

     purpleGemBTN = new JButton("purple", purpleGemImg); 
     greenGemBTN = new JButton(greenGemImg); 
     orangeGemBTN = new JButton(orangeGemImg); 
     iceCubeBTN = new JButton(iceCubeImg); 

     purpleGemBTN.addActionListener(this); 
     greenGemBTN.addActionListener(this); 
     iceCubeBTN.addActionListener(this); 
     orangeGemBTN.addActionListener(this); 

     d.add(purpleGemBTN); 
     d.add(greenGemBTN); 
     d.add(orangeGemBTN); 
     d.add(iceCubeBTN); 

     d.setVisible(true); 
    } 

    public static void main(String[] args) { 
     setupPlayers spObj = new setupPlayers(); 
    } 

    public void actionPerformed(ActionEvent e) { 
     JButton pressed = new JButton(); 
     pressed = (JButton) e.getSource(); 
     if (pressed.getText().equals("purple")) { 
      for (int z = 0; z < arrayOfPlayers.size() - 1; z = z) { 
       String currentPlayer = arrayOfPlayers.get(z).playerNme; 
       System.out.println(currentPlayer); 
      } 
      d.setVisible(false); 
     } 
    } 
} 
+1

未来的参考:当你说“它似乎不工作”解释应该发生什么以及发生了什么。 –

+0

我只注意到你递归调用'noOfPlayers();'我认为你会得到一些意想不到的结果。 –

+0

我该如何解决这个问题,如果他们输入了一个无效的字符串数量的球员,不断询问球员的数量?那是我能想到做到的唯一方式。这是for循环不能正常工作的原因吗? – Blueaddiction

回答

0

所以,从以前的回答您的意见,我猜你的问题更关系到你是如何获得递归的名字。

这是一对快速的方法,似乎可以实现你想要的而无需递归。

private ArrayList<Player> arrayOfPlayers = new ArrayList<>(); 
private int intOfPlayers; 

public void noOfPlayers() { 

    while (true) { 
     String inputValue = JOptionPane.showInputDialog("Please input the number of players"); 

     if (inputValue != null) { // Text was entered, cancel not clicked 
      try { 
       intOfPlayers = Integer.parseInt(inputValue); 
       if (intOfPlayers > 4 || intOfPlayers < 1) { 
        JOptionPane.showMessageDialog(null, "Only 1-4 can play!", "Error!", JOptionPane.ERROR_MESSAGE); 
       } else { 
        break; // stop asking for numbers 
       } 
      } catch (NumberFormatException e) { 
       JOptionPane.showMessageDialog(null, "Please enter a number!", "Error!", JOptionPane.ERROR_MESSAGE); 
       e.printStackTrace(); // never ignore errors, even if obvious 
      } 
     } else { 
      System.out.println("Quitting from number players input"); 
      System.exit(0); // Canceled the dialog, so quit the program 
     } 

    } 

    for (int z = 0; z < intOfPlayers; z++) { 
     String playerName = JOptionPane.showInputDialog("Player " + (z + 1) + " please input your name"); 
     if (playerName != null) { 
      // chooseCounter(playerName); 
      arrayOfPlayers.add(new Player(playerName, (z + 1), null, 0)); 
     } else { 
      System.out.println("Quitting from player " + (z + 1) + " name input"); 
      System.exit(0); // Canceled the dialog, so quit the program 
     } 
    } 

    printPlayerNames(); 
} 

private void printPlayerNames() { 
    for (int z = 0; z < arrayOfPlayers.size(); z++) { 
     String currentPlayer = arrayOfPlayers.get(z).playerNme; 
     System.out.println(currentPlayer); 
    } 
} 
+0

我会在早上执行此代码,并在出现错误时提供反馈!谢谢 – Blueaddiction

+0

嘿,我真的喜欢代码工作的反馈,是否有可能删除一切,但for循环修复?我不想被指责剽窃。你也可以解释当我使用递归时会发生什么为什么它以这种方式打印 – Blueaddiction

+0

递归行为不正确的原因是因为当你再次调用函数时,它会根据需要正确返回顶部,但是当函数退出后,它会在您最初调用该函数的位置后恢复该行,因此会将重复名称添加到列表中。所以,欢迎您采取这些守则,但如果您担心抄袭,请更改它。但是,真的没有太大的改变,因为我所做的只是把你的变量名称和重新组织它们。 –

2

尝试写这样的循环:

for (int z=0; z<arrayOfPlayers.size()-1;z=z){... 

像这样:

for (int z=0; z<arrayOfPlayers.size();z++){... 

增加z++arrayOfPlayers.size()-1删除-1因为0指数z开始:

+1

我不认为1个需要从大小减去()这里 –

+0

当我试试这个方法,我得到PlayerOne PlayerOne PlayerTwo PlayerOne PlayerTwo PlayerThree – Blueaddiction

+0

@Blueaddiction你的意思是这种方法:为actionPerformed – Abdelhak

0

你不通过for循环迭代z++z=z

for (int z=0; z<arrayOfPlayers.size()-1;z++){ 
    String currentPlayer = arrayOfPlayers.get(z).playerNme; 
    System.out.println(currentPlayer); 
2

或对每个循环

for(Player p : arrayOfPlayers) 
    { 
     String name = p.playerNme; 
     System.out.println(name); 
    } 
+0

所以我添加了你的代码,我的地方,现在如果我写在输入4人玩,并输入第一个名字,点击紫色当弹出的框架时,然后输入第二个名称,当输入弹出并再次点击紫色宝石...做同样的事情,直到我写了所有4名球员我得到这个在命令行输出这是错误的PlayerOne PlayerOne PlayerTwo PlayerOne PlayerTwo PlayerThree – Blueaddiction

0

更好,因为你有for (int z=0; z<arrayOfPlayers.size()-1;z=z),你会无限循环,因为z将永远等于0

尝试将z=z更改为z++,以使迭代结束一次z = arrayOfPlayers.size()-1

你的代码将是:

for (int z=0; z<arrayOfPlayers.size();z++){ 
    String currentPlayer = arrayOfPlayers.get(z).playerNme; 
    System.out.println(currentPlayer); 
}