2011年9月2日金曜日

Java入門③


Javaでゲームを作って遊んでみる企画





1.    最初に

今回の企画で最終的にどの程度のものが作ってもらうかとりあえず表示





 シンプルなブロック崩しを作ってもらいます。


 今はわからなくてもいいのですが、メインクラスからメインパネルを作成し、メインパネル上にブロック・ボール・ラケットを配置しゲームを動作させています。今回のゲームではブロック・ボール・ラケットなどは変数としてのパラメータがあるだけでなく、インスタンスでまとまった形で存在してます。


2.    クラスとインスタンス
オブジェクト指向言語における最初の壁がクラスとインスタンスについてです。
クラスとは一言で言うと「変数(フィールド)」や「関数(メソッド)」をひとまとめにした,一つのプログラム単位です。C言語で言う所の構造体に関数が付けれるものだと思ってください。(実際にC++では構造体とクラスはかなり似ている)
まとめ
クラスとインスタンスは,共に変数とメソッドをまとめた単位でしかない。その違いは,クラスがクラス・ファイルの読み込み後に唯一つだけ生成されるのに対して,インスタンスはその生成されたクラスから複数生成できる点にある。



public class CTRLmember {
	String name;
	int grade;

}



public class test {
	public static void main(String args[]) {
		CTRLmember pman1 = new CTRLmember();
		CTRLmember pman2 = new CTRLmember();
		CTRLmember pman3 = new CTRLmember();


		pman1.name = "ピーマン";
		pman1.grade = 4;
		pman2.name = "蛮族";
		pman2.grade = 3;
		pman3.name = "すさのお";
		pman3.grade = 1;

		System.out.println("名前:学年");
		System.out.println(pman1.name + ":" + pman1.grade);
		System.out.println(pman2.name + ":" + pman2.grade);
		System.out.println(pman3.name + ":" + pman3.grade);
	}
}



出力




2.    カプセル化
オブジェクト一つ一つを部品に見立てるオブジェクト指向では、可能な限り処理はオブジェクト内で完結させることが大切です。そこで出てくるのがカプセル化です。カプセル化とは、他のオブジェクトから不用意に自分のフィールドやメソッドをさわらせい事です。上記の例だと
pman1.name
のように直接フィールドにアクセスしていますが、これは良くない例です。他のオブジェクトに触らせなくする方法はprivateをつけるだけです。



public class CTRLmember {
	private String name;
	private int grade;

	//名前と学年を設定する
	public void set(String s,int nm){
		name = s;
		grade = nm;
	}

	//名前と学年を表示する
	public void show(){
		System.out.println(name + ":" + grade);
	}

	//名前を得る
	public String getName(){
		return name;
	}

	//学年を得る
	public int getGrade(){
		return grade;
	}
}



public class test {
	public static void main(String args[]) {
		CTRLmember pman1 = new CTRLmember();
		CTRLmember pman2 = new CTRLmember();
		CTRLmember pman3 = new CTRLmember();


		pman1.set("ピーマン", 4);
		pman2.set("蛮族", 3);
		pman3.set("すさのお", 1);

		System.out.println("名前:学年");
		//System.out.println(pman1.name + ":" + pman1.grade);	//これは表示できない
		System.out.println(pman2.getName() + ":" + pman2.getGrade());
		pman3.show();
	}
}


privateにすることで、他のオブジェクトからフィールドやメソッドを触られないようにすることができました。逆に他のオブジェクトから触れるよにするにはpublicをつければ良い。Javaはデフォルトでpublicになっていますが、明示的にする方が良い。
他のオブジェクトからアクセスできなくなったので、フィールドを表示する場合は、名前と学年を表示するshowメソッドや、名前を返戻値にするgetNameメソッド等を追加する。この例だけだとメリットが感じられないと思いますが、C言語で言う所のglobal変数の多用を避けているという認識で良いでしょう。

まとめ
カプセル化は,まず「すべてprivate」が基本。そこから考えていくことで,本当に公開すべきフィールドやメソッドが見えてくる。







参考:人工知能に関する断想録 「Javaでゲーム作りますが何か?」
参考:ITPro初心者がJavaを高速に学ぶコツ

0 件のコメント:

コメントを投稿