Java学習~Greenfootのインストールとオブジェクト指向プログラミング~

イントロダクション

GreenFootというアプリケーションがあります。Javaプログラミングを教えにも、学習するにも使えるツールのようです。

記事のインデックス

動画:インストールとJavaに関して

動画:Wombatクラスを学ぶ

動画:メソッドの使い方

動画:Greenfootクラスの使い方

インストール画像

インストーラーがあるので一発インストールです。

リンク一覧

チュートリアル一覧

  1. Greenfootに触れてみよう
  2. 移動とキーコントロール
  3. アクターの検出と削除、およびメソッドの作成
  4. 世界(Worldクラス)の保存と、音声の作成
  5. ランダムに動く敵を追加しよう
  6. 他のオブジェクトへのアクセス方法

Greenfootのインストール

Greenfootはイギリスの「ケント大学」とオーストラリアの「ディーキン大学」が作成した、Java言語によるオブジェクト指向原則プログラミングを学ぶためのツールです。こちらのサイトからダウンロードできます。

Greenfootのダウンロードサイト

Windowsへのインストール

インストーラーをダウンロードして、インストーラーをダブルクリックします、あとは案内に沿ってボタンを謳歌していくとインストールできます。

インストールしたGreenfootを起動すると下のようになります。

Linux(Debian系)へのインストール

Linuxだからコマンドでインストールかな?なんて思ってたらダブルクリックで行けるようです。

  1. debファイルをダウンロード
  2. そのファイルをダブルクリック

「Create or Open a scenario using the Scenario menu」とあり、英語になっています。

まずは日本語化

上部のメニュー「Tool」→「Preference」からウィンドウを開き上部のタブ「interface」から下のような画面が開けます。ここで日本語を指定します。

セットしたら、アプリケーションを閉じてもう一度開きます。この作業のことを「再起動」といいます。

一応、日本語化されました。

人のプロジェクトを見る

スクラッチでも、他の人の作品を見ることができます。Greenfootでも同様にこちらのページで人の作品が見れるようです。
プロジェクトを開くときには、ダウンロードしたファイルを展開して下のようなファイルがあるディレクトリを開きましょう。

チュートリアルをやる

チュートリアルを行うのに、サンプルシナリオがあるようです。「このチュートリアルでは、ここからダウンロードできる」とあるのでここから、シナリオ(gfarファイル)をダウンロードします。
ダウンロードしたらそのファイルを開きます。
[Scenario] -> [Open GFAR]でダウンロードしたファイルを指定して開きます。

古いバージョンのファイルなので、下のような確認が出ますので赤丸をクリック。

開くと下のような画面が見れます。

Tutorial1: Greenfootに触ってみよう

こちらにチュートリアルのページがあります。

基本的な操作としては、Actorクラスを継承して作成されている「Wombat」と「Leaf」クラスを右クリックして操作を選択、Shiftボタンを押して「new」したクラス(オブジェクト)をWorldに配置するということです。

配置ができたら、次は「Run」ボタンを押下して、各オブジェクトを動かします。

「Wombat」クラスは葉っぱ(Leaf)を食べます。次に、葉っぱを探すために動きます。
そして「Leaf」クラスは動きませんが、「Wonbat」に食べられるとなくなります。

まずは動かしてみましょう。

ここから、何かしらの物語がはじまるんだろうな。。。

Greenfootに触れてみよう」をみる

チュートリアルを参考に、Greenfootの動かし方を記述しています。そして、ここをクリックして初めのプロジェクトをダウンロードします。

とりあえず動かす

まずは細かいことを考えずに動かしましょう。上の動画にあるように、葉っぱとウォンバットを配置して「Run」ボタンを謳歌すれば動かすことができます。
そして、隣のボタンを謳歌すると、一歩ずつ動かすことができます。まるでデバックモードで動かしているようです。

ちなみに、ショート動画も作成しました。

プログラムの話

ウォンバットを右クリックすると下のようなポップアップ・メニューが見れます。

ここには、ウォンバットクラスが持っているメソッドが一覧できます。正確には、ウォンバットオブジェクトの持っているメソッドです。
この2つの違いは、「インスタンス化されているか、そうでないか」の違いになります。
上記の、動画で一つずつ動かしているときには、メソッドを指定して動かしています。言葉を変えるなら、指定したメソッドを一回動かしています。
ウォンバットを右クリックすると出てくる「継承 form Object 」とか「継承 form Actor」などの文言はObjectクラスから継承したメソッド、Actorクラスから継承したメソッドを意味します。

