クラス・メソッド利用
※最新版のjarファイル: basic.jar を利用のこと。
Javaの機能をフルに活用するためには、クラス定義およびメソッド定義を行う必要がある。
Javaははじめからオブジェクト指向言語として設計されており、
逆にオブジェクト指向を用いないでJavaを利用するのは非常に不便である。
ここでは、すでに作成されてある(正しく動作する)簡易インベーダーゲームを、
メソッドに分割し、かつオブジェクトインスタンスとして(newして)修正する。
実行結果としては、なんら違いは見えないが、今後このプログラムを修正する場合、
メソッド分割してある場合としてない場合では、
プログラムの解読性に大きな違いができるため、開発効率に影響がでる。
ようするに、メソッド分割することにより、簡単にゲームを拡張できるようになるということである。
以下にもとのインベーダーゲームのソースを表示する。
import jp.ac.tuis.basic.*;
public class Invader{
public static void main(String[] args){
//Initialization
int WIDTH=40;
int HEIGHT=20;
BasicGraphics g = new BasicGraphics(WIDTH,HEIGHT,20);
int x=WIDTH/2;
int y=HEIGHT-2;
int alien_x=0;
int alien_y=1;
int alien_dir=1;
boolean game_over=false;
char key=0;
boolean fired_missile=false;
int missile_x=0;
int missile_y=0;
long SLEEP=100;
int POINT=10;
int score = 0;
int level = 1;
int MAXLEVEL = 20;
int sublevel = 0;
int MAXSUBLEVEL = 2;
//Setup screen
g.color(g.WHITE, g.BLACK);
g.cls();
g.locate(0,0);
g.color(g.WHITE, g.BLACK);
g.print("SCORE : 0 ");
g.color(g.WHITE, g.GREEN);
g.locate(0,y+1);
g.print(" ");
g.locate(x,y);
g.color(g.CYAN, g.BLACK);
g.print('A');
//Wait for start
g.locate((WIDTH-24)/2,HEIGHT/2);
g.color(g.WHITE, g.BLACK);
g.print("PRESS RETURN KEY TO START");
while(true){
key = g.inkey();
if(key=='\n') break;
}
g.locate((WIDTH-24)/2,HEIGHT/2);
g.color(g.WHITE, g.BLACK);
g.print(" ");
//Draw Alien
g.locate(alien_x,alien_y);
g.color(g.MAGENTA, g.BLACK);
g.print('M');
//Main Loop
while(!game_over){
//Alien move
for(int i=0; i < level; i++){
g.locate(alien_x,alien_y);
g.color(g.WHITE, g.BLACK);
g.print((char)0);
alien_x = alien_x + alien_dir;
if(alien_x > WIDTH-2 || alien_x < 0){
alien_dir = -alien_dir;
alien_x = alien_x + alien_dir;
alien_y++;
if(alien_y >= y){
game_over = true;
break; //leave for loop
}
}
if(alien_x == missile_x && alien_y == missile_y){
g.locate(alien_x,alien_y);
g.color(g.RED, g.BLACK);
g.print("@");
g.beep();
score = score + POINT;
g.locate(8,0);
g.color(g.WHITE, g.BLACK);
g.print(score);
alien_x = 0;
alien_y = 1;
alien_dir=1;
sublevel++;
if(sublevel > MAXSUBLEVEL){
sublevel = 0;
level++;
if(level > MAXLEVEL) level = MAXLEVEL;
}
}else{
g.locate(alien_x,alien_y);
g.color(g.MAGENTA, g.BLACK);
g.print('M');
}
g.sleep(SLEEP/level);
}//end for(i=0; i<level; i++)
//Player Move
//Get Key Input
key = g.inkey();
if((key == 'a' || key == 'j') && x > 0){
g.locate(x,y);
g.color(g.WHITE, g.BLACK);
g.print(' ');
x--;
g.locate(x,y);
g.color(g.CYAN, g.BLACK);
g.print('A');
}
if((key == 'd' || key == 'l') && x < WIDTH-2){
g.locate(x,y);
g.color(g.WHITE, g.BLACK);
g.print(' ');
x++;
g.locate(x,y);
g.color(g.CYAN, g.BLACK);
g.print('A');
}
if(key == ' ' && fired_missile == false){
fired_missile = true;
missile_x = x;
missile_y = y-1;
g.locate(missile_x, missile_y);
g.color(g.YELLOW, g.BLACK);
g.print('!');
}else if(fired_missile == true){
g.locate(missile_x, missile_y);
g.color(g.WHITE, g.BLACK);
g.print(' ');
missile_y = missile_y-1;
if(missile_y < 1){
fired_missile = false;
}else if(missile_x == alien_x && missile_y == alien_y){
g.locate(missile_x, missile_y);
g.color(g.RED, g.BLACK);
g.print('@');
g.beep();
score = score + POINT;
g.locate(8,0);
g.color(g.WHITE, g.BLACK);
g.print(score);
alien_x = 0;
alien_y = 1;
alien_dir=1;
sublevel++;
if(sublevel > MAXSUBLEVEL){
sublevel = 0;
level++;
if(level > MAXLEVEL) level = MAXLEVEL;
}
}else {
g.locate(missile_x, missile_y);
g.color(g.YELLOW, g.BLACK);
g.print('!');
}
}
}//end while(!game_over)
g.locate((WIDTH-9)/2, HEIGHT/2);
g.color(g.WHITE, g.BLACK);
g.print("GAME OVER");
}//end main
}//end class Invader
課題 1
上記のプログラムをnew演算子でインスタンス化するように修正し、
かつプログラムをメソッドに分割せよ。
以下のサンプルは、メソッド分割のテンプレートである。
以下の通りに分割する必要はない。
import jp.ac.tuis.basic.*;
public class Invader{
//変数はすべてインスタンス変数とする。(本来は必要なもののみとするべき)
int WIDTH;
int HEIGHT;
int x;
int y;
int alien_x;
int alien_y;
int alien_dir;
boolean game_over;
char key;
boolean fired_missile;
int missile_x;
int missile_y;
long SLEEP;
int POINT;
int score;
int level;
int MAXLEVEL;
int sublevel;
int MAXSUBLEVEL;
public static void main(String[] args){
Invader program = new Invader();
program.start();
}//end main
public void start(){
init(); //初期化
wait_for_start(); //リターンキーが押されるまでゲームは始めない
draw_alien(); //初期状態のインベーダーを表示
//Main Loop
while(!game_over){
alien_move(); //インベーダを移動・表示
player_move(); //キー入力/プレイヤー表示/ミサイル表示
}//end while(!game_over)
game_over(); //ゲームオーバー表示
}//end start
private void init(){
//初期化
}
private void wait_for_start(){
//リターンキーが押されるまでゲームは始めない
}
private void draw_alien(){
//初期状態のインベーダーを表示
}
private void alien_move(){
//インベーダを移動・表示
}
private void player_move(){
//キー入力/プレイヤー表示/ミサイル表示
}
private void game_over(){
//ゲームオーバー表示
}
}//end class Invader
課題 2
インベーダーの数を同時に3つ表示されるようにプログラムを修正せよ。
当然、どのインベーダーに当たっても、点数は入るように修正する必要がある。
ヒント:配列とforを利用すれば、インベーダーの数を変更することができる。