2017-10-13 30 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随机数组的随机洗牌。我的建议是不使用数组。使用列表作为建议的其他答案。