0

ArrayLists、抽象化、およびポリモーフィズムを使用して、学校向けのブロック崩しゲームを作成しています。draw メソッドを含む抽象クラス DrawableBrick を作成しました。ArrayList を満たす他のサブクラスの作成に成功し、ゲームはうまく動作しますが、ArrayList に簡単に追加できるポリゴンである ShavedBrick という新しいサブクラスを作成する必要があります。

このクラスのパラメーター化されたコンストラクターを作成し、クラス データをユーザーから渡された引数に設定する方法について、私は少し行き詰まっています。これが私がこれまでに持っているものです。八角形である必要があります。

import java.awt.*;
import java.util.*;

public class ShavedBrick extends DrawableBrick {


    //data
    private int [] xArray = new int [8];
    private int [] yArray = new int [8];
    private int numberOfSides;
    //private Color color;

    //constructor
        public ShavedBrick(int[] x {}, int [] y {}, int numberOfPoints)
        {
            Random ranGen = new Random();
            xArray[0] = x;
            yArray[0] = y;
            this.numberOfSides = numberOfPoints; 
            //this.width = width;
            //this.height = height;
            this.color = new Color(0,(ranGen.nextInt(156)+100),0);

        }


    //draw - tells the ShavedBrick to draw itself, using the Graphics object received
        public void draw(Graphics g)
        {
            Color prevColor = g.getColor(); //save previous color associated with g
            g.setColor(this.color);
            g.fillPolygon(xArray, yArray, numberOfSides);
            g.setColor(prevColor);                  //restore previous color
         }

ArrayList でオブジェクトを作成する例を次に示します。

//some constants created in the main data
private final int WALLWIDTH = 5;    //Walls' width
private final int BRICKSTARTX = WALLWIDTH;
private final int BRICKSTARTY = 100 + WALLWIDTH;
private final int BRICKWIDTH = 150;
private final int BRICKHEIGHT = 75;

//Fill the ArrayList with random DrawableBricks


    for (int i = 0; i<10; i++){
        Random random = new Random();
        int randomBrick = random.nextInt(3);
        if (randomBrick == 0){
            myBricks.add(i, new RedBrick((BRICKSTARTX + i*BRICKWIDTH),(BRICKSTARTY + BRICKHEIGHT),BRICKWIDTH,BRICKHEIGHT));
            myBricks.add(i, new RedBrick((BRICKSTARTX + i*BRICKWIDTH),((BRICKSTARTY+75) + BRICKHEIGHT),BRICKWIDTH,BRICKHEIGHT));
        }
        else if (randomBrick == 1) {
            myBricks.add(i, new BlueBrick((BRICKSTARTX + i*BRICKWIDTH),(BRICKSTARTY + BRICKHEIGHT),BRICKWIDTH, BRICKHEIGHT));
            myBricks.add(i, new BlueBrick((BRICKSTARTX + i*BRICKWIDTH),((BRICKSTARTY+75) + BRICKHEIGHT),BRICKWIDTH,BRICKHEIGHT));
        }
        //else if (randomBrick == 3){
            //myBricks.add(new ShavedBrick(0,0,2,6));
        //}
        else if (randomBrick == 2){
            for (int i = 0; i<8; i++){
                xValues[] array = new xArray[8];
                myBricks.add(new ShavedBrick(int [i] x {BRICKSTARTX,});
            }

        }
    }
4

3 に答える 3

0

私はこのようなものを提案します...

public ShavedBrick(int[] x, int[] y, int numberOfPoints)
        {
            Random ranGen = new Random();
            for(int i = 0; i < 8; i ++) {
                 xArray[i] = x[i];
                 yArray[i] = y[i];
            }
            this.numberOfSides = numberOfPoints;
            this.color = new Color(0,(ranGen.nextInt(156)+100),0);

        }

{ }基本的に、コンストラクターの署名から中かっこ ( ) を削除します。そして、for ループを使用して、入力配列内の 8 つの要素のそれぞれをクラスのプライベート配列に追加します。クラスのプライベート配列を入力配列に直接向けることもできますが、個人的にはそれを避け、新しく作成された配列のペアに値をコピーするだけです。

Array.copyOf(int[], int)http://docs.oracle.com/javase/6/docs/api/java/util/Arrays.html#copyOf(int[], int)も使用できます。

クライアントコードでは、ループを実行して座標を計算し、それらの座標を次のようにコンストラクターに渡します...

int[] xArray = new int[8];
int[] yArray = new int[8];
for (int i = 0; i < 8; i ++) {
   xArray[i] = //some value for the x co-ordinate of the ith point
   yArray[i] = //some value for the y co-ordinate of the ith point
}
ShavedBrick b = new ShavedBrick(xArray, yArray, 8);
myBricks.add(b); //finally add the new shaved brick
于 2013-03-04T04:26:30.870 に答える
0

次のように、引数配列を直接割り当てることができます。

public ShavedBrick(int[] xArray, int[] yArray, int numberOfPoints)
    this.xArray = xArray;
    this.yArray = yArray;
    //...

int[] x {}実際には新しい空の配列を作成しますが、これはもちろん有効なパラメーター宣言ではありません。パラメータ宣言は次のようになりますint[] xArray

于 2013-03-04T04:27:42.650 に答える
0

あなたの問題が何であるかはわかりませんが、八角形の場合はnumberOfPoints引数は必要ありません:

public ShavedBrick(int[] x, int [] y)
    {
        Random ranGen = new Random();
        this.numberOfSides = 8; //it's always 8
        xArray = Arrays.copyOf(x,numberOfSides); //note, this method will pad array with zeros if x.length is less than 8
        yArray = Arrays.copyOf(y,numberOfSides);
        this.color = new Color(0,(ranGen.nextInt(156)+100),0);
    }
于 2013-03-04T04:29:50.473 に答える