我不确定标题是否是说出我要问的正确方法,对不起,如果不是,但我想要做的是使用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() {
}
}
我目前得到的是类似的东西 A B A. A B B. F D D E F C. 而不是: B A C. D E F. A B C. F E D. 第一个例子具有三个A和一个C,而不是如第二个例子中的两个。 如果可能的话,我不想直接给出代码,而是朝着正确的方向发展。
答案 0 :(得分:0)
一个简单的解决方案:不要使用数组。
相反,请使用该列表的List<Integer>
和 shuffle 。然后只需使用列表的最后一个元素 - 然后从列表中删除最后一个元素;并再次洗牌。
当然,你也可以编写一些代码来跟踪你已经使用的所有索引,并继续询问随机索引,直到你得到一个以前没用过的索引。
答案 1 :(得分:0)
对于您的代码,我认为以下代码可以解决问题。
array = ArrayUtils.removeElement(array, element)
如果你真的想要使用一个数组,请查看Fisher-Yates shuffle随机改组数组。
但是,我的建议是不使用数组。使用列表作为建议的其他答案。