さまざまな方法がありますが、dxとdyを交換すると右へ行っていたものは下へ、左に行っていたものは上へ、下に行っていたものは右へ、上に行っていたものは左に進むようになります。
MoveDisk5.javaをもとに変更していきます。
greenボタンをクリックしたら変更されることにします。actionPerformedメソッド内の変更です。
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というクラスの中で宣言されているのでその外側からはアクセス(読み書き)できないのです。(シンボルというのは変数やインスタンス、メソッドやクラスの名前のことです)。変数やインスタンスには有効な範囲があってこれを変数のスコープといいます。
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の意味になってしまいます。
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内の宣言をなくせば、全部共通になります。
class MoveDisk6{ int dx = 0; int dy = 10; actionPerformed(){...} main(){...} class MyPanel{ paintComponent(){...} drawRdm(){...} nextColor(){...} } class moveDisk{ //int dx = 0; //int dy = 10; run(){...} } }
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)
どの場合もdx,dyを入れ替えればよいことが分かります。
blueボタンを次の様にします。
右へ行っていたものは上へ、(dx= 10, dy= 0) → (dx= 0, dy=-10) 左に行っていたものは下へ、(.......??........) 下に行っていたものは左へ、(dx=0, dy=10) → (dx=-10, dy=0) 上に行っていたものは右へ。(.......??........)
どうすればいいでしょうか
またあとで
MoveDisk5.javaをもとにします
greenボタンを上記の様に働くようにし、動作を確認しなさい。
さらに、
blueボタンを上記の様に働くようにし、動作を確認しなさい。