【问题标题】:remove array from random when used使用时从随机中删除数组
【发布时间】:2017-10-13 15:05:18
【问题描述】:

我不确定标题是否正确表达了我的要求,抱歉,如果不是,但我正在尝试做的是使用 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() {


    }
}

我目前得到的是类似 甲乙甲 甲乙乙 F D D E F C 而不是: B A C D E F 甲乙丙 F E D 第一个示例具有三个 A 和一个 C,而不是第二个示例中的每个两个。 如果可能的话,我不想直接给出代码,而是朝着正确的方向前进。

【问题讨论】:

    标签: java arrays user-interface random


    【解决方案1】:

    一个简单的解决方案:不要使用数组。

    改为使用List&lt;Integer&gt;shuffle 该列表。然后只需将列表的最后一个元素用于您的目的 - 然后 删除 列表中的最后一个元素;并再次洗牌。

    当然,您也可以编写一些代码来跟踪您已经使用的所有索引,并不断请求随机索引,直到您获得一个以前没有使用过的索引。

    【讨论】:

    • 我无法让文本正确显示,但使用 List 而不是 Array 让我感觉更接近预期的结果。
    【解决方案2】:

    对于您的代码,我认为以下代码可以解决问题。

    array = ArrayUtils.removeElement(array, element)
    

    如果您真的想使用数组,请查看 Fisher–Yates shuffle 以对数组进行随机洗牌。

    但是,我的建议是不要使用数组。使用列表作为建议的其他答案。

    【讨论】:

      猜你喜欢
      • 2021-06-02
      • 2014-07-22
      • 2016-05-17
      • 1970-01-01
      • 2013-05-30
      • 1970-01-01
      • 2019-02-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多