0

こんばんは。私は、古いゲームの LiteBrite に似たプログラムに取り組んでいます。このプログラムでは、パネルに色付きのペグを配置すると点灯します。私のプログラムでは、パネルをクリックすると、新しい楕円 (場所、サイズ、色の仕様を持つ ColorEllipse という名前) が作成され、保存するために保存されるという点で同様に機能します。現在は配列リストになっていますが、通常の配列にする必要があります。新しい配列を作成し、古い配列のすべての内容を新しい配列にコピーする方法を教えてもらいました。現在、私はarraylistを使用していますが、残念ながら、このプログラムには通常のArrayを使用する必要がある仕様があります。


import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.lang.reflect.Array;
import java.util.ArrayList;

public class LiteBritePanel extends javax.swing.JPanel{
    private final static int OFFSET = 5;
    private static int LINE_WIDTH = 2;
    private static int CELL_WIDTH = 25;


    public ArrayList <Colorable> _circles; // where ColorEllipses will be stored
    private ButtonPanel controlpanel; // used to set the color of peg that will be placed

    public LiteBritePanel() {
        this.setBackground(java.awt.Color.black);   

        _circles = new ArrayList<Colorable>();

        controlpanel = new ButtonPanel(this);
        this.addMouseListener(new MyMouseListener(this));
        this.add(controlpanel);
    }

    public void paintComponent(java.awt.Graphics aPaintBrush) {
        super.paintComponent(aPaintBrush);
        java.awt.Graphics2D pen = (java.awt.Graphics2D) aPaintBrush;

        java.awt.Color savedColor = pen.getColor();
        pen.setColor(java.awt.Color.black);
        for (int ball=0;ball<_circles.size();ball++)
            if(_circles.get(ball).isEmpty())
                return;
            else
                _circles.get(ball).fill(pen);
        pen.setColor(savedColor);
        this.repaint();
    }  


    public void mouseClicked(java.awt.event.MouseEvent e){
        boolean foundSquare = false;

        for (int ball=0; ball < _circles.size() && !foundSquare; ball++){
            if (_circles.get(ball).contains(e.getPoint()) == true){
                foundSquare = true;
                _circles.remove(ball);
                this.repaint();
            }
        }
    }

    private class MyMouseListener extends java.awt.event.MouseAdapter {
        private LiteBritePanel _this;
        public MyMouseListener(LiteBritePanel apanel){
            _this = apanel;
        }

        public void mouseClicked(java.awt.event.MouseEvent e){
            _circles.add(new ColorEllipse(controlpanel.getColor(), e.getPoint().x - (e.getPoint().x%CELL_WIDTH), e.getPoint().y - (e.getPoint().y%CELL_WIDTH), CELL_WIDTH-3,_this));
            _this.requestFocus();
            boolean foundSquare = false;
            for (int ball=0; ball < _circles.size() && !foundSquare; ball++){
                if (_circles.get(ball).contains(e.getPoint()) == true){
                    foundSquare = true;
                                // code for removing ball if one is placed
                    _this.repaint();
                }   
            }
            }
        }       
    }`

現在はArraylistとして設定されていますが、この仕様に従って通常の配列にする必要があります。次に、パネルがクリックされると、新しい ColorEllipse がその特定の場所でその配列に追加されます (表示されるように必要に応じて再描画されます)。プログラムの後半は、既に配置されているペグに触れると削除されますが、それはまた別の機会に。今、配列のサイズを増やしてその内容をコピーする方法を知る必要があります。何を変更すればよいか誰か教えてくれませんか?

4

2 に答える 2

0

ボードの大きさに応じて、ボードと同じサイズの配列を作成できます。または、Hovercraft が提案したように行うこともできますが、CPU をメモリと交換するかどうかによって異なります。

int MAX_POSSIBLE_ELEMENTS = ...
Colorable[] _circles = new Colorable[MAX_POSSIBLE_ELEMENTS];
....rest of code...

最大数はボードの高さと幅に依存するため、コンパイル時にこれを知っておく必要があります。

于 2013-11-05T00:33:58.097 に答える