課題 (03:キャンバス)

作業について

今回の課題は以下のパッケージに作成してください。

パッケージの名前
j1.lesson03

作成するクラスの名前は問題ごとに指示があります。下記を参照してください

課題の提出方法については下記を参照してください。

また、別のコンピューター上に移動する際には、下記を参考にプログラムを持ち帰ってください。

新しい内容

キャンバスをクリックさせる

今回紹介するものは、「キャンバス上のどこかをクリックさせる」という命令です。

package j1.lesson03;

import gpjava.Canvas;

public class PointS2 {

    public static void main(String[] args) {
        new PointS2().start();
    }

    void start() {
        Canvas.show();
        Canvas.waitForPoint("どこかをクリックしてください");
        int x = Canvas.getPointedX();
        int y = Canvas.getPointedY();
        Canvas.drawStringCenter(250, 250, x + ", " + y + "がクリックされました");
    }
}

この「Canvas.waitForPoint」という命令を使うと、プログラムの実行を一時的に停止してキャンバス上のどこかがクリックされるのを待ちます。クリックされた位置は、「Canvas.getPointedX」と「Canvas.getPointedY」という2つの命令を使ってそれぞれクリックされたX座標とY座標を取り出せます。

まとめると、次のような方法で「キャンバス上のどこかをクリックさせる」という処理を行い、そのクリックされた位置を判定できます。

Canvas.waitForPoint([表示する文字列]);
int [変数の名前(X座標)] = Canvas.getPointedX();
int [変数の名前(Y座標)] = Canvas.getPointedY();

問題

1. 左右に分割された領域を判定するプログラム

作成するクラスの名前
LeftRightS2

下記のプログラムを変更して、キャンバス上のクリックされた領域に丸を描画するプログラムを作成してください。

package j1.lesson03;

import gpjava.Canvas;

public class LeftRightS2 {

    public static void main(String[] args) {
        new LeftRightS2().start();
    }

    void start() {
        Canvas.show();
        Canvas.drawStringCenter(125, 100, "左側");
        Canvas.drawStringCenter(375, 100, "右側");
        Canvas.drawLine(250, 0, 250, 500);

    }
}

例えば、左側のどこかがクリックされた場合は下記のように左側に丸を描画します。

図: 左右に分割された領域を判定するプログラム (左)

右側がクリックされた場合には右側に丸を描画します。

図: 左右に分割された領域を判定するプログラム (右)

ヒント

キャンバス上をクリックさせるにはCanvas.waitForPoint("どこかをクリックしてください");と書き、そこでクリックされた座標はCanvas.getPointedX()とCanvas.getPointedY()を使って取得できます。今回は左か右かを判定するので、X座標だけを使います。

2. 長方形の内外を判定するプログラム

作成するクラスの名前
InRectS2

下記のプログラムを変更して、クリックされた位置によって長方形の中であるか外であるかをメッセージダイアログに表示するようにしてください。

図: 長方形の内外を判定するプログラム
package j1.lesson03;

import gpjava.Canvas;

import javax.swing.JOptionPane;

public class InRectS2 {

    public static void main(String[] args) {
        new InRectS2().start();
    }

    void start() {
        Canvas.show();
        Canvas.drawStringCenter(250, 150, "長方形の外");
        Canvas.drawRect(150, 200, 200, 100);
        Canvas.drawStringCenter(250, 255, "長方形の中");

    }
}

この問題では(150, 200)を左上、(350, 300)を右下に取る長方形を描画しています。この範囲内がクリックされた場合には「長方形の中です」とメッセージダイアログに表示し、それ以外の範囲がクリックされた場合には「長方形の外です」とメッセージダイアログに表示してください。

ヒント

キャンバス上をクリックさせるにはCanvas.waitForPoint("どこかをクリックしてください");と書き、そこでクリックされた座標はCanvas.getPointedX()とCanvas.getPointedY()を使って取得できます。この座標が長方形の中か外かを判定するとよいでしょう。

3. Javaのクイズ

作成するクラスの名前
JavaQuizS2

Javaを題材にした2択のクイズを出題するプログラムを作成してください。

クイズは次のような形式でキャンバス上に表示し、(選択肢X)のいずれかをクリックして解答できるようにしてください。正解の場合には「正解です」、不正解の場合には「不正解です」、関係ない個所がクリックされたら「選択肢から選んでください」とメッセージダイアログに表示されるようにしてください。

図: Javaのクイズ

ただし、(ここに問題文を書いてください)の部分には問題文を、(選択肢X)の部分には問題に対するそれぞれの選択肢を書いてください。問題が思いつかない場合には、下記のような問題を出題してください (正解は自分で確認してください)。

図: Javaのクイズ (例)

ヒント

文字列を描画する際にCanvas.drawStringの代わりにCanvas.drawStringCenterを使うと楽です。これはCanvas.drawStringと使い方がほとんど同じで、指定したX座標を「左右の中心」として文字列を描画します。(Canvas.drawStringでは「左端」を選択していました)

4. ネストした範囲を判定するプログラム

作成するクラスの名前
SelectBoundS2

下記のプログラムを変更して、クリックされた位置によってその範囲に書いてある得点をメッセージダイアログに表示するようにしてください。

図: ネストした範囲を判定するプログラム
package j1.lesson03;

import gpjava.Canvas;

import javax.swing.JOptionPane;

public class SelectBoundS2 {

    public static void main(String[] args) {
        new SelectBoundS2().start();
    }

    void start() {
        Canvas.show();
        Canvas.drawStringCenter(250, 80, "0");
        Canvas.drawRect(100, 100, 300, 300);
        Canvas.drawStringCenter(250, 130, "20");
        Canvas.drawRect(150, 150, 200, 200);
        Canvas.drawStringCenter(250, 180, "50");
        Canvas.drawRect(200, 200, 100, 100);
        Canvas.drawStringCenter(250, 255, "100");

    }
}

たとえば、中心から一つ外側の領域をクリックした場合「50点です」のように表示してください。

余裕のある人は、Canvas.drawRectの部分をCanvas.drawOvalに書き換えたり、ダーツのように複雑な図形に挑戦してみてください。

ヒント

内側から判定していくと楽です。「100点の範囲か?」「そうでなく、50点の範囲か?」…のような形です。