0

Roberts の The Art & Science of Java (Stanford の CS106a テキスト) から Java を学んでいます。IDE として NetBeans を使用しています。

第 4 章の演習 14 では、以前に紹介したチェッカーボード プログラムを拡張するよう求められます。具体的には、チェッカーボードを中央に配置し、ゲームの初期状態に対応する赤と白のチェックのセットを描くように求めます。

要求されたとおりに達成しましたが、2 つの問題があります。

  1. ボードがウィンドウの中央に完全に配置されていません。ウィンドウの右側よりも左側に近いです。それをもっと中心に置く方法がわかりません。私はこれを正しく行っていますか?NetBeans に変更できる/変更すべき設定はありますか?

  2. チェッカーは、座っているタイルの大部分を占めることになっています。チェッカーのサイズをタイルのサイズに依存するように割り当てて、セットアップがシンプルで比例するようにしました。チェッカーを大きくするためにこれを行うより良い方法はありますか?

    import acm.graphics.*;
    import acm.program.*;
    import java.awt.*;
    
    public class Checkerboard extends GraphicsProgram{
    
    public void run(){
    
    double sqSize = (double)getHeight() / N_ROWS;
    for (int i = 0; i < N_ROWS; i++){
        for(int j = 0; j < N_COLUMNS; j++){
            double x = ((j * sqSize) + (getWidth() / N_COLUMNS));  //centers square??
            double y = (i * sqSize);
            GRect sq = new GRect( x, y, sqSize, sqSize );
            sq.setFilled((i + j) % 2 != 0);
            sq.setFillColor(Color.GRAY);
            add(sq);
    
            double circleCoord = (sqSize * .33);
            double xx = ((j * sqSize) + (getWidth() / N_COLUMNS) + circleCoord);
            double yy = ((i * sqSize) + circleCoord);
    
            if((i + j) % 2 != 0 && i < 3 ){
                GOval red = new GOval( xx, yy, circleCoord, circleCoord);
                red.setFilled(true);
                red.setFillColor(Color.RED);
                add(red);
    
            } else if((i + j) % 2 != 0 && i > 4 ){
                GOval black = new GOval( xx, yy, circleCoord, circleCoord);
                black.setFilled(true);
                black.setFillColor(Color.BLACK);
                add(black);
            }
    
         }
       }
    }
    private static final int N_ROWS = 8;
    private static final int N_COLUMNS = 8; 
    
    }
    
4

1 に答える 1

0

1.の場合ボードの中心も幅の中央にある必要があります。だから私たちはそれを知っています

タイルの左端N_COLUMNS/2=getWidth()/2たとえば、0のインデックス付けのタイル4の左端は中央にあります

そして、その左または右のすべてのタイルにはsqSizeの動きがあるので、次のようになります。

double x = getWidth()/2 + (j-N_COLUMNS/2)*sqSize

于 2013-02-25T03:55:06.493 に答える