クリックで縦横が入れ替わるようにする

円(ボール)が1個なら簡単

moveDisk

さまざまな方法がありますが、dxとdyを交換すると右へ行っていたものは下へ、左に行っていたものは上へ、下に行っていたものは右へ、上に行っていたものは左に進むようになります。

MoveDisk5.javaをもとに変更していきます。

greenボタンをクリックしたら変更されることにします。actionPerformedメソッド内の変更です。

ファイル名 MoveDisk6.java の一部

if (e.getSource() == gbtn) {
   int tmp = dx;
   dx = dy;
   dy = tmp;
}

dxの値をtmpに保存しておいて、dyの値をdxにいれ、dyにtmpの値を入れることでdx とdyの値を入れ替えることができます。

しかしこれだけではうまくいきません。コンパイルすると次のようなメッセージが出てきます。

$ javac MoveDisk6.java 
MoveDisk6.java:53: シンボルを見つけられません。
シンボル: 変数 dx
場所    : MoveDisk6 の クラス
                   int tmp = dx;
                             ^
MoveDisk6.java:54: シンボルを見つけられません。
シンボル: 変数 dx
場所    : MoveDisk6 の クラス
                   dx = dy;
                   ^
MoveDisk6.java:54: シンボルを見つけられません。
シンボル: 変数 dy
場所    : MoveDisk6 の クラス
                   dx = dy;
                        ^
MoveDisk6.java:55: シンボルを見つけられません。
シンボル: 変数 dy
場所    : MoveDisk6 の クラス
                   dy = tmp;
                   ^
エラー 4 個

dx, dy はmoveDiskというクラスの中で宣言されているのでその外側からはアクセス(読み書き)できないのです。(シンボルというのは変数やインスタンス、メソッドやクラスの名前のことです)。変数やインスタンスには有効な範囲があってこれを変数のスコープといいます。

dx, dy はmoveDisk内でなければアクセスできない

class MoveDisk6{
    actionPerformed(){...}
    main(){...}
    class MyPanel{
        paintComponent(){...}
        drawRdm(){...}
        nextColor(){...}
    }
    class moveDisk{
        int dx = 0;
        int dy = 10;
        run(){...}
    }
}

MoveDisk6のフィールドとしてdx, dyを宣言すれば、その中のactionPerformed()メソッドでも、moveDiskクラスでもアクセスできるようになりますが、moveDiskクラスに宣言を残すと2つのdx,dyはそれぞれ区別され、moveDisk内でdx,dyにアクセスするとmoveDisk内で宣言されたdx,dyの意味になってしまいます。

dx, dy はMoveDisk6でもアクセスできるが、moveDisk内のdx,dyとは別の変数になってしまう。

class MoveDisk6{
    int dx = 0;
    int dy = 10;
    actionPerformed(){...}
    main(){...}
    class MyPanel{
        paintComponent(){...}
        drawRdm(){...}
        nextColor(){...}
    }
    class moveDisk{
        int dx = 0;
        int dy = 10;
        run(){...}
    }
}

moveDisk内の宣言をなくせば、全部共通になります。

dx, dy はMoveDisk6内ならどこからでも共通でアクセスできる

class MoveDisk6{
    int dx = 0;
    int dy = 10;
    actionPerformed(){...}
    main(){...}
    class MyPanel{
        paintComponent(){...}
        drawRdm(){...}
        nextColor(){...}
    }
    class moveDisk{
        //int dx = 0;
        //int dy = 10;
        run(){...}
    }
}

blueボタンの設定追加

greenボタンは次の様にしました。

右へ行っていたものは下へ、(dx= 10, dy=  0) → (dx=  0, dy= 10)
左に行っていたものは上へ、(dx=-10, dy=  0) → (dx=  0, dy=-10)
下に行っていたものは右へ、(dx=  0, dy= 10) → (dx= 10, dy=  0)
上に行っていたものは左へ。(dx=  0, dy=-10) → (dx=-10, dy=  0)

moveDisk

どの場合もdx,dyを入れ替えればよいことが分かります。

blueボタンを次の様にします。

右へ行っていたものは上へ、(dx= 10, dy=  0) → (dx=  0, dy=-10)
左に行っていたものは下へ、(.......??........)
下に行っていたものは左へ、(dx=0, dy=10) → (dx=-10, dy=0)
上に行っていたものは右へ。(.......??........)

moveDisk

どうすればいいでしょうか

円(ボール)が2個以上のとき問題が露呈

またあとで

課題

1.

MoveDisk5.javaをもとにします

greenボタンを上記の様に働くようにし、動作を確認しなさい。

ファイル名 MoveDisk6.java

2.

さらに、

blueボタンを上記の様に働くようにし、動作を確認しなさい。

ファイル名 MoveDisk6.java

もくじ

聖愛高等学校
http://www.seiai.ed.jp/
Last Modified