import jp.ac.tuis.basic.*; public class Invader3D{ public static void main(String[] args){ //変数初期化 int WIDTH=40; int HEIGHT=25; int FONT=20; BasicGraphics g = new BasicGraphics(WIDTH,HEIGHT,FONT); int x=WIDTH/2; int y=HEIGHT-3; int alien_x=0; int alien_y=12; 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; //画面の初期化 g.depth(3);//3D立体表示 g.console(false); g.color(g.WHITE, g.BLACK); g.cls(); for(int i=0; i<1000; i++){ g.pset((int)(Math.random()*(WIDTH*FONT)), (int)(Math.random()*(HEIGHT*FONT*4.0/3.0))); } g.locate(2,y+2); g.color(g.WHITE, g.BLACK); g.print("SCORE : 0"); g.color(g.GREEN, g.BLACK); g.locate(0,y+1); g.print("/ ̄\_/ ̄\_/ ̄\_/ ̄\_/ ̄\_"); g.print("/ ̄\_/ ̄\_/ ̄\_/ ̄\_/ ̄\_"); g.locate(x,y); g.color(g.CYAN, g.BLACK); g.print("▲"); g.beep(); //リターンキーが押されるまで待つ int message_y=0, message_dir=1; while(true){ g.locate((WIDTH-11)/2, message_y); g.color(g.WHITE, g.BLACK); g.print("PRESS ENTER"); g.sleep(200); g.locate((WIDTH-11)/2, message_y); g.print(" "); message_y+=message_dir; if(message_y>=y){ message_y=y-2; message_dir=-1; } if(message_y<1){ message_y=2; message_dir=1; } key = g.inkey(); if(key=='\n') break; } g.playM("DECcg"); //メインループ while(!game_over){ //インベーダ移動 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-1 || alien_x < 0){ alien_dir = -alien_dir; alien_x = alien_x + alien_dir; alien_y++; if(alien_y >= y){ game_over = true; } } if(alien_x == missile_x && alien_y == missile_y){ //インベーダにミサイル命中 g.locate(alien_x,alien_y); g.color(g.RED, g.BLACK); g.print("●"); g.playM("N"); score = score + POINT; g.locate(10,y+2); g.color(g.WHITE, g.BLACK); g.print(score); alien_x = 0; alien_y = 12; 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("Ж"); } if(game_over){ break; //leave for loop } g.sleep(SLEEP/level); }//end for(i=0; i 0){ g.locate(x,y); g.color(g.WHITE, g.BLACK); g.print((char)0);//プレイヤーを消す 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((char)0);//プレイヤーを消す x++; g.locate(x,y); g.color(g.CYAN, g.BLACK); g.print("▲"); } 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((char)0);//ミサイルを消す missile_y = missile_y-1; if(missile_y < 12){ 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.playM("N"); score = score + POINT; g.locate(10,y+2); g.color(g.WHITE, g.BLACK); g.print(score); alien_x = 0; alien_y = 12; 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) int i=0, dir=1; while(true){ g.locate((WIDTH-9)/2, i); g.color(g.WHITE, g.BLACK); g.print("GAME OVER"); g.sleep(200); g.locate((WIDTH-9)/2, i); g.print(" "); i=i+dir; if(i>=y){ i=y-2; dir=-1; } if(i<1){ i=2; dir=1; } } }//end main }//end class Invader3D