2017-10-13 7 views
1

タイトルが正しいかどうかはわかりませんが、私が尋ねていることは申し訳ありませんが、私がやっていることはGUIを使ってメモリマッチゲームを作成することです。私は配列を持っていますが、配列の要素をランダムに印刷するボタンがありますが、同じ要素を複数回印刷することができます。それが使用されるとその要素を選択から削除する方法はありますか? これを行う方法がない場合は、各要素を1回だけ使用する方法について考えてください。 DEF BAC ABC FED 3 Aを有する第一の例:使用時にランダムから配列を削除する

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 ではなく、のようなものがある: これは私の現在のコードです第2の例におけるように、2つではなく1つのCである。 可能であれば、コードを完全には与えないで、正しい方向に向かって押してください。

答えて

0

簡単な解決策:配列を使用しないでください。

代わりにList<Integer>shuffleを使用してください。その後、目的のためにリストの最後の要素を使用してください。リストから最後の要素を削除してください。再度シャッフルしてください。

もちろん、すでに使用しているすべてのインデックスを追跡し、以前使用されていないインデックスを取得するまでランダムなインデックスを要求し続けるコードを書くこともできます。

+0

私はテキストを正しく表示することができませんでしたが、Arrayの代わりにListを使用すると、私は希望の結果にもっと近く感じることができます。 – HoneybunHero

0

あなたのコードでは、次のコードがこのトリックを行うと思います。

array = ArrayUtils.removeElement(array, element) 

実際に配列を使用する場合は、配列のランダムシャッフルについてFisher-Yatesシャッフルを調べてください。

しかし、私のお勧めは、配列を使用しないことです。他の答えが示唆しているようにリストを使用してください。

関連する問題