2015-12-22 231 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); 
}