act()メソッドならば、「前進」、turnLeft()メソッドならば、「左に向く」動きをします。

通常、プログラムを起動するときは全て動いてしまうので「Run」ボタンを謳歌したときのように動きます。
しかし、プログラムの動きを細かく見たいときなどは、一つずつ動かして、プログラムコードと、その動きを確認します。

ワールドの話

葉っぱやウォンバットは「Actorクラス」を継承して作られています。別な言い方をすると、「Actorクラス」を継承してやれば、オリジナルのキャラクターを作成できます。
このActorが動けるのは、「ワールド(World)クラス」の上です。

具体的には、下のようなマス目(グリッド)のことを言います。

このワールドクラスも同様に、Javaプログラムです。Java言語はクラスですべてのものを表現しようとします。
具体的には、コップやペットボトルなど、それぞれの特徴を「クラス」として表現した上でプログラムを作成します。

上記のプログラムの場合だと、下のようなストーリーが考えられます。
「世界(Worldクラス)の上に、ウォンバット(Wonbatクラス)と葉っぱ(Leafクラス)を配置して、ウォンバットが葉っぱを探して食べる」
というものです。

ここで登場しているクラスは「世界」と「ウォンバット」「葉っぱ」の3つだけですが、やはりクラスとして表現され、プログラムを実行することで画面上に表示しています。

Tutorial2: 移動とキーコントロール

次は、チュートリアルの2番目をやりたいと思います。上のリンクで、対象のページを開けます。ここから2番目のプロジェクトをダウンロードできます。
前回と同じように、「project.greenfoot」ファイルがあるディレクトリを開きましょう。そして、実行すると下のような画面が見れます。

今度は、カニを「new」して「Run」ボタンを押下しても動きませんでした。。。
今回のポイントは、プログラムコードを書いてみましょうということです。
クラスを右クリックして、「OpenEditor」を選択するとテキスト・エディターが開きますのでコードを書きます。
コードは、下のようなものです。

public class Crab extends Actor
{
    /**
     * Act - do whatever the Crab wants to do. This method is called whenever
     * the 'Act' or 'Run' button gets pressed in the environment.
     */
    public void act() 
    {
    }    
}

このコードは、Runボタンを押下しても動きません。なぜか?
プログラムが何も書かれていないからです。

ちょっと細かい話をすると、Actorクラスを継承して、act()メソッドをオーバーライドしているのですが、中身がないのでRunボタンを押下しても動きませんでした。

そこに、「move()」メソッドと「turn()」メソッドを実装して動きを確かめています。

クラスの継承とオーバーライド

ちょっと難しい話をします。チュートリアルの中に「World」とか「Actor」という言葉が出てきましたが、これらはクラスの名前です。
これらのクラスはGreenfootで提供されているクラスで、このクラスを継承(extends)してオリジナルのクラスを作成できます。
今回の「カニ(Crab)」であれば、「Actor」クラスを継承しています。

public class Crab extends Actor

これらのクラスは、こちらのJavaDocに詳細が記載されています。
Actorクラスがどんなメソッドを持っているか?これを確認することが出来ます。
上の動画にあるように、もともとあるメソッドをこのカニクラスに作成すれば、オリジナルの動きを作成することが出来ます。

今回の動画では、処理の中身がなかったので初めは何も動きませんでした。ちなみに、「move()」と「turn()」もActorクラスのメソッドですが、これは呼び出しているだけです。すでに実装してあるので呼び出すだけで、カニが動きます。

このように、クラスを継承することで、新しいActorクラスを作成できる仕組みがあります。

ちなみに、ボタン操作できるようにコードを追加しました。

実装したコードは下のようなものです。

public class Crab extends Actor
{
    /**
     * Act - do whatever the Crab wants to do. This method is called whenever
     * the 'Act' or 'Run' button gets pressed in the environment.
     */
    public void act() 
    {
        move(1);
        if (Greenfoot.isKeyDown("left")) {
            turn(-1);
        }
        if (Greenfoot.isKeyDown("right")) {
            turn(1);
        }

    }    
} 

Tutorial3: アクターの検出と削除、およびメソッドの作成

チュートリアルの3番めを参考にします。
使用するプロジェクトは、チュートリアル2と同じです。なので下のように、カニがいれば大丈夫です。

今回のポイントは、新しい「Actor」を作成してみようということです。具体的な手段としては「Actorクラス」を継承したサブクラスを作成します。

現状虫は、動かずにカニに食べられるだけという仕様にいたします。下のような感じです。

プログラムコード

