得点
※最新版のjarファイル: basic.jar を利用のこと。
リアルタイムゲームでは、多くの場合、得点を競うことになる。そして、
シューティングゲームやアクションゲームの場合、プレイヤーやコンピュータの
キャラクター座標が交差(ぶつかった)場合、得点に繋がるルールを採用する
場合が多い。
たとえば、パックマンでは、お化けとプレイヤーの座標が交差すると、減点
(プレイヤーの残り数が減る)になる。インベーダーでは、プレイヤーの発射した
ミサイルがインベーダーの座標と交差すると得点になる。
このような、座標の交差の確認を「当り判定」などと呼ぶ。
具体的には、比較したいキャラクターのx座標とy座標を同時に比較し、
両座標とも一致した場合、キャラクターは画面上に重なっていることに
なるため、「当った」(ぶつかった)ことになる。
プログラミング例としては、以下のようになる。
int player_x, player_y; //プレイヤーキャラのx座標, y座標
int computer_x, computer_y; //コンピュータキャラのx座標, y座標
//...それぞれの座標を設定したあと
if( (player_x == computer_x) && (player_y == computer_y) ){ //当り判定
//当り
}
以下に、当り判定を利用した簡単なゲームのソースを記す。
ゲームのルールは、画面に表示される標的をいかに早く10回
拾うことができるかを競う。
ただし、プレイヤーは一度キーを入力すると、その方向に常に移動し続ける。
import jp.ac.tuis.basic.*;
public class Hit{
public static void main(String[] args){
//初期化
BasicGraphics g = new BasicGraphics();
int WIDTH=40;
int HEIGHT=20;
int TOTALTARGET = 10; //標的の捕獲目標回数
int computer_x;
int computer_y;
int player_x=WIDTH/2;
int player_y=HEIGHT-1;
char player_dir=0; //プレイヤーの進行方向
int score = 0; //現在の標的の捕獲回数
int time = 0; //現在の時間(ループ数)
long SLEEP=100;
//プレイヤー表示
g.locate(player_x,player_y);
g.color(g.CYAN);
g.print('A');
//標的表示
computer_x = (int)(Math.random()*(WIDTH-2));
computer_y = (int)(Math.random()*(HEIGHT-1));
g.locate(computer_x, computer_y);
g.color(g.RED);
g.print('X');
while(g.inkey() == 0){} // 何かキーを押したらゲーム開始
//アニメーション開始
while(true){
time++; //ループ回数を追加
//プレイヤー移動
g.locate(player_x,player_y);
g.print((char)0); //前の座標のプレイヤーを消す
char key = g.inkey();
//キーが押されたか確認
if(key == 'j' || key =='l' || key == 'i' || key == 'k'){
player_dir=key; //移動方向を変更
}
//プレイヤーの移動方向によって、座標を変更
if(player_dir == 'j' && player_x > 0){
player_x--;
}
if(player_dir == 'l' && player_x < WIDTH-2){
player_x++;
}
if(player_dir == 'i' && player_y > 0){
player_y--;
}
if(player_dir == 'k' && player_y < HEIGHT-1){
player_y++;
}
//プレイヤー表示
g.locate(player_x,player_y);
g.color(g.CYAN);
g.print('A');
//当り判定
if((player_x == computer_x) && (player_y == computer_y)){
//当り
score++;
if(score >= TOTALTARGET){ //標的を目標回数捕らえた
break; //終了
}
//新しい標的表示
computer_x = (int)(Math.random()*(WIDTH-2));
computer_y = (int)(Math.random()*(HEIGHT-1));
g.locate(computer_x, computer_y);
g.color(g.RED);
g.print('X');
}
g.sleep(SLEEP);
}//end while(true)
//得点(時間)表示
g.locate(WIDTH/2, HEIGHT/2);
g.color(g.WHITE);
g.print("TIME:");
g.print(time);
}//end main
}//end class Hit