import jp.ac.tuis.basic.*; public class Shooting2{ public static void main(String[] args){ //変数初期化 int WIDTH=40; //画面の幅 int HEIGHT=20; //画面の高さ int FONT=20; //文字の大きさ BasicGraphics g = new BasicGraphics(WIDTH,HEIGHT,FONT); int x=WIDTH/2; //プレイヤーのx座標 int y=HEIGHT-2; //プレイヤーのy座標 int enemy_x=0; //相手のx座標 int enemy_y=1; //相手のy座標 int enemy_dir=1; //相手の移動方向 boolean game_over=false; //ゲーム終了フラグ char key=0; //入力キー int missile_state=0; //ミサイル発射状態フラグ int missile_x=0; //ミサイルx座標 int missile_y=0; //ミサイルy座標 int enemy_missile_state=0; //相手ミサイル発射状態フラグ int enemy_missile_x=0; //相手ミサイルx座標 int enemy_missile_y=0; //相手ミサイルy座標 int enemycounter = 0; int playercounter = 0; int missilecounter = 0; int enemymissilecounter = 0; int ENEMYSPEED = 9; //相手の初期速度 int PLAYERSPEED = 9;//プレイヤーの速度 int MISSILESPEED = 4;//ミサイルの速度 int ENEMYMISSILESPEED = 4;//ミサイルの速度 long SLEEP=10; //実行スピード int POINT=10; //ヒット得点 int score = 0; //点数 //画面の初期化 g.console(false); g.color(g.WHITE, g.BLACK); g.cls(); g.locate(0,0); g.color(g.WHITE, g.BLACK); g.print("SCORE : 0"); g.locate(x,y); g.color(g.CYAN, g.BLACK); g.print("▲"); g.beep(); //リターンキーが押されるまで待つ g.locate((WIDTH-12)/2,HEIGHT/2); g.color(g.WHITE, g.BLACK); g.print("ENTERキーでスタート"); while(true){ key = g.inkey(); if(key=='\n') break; g.sleep(100); } g.playM("DECcg"); g.locate((WIDTH-12)/2,HEIGHT/2); g.color(g.WHITE, g.BLACK); g.print(" "); //メインループ while(!game_over){ //インベーダ移動 enemycounter++; if(enemycounter > ENEMYSPEED){ enemycounter=0; g.locate(enemy_x,enemy_y); g.color(g.WHITE, g.BLACK); g.print(" "); //インベーダを消す enemy_x = enemy_x + enemy_dir; enemy_y++; if(enemy_x > WIDTH-1 || enemy_x < 0){ enemy_dir = -enemy_dir; enemy_x = enemy_x + enemy_dir; } if(enemy_y > HEIGHT-1) { enemy_y = 1; } if(enemy_x == missile_x && enemy_y == missile_y){ //インベーダにミサイル命中 missile_state=3; g.locate(enemy_x,enemy_y); g.color(g.RED, g.BLACK); g.print("●"); g.playM("N8"); score = score + POINT; g.locate(8,0); g.color(g.WHITE, g.BLACK); g.print(score); enemy_x = 0; enemy_y = 1; enemy_dir=1; }else{ //インベーダ再描画 g.locate(enemy_x,enemy_y); g.color(g.MAGENTA, g.BLACK); g.print("Ж"); } if(enemy_x == x && enemy_y == y){ g.locate(enemy_x,enemy_y); g.color(g.RED, g.BLACK); g.print("★"); g.playM("N"); game_over = true; break; //leave for loop } } //プレイヤー移動 playercounter++; if(playercounter>PLAYERSPEED){ playercounter=0; //ユーザキー入力 key = g.inkey(); if((key == 'a' || key == 'j' || key == '←') && 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("▲"); } if((key == 'd' || key == 'l' || key == '→') && x < WIDTH-1){ 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("▲"); } if((key == 'w' || key == 'i' || key == '↑') && y > 1){ g.locate(x,y); g.color(g.WHITE, g.BLACK); g.print(" ");//プレイヤーを消す y--; g.locate(x,y); g.color(g.CYAN, g.BLACK); g.print("▲"); } if((key == 's' || key == 'k' || key == '↓') && y < HEIGHT-1){ g.locate(x,y); g.color(g.WHITE, g.BLACK); g.print(" ");//プレイヤーを消す y++; g.locate(x,y); g.color(g.CYAN, g.BLACK); g.print("▲"); } //相手または相手ミサイルに当たったか if((enemy_x == x && enemy_y == y) || (enemy_missle_x == x && enemy_missile_y == y)){ g.locate(x,y); g.color(g.RED, g.BLACK); g.print("★"); g.playM("N"); game_over = true; } } //自ミサイル移動 missilecounter++; if(missilecounter>MISSILESPEED){ missilecounter=0; if((key == ' ') && missile_state == 0){ //ミサイル発射 missile_state = 1; missile_x = x; missile_y = y-1; } if(missile_state == 1){ g.locate(missile_x, missile_y); g.color(g.YELLOW, g.BLACK); g.print("!"); missile_state=2; }else if(missile_state == 2 || missile_state==3){ //ミサイル発射中 g.locate(missile_x, missile_y); g.color(g.WHITE, g.BLACK); g.print(" ");//ミサイルを消す missile_y = missile_y-1; if(missile_state==3){ //爆発の後処理 missile_y = 0; } if(missile_y < 1){ missile_state = 0; }else if(missile_x == enemy_x && missile_y == enemy_y){ //ミサイル命中 missile_state=3; g.locate(missile_x, missile_y); g.color(g.RED, g.BLACK); g.print("●"); g.playM("N8"); score = score + POINT; g.locate(8,0); g.color(g.WHITE, g.BLACK); g.print(score); enemy_x = 0; enemy_y = 1; enemy_dir=1; }else { g.locate(missile_x, missile_y); g.color(g.YELLOW, g.BLACK); g.print("!"); } } } //相手ミサイル移動 enemymissilecounter++; if(enemymissilecounter>ENEMYMISSILESPEED){ enemymissilecounter=0; if(enemy_missile_state == 0 && (Math.random()<0.1)){ //ミサイル発射 enemy_missile_state = 1; enemy_missile_x = enemy_x; enemy_missile_y = enemy_y+1; } if(enemy_missile_state == 1){ g.locate(enemy_missile_x, enemy_missile_y); g.color(g.RED, g.BLACK); g.print("↓"); enemy_missile_state=2; }else if(enemy_missile_state == 2 || enemy_missile_state==3){ //相手ミサイル発射中 g.locate(enemy_missile_x, enemy_missile_y); g.color(g.WHITE, g.BLACK); g.print(" ");//ミサイルを消す enemy_missile_y = enemy_missile_y+1; if(enemy_missile_state==3){ //爆発の後処理 enemy_missile_y = 0; } if(enemy_missile_y >= HEIGHT){ enemy_missile_state = 0; }else if(enemy_missile_x == x && enemy_missile_y == y){ //ミサイル命中 enemy_missile_state=3; g.locate(enemy_missile_x, enemy_missile_y); g.color(g.RED, g.BLACK); g.print("★"); g.playM("N"); game_over = true; }else { g.locate(enemy_missile_x, enemy_missile_y); g.color(g.RED, g.BLACK); g.print("↓"); } } } g.sleep(SLEEP); }//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 Shooting