コードは下のようになります。

  • 虫は動かずそのまま
  • カニは動いて、虫を見つけたら食べる
public class Crab extends Actor
{
    /**
     * Act - do whatever the Crab wants to do. This method is called whenever
     * the 'Act' or 'Run' button gets pressed in the environment.
     */
    public void act() 
    {
        move(1);
        if (Greenfoot.isKeyDown("left")) {
            turn(-1);
        }
        if (Greenfoot.isKeyDown("right")) {
            turn(1);
        }
        // この部分を追加しました。
        Actor worm = getOneObjectAtOffset(0, 0, Worm.class);
        if (worm != null) {
            World world = getWorld();
            world.removeObject(worm);
        }
    }

}

それぞれの処理部分を確認します。
「虫は動かずそのまま」なので、処理はありません。

「カニは動いて、虫を見つけたら食べる」なので、「虫を見つけたら」と「虫を食べる」の処理を書きます。

「虫を見つけたら」は、下の部分になります。

        Actor worm = getOneObjectAtOffset(0, 0, Worm.class);
        if (worm != null) {
        }

「getOneObjectAtOffset()」で虫(worm)を取得して、インスタンスがある場合。つまり変数の「worm」がNULLでない場合、です。

そして。「虫を食べる」はIF分の中に書きます

World world = getWorld();
world.removeObject(worm);

Worldクラスのメソッド「removeObject()」メソッドを使用します。
手順としては、Worldクラスを取得して、Worldクラスのメソッドを呼び出す。という処理を行います。

コードの実装と、動きに関しては上記の動画を参照ください。

リファクタリング

コードが増えてきたので、整理しましょう。正確には汚くなる前に綺麗に分けましょう。ということです。
「act()」メソッドには「カニが動く」処理と「虫を食べる」処理が書かれています。
処理は一つずつ、メソッドに分けて書くようにしましょう。

public class Crab extends Actor
{
    /**
     * Act - do whatever the Crab wants to do. This method is called whenever
     * the 'Act' or 'Run' button gets pressed in the environment.
     */
    public void act() 
    {
        moveAndTurn();
        eatWorm();
    }

    public void moveAndTurn() {
        move(1);
        if (Greenfoot.isKeyDown("left")) {
            turn(-1);
        }
        if (Greenfoot.isKeyDown("right")) {
            turn(1);
        }        
    }

    public void eatWorm() {
        Actor worm = getOneObjectAtOffset(0, 0, Worm.class);
        if (worm != null) {
            World world = getWorld();
            world.removeObject(worm);
        }
    }

}

こうすると、「act()」メソッドを初めてみた人でも。メソッドの「moveAndTurn()」と「eatWorm())」を呼び出しているんだな。と一目でわかります。
このような「わかりやすいコード」が「よみやすい」コードです。ポイントは以下の部分です。

  1. 何をしているのかがすぐわかる
  2. 1つのメソッドに一つの機能(動く、食べるなど)を実装

Tutorial4: 世界を保存して音を鳴らす

次のチュートリアルは、Worldクラスの保存と録音の方法です。

Worldクラスの状態を保存

シンプルに、画面を起動して、Actボタン、Runボタンを押下する前にWorldクラスの状態を保存することができます。

Resetボタンを押下すると、保存した状態に戻してくれます。知っておくと便利です。

録音の方法

Ctrl + Uボタンで録音の画面が開けます。ファイルはプロジェクトのあるディレクトリからsoudフォルダを開くと見ることができます。

実際に、録音をしてみました。

声とマイクがしょぼいので、イマイチですが。。。

Tutorial5; ロブスターの作成

最後のチュートリアルのようです。

エビを作成して、ランダムに動かすところがポイントです。ランダムに動かすのは下のように、

Greenfoot.getRandomNumber(100);

乱数の生成を使用した実装を行います。

今まで学習した内容のまとめでもあるので、この記事にはエビのコードを書きません。が、作成した動画は載せておきます。

とりあえず遊んでみましょう

Greenfootのサイトから、「Scenarios」を開き、ブラウザ上でゲームをプレイしてみました。

なかなか、やりごたえがありました。

ここから、サンプルゲームを作りつつJava言語を、OOP(オブジェクト指向プログラミング)を学習できるように持っていきたいのですが。。。

じゃんけんゲーム

毎度おなじみじゃんけんゲームをGreenfoot版で作成いたしました。こちらのリンクからダウンロードできます。「Open in Greenfoot」ボタンを押下してください。

「html-docs」フォルダにUMLを同梱しております。