2017-10-13 32 views
1

我不確定標題是否是正確的方式來說出我所要求的,如果不是這樣,對不起,但我想要做的是使用GUI創建一個記憶匹配遊戲。我有一個數組,並且我有一個隨機從數組中打印元素的按鈕,但問題是,我可以多次打印相同的元素。有沒有一種方法可以在使用該元素後將其刪除? 如果沒有辦法做到這一點,關於如何才能讓它使用每個元素只有一次? 這是我當前的代碼:使用時從隨機數組中刪除數組

package MemoryMatching; 
import java.awt.BorderLayout; 
import java.awt.GridLayout; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 

import java.util.Random; 

import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 

public class MemoryGUI extends JFrame implements MemoryMatch, ActionListener{ 
    JPanel mainPanel, boardPanel; 
    JButton [][] gridButtons = new JButton[3][4]; 
    char cardArray[] = new char[12]; 
    int numInPlay; 

    public MemoryGUI(){ 
     cardArray[0] = 'A'; 
     cardArray[1] = 'A'; 
     cardArray[2] = 'B'; 
     cardArray[3] = 'B'; 
     cardArray[4] = 'C'; 
     cardArray[5] = 'C'; 
     cardArray[6] = 'D'; 
     cardArray[7] = 'D'; 
     cardArray[8] = 'E'; 
     cardArray[9] = 'E'; 
     cardArray[10] = 'F'; 
     cardArray[11] = 'F'; 
     mainPanel = new JPanel(); 
     mainPanel.setLayout(new BorderLayout()); 
     boardPanel = new JPanel(); 
     boardPanel.setLayout(new GridLayout(4,3)); 
     setBoard(); 
     mainPanel.add(boardPanel, BorderLayout.CENTER); 
     add(mainPanel); 
    } 
    @Override 
    public void actionPerformed(ActionEvent e) { 
     JButton btnClicked = (JButton) e.getSource(); 
     btnClicked.setEnabled(false); 
     char randomChar = cardArray[(int)new Random().nextInt(cardArray.length)]; 

     btnClicked.setText(""+ randomChar); 
     faceUp(); 

    } 

    @Override 
    public void setBoard() { 
     for(int x = 0; x < cardArray.length; x++) { 

     } 
     for(int row=0; row<gridButtons.length; row++){ 
      for(int col=0; col<gridButtons[row].length;col++){ 
       gridButtons[row][col] = new JButton(); 
       gridButtons[row][col].addActionListener(this); 
       gridButtons[row][col].setText("No peeking"); 
       boardPanel.add(gridButtons[row][col]); 
       faceDown(); 
      } 
     } 
    } 

    @Override 
    public void isWinner() { 
     // TODO Auto-generated method stub 

    } 
    @Override 
    public void isMatch() { 


    } 
    @Override 
    public void faceUp() { 
     for(int x = 0; x < cardArray.length; x++) { 
      for(int y = 0; y < cardArray[x]; y++) { 

      } 
     } 
    } 
    @Override 
    public void faceDown() { 


    } 
} 

什麼我目前得到的是類似 ABA AFB FDD EFC 而不是: BAC DEF ABC FED 有三個A中的第一個例子和一個C,而不是第二個例子中的兩個。 如果可能,我想不要直接給代碼,而是朝着正確的方向努力。

回答

0

一個簡單的解決方案:不要使用數組。

而是使用List<Integer>shuffle該列表。然後,只需使用列表的最後一個元素用於您的目的 - 然後刪除列表中的最後一個元素;並再次洗牌。

當然,您也可以編寫一些代碼來跟蹤您已經使用過的所有索引,並不斷詢問隨機索引,直到找到之前沒有使用的索引。

+0

我還沒有能夠讓文本正確顯示,但使用列表而不是數組讓我覺得更接近所需的結果。 – HoneybunHero

0

對於你的代碼,我認爲下面的代碼會做的伎倆。

array = ArrayUtils.removeElement(array, element) 

如果您確實想使用數組,請查看Fisher-Yates隨機數組的隨機洗牌。我的建議是不使用數組。使用列表作爲建議的其他答案。