「UFOゲーム」のソース

  1: require diksam.window;
  2: 
  3: // ウインドウ属性を設定するオブジェクトWindowAttributeの作成。
  4: WindowAttribute attr = create_window_attribute();
  5: // 背景色を黒に。
  6: attr.background = create_solid_brush(0, 0, 0);
  7: 
  8: // ウインドウの作成。デフォルト設定でよければ、
  9: // attrは作成せずnullを与えればよい。
 10: Window w = create_window("UFOゲーム", 800, 600, attr);
 11: 
 12: // ×ボタンで終了するように。
 13: w.set_destroy_proc(window_destroy_and_exit);
 14: // ウインドウを表示する。
 15: w.show();
 16: 
 17: // ウインドウに描画するためのGraphicsインタフェースの取得。
 18: Graphics g = w.get_graphics();
 19: // 文字の背景色を黒にする。
 20: g.set_background_color(new Color(0, 0, 0));
 21: 
 22: // 戦車、ビーム、UFOの色設定。
 23: Color tank_color = new Color(60, 255, 100);
 24: Color ufo_color = new Color(60, 255, 255);
 25: Color beam_color = new Color(255, 255, 100);
 26: // フォントの作成。詳細設定には、WindowAttributeと同じく
 27: // FontAttributeを指定するが、今回はデフォルトなのでnull。
 28: Font font = create_font(25, null);
 29: 
 30: // 乱数の初期化
 31: randomize();
 32: 
 33: // ゲームオーバー後、ゲームを再開するためのループ
 34: for (;;) {
 35:     // 砲台(tank)、ufoの座標設定。tank_x, ufo_x, ufo_yは現在の座標を、
 36:     // prevの付いたものは、直前の描画座標(消去に使用する)を、
 37:     // ufo_next_x, yは、ufoの移動の目標となる座標を意味する。
 38:     // ufoは、ufo_next_x, yに近づくように移動し、いずれかが一致した時点で
 39:     // ufo_next_x, yは再設定される。
 40:     int tank_x = 0;
 41:     int ufo_x = 0;
 42:     int ufo_y = 0;
 43:     int ufo_prev_x = ufo_x;
 44:     int ufo_prev_y = ufo_y;
 45:     int ufo_next_x = random(700);
 46:     int ufo_next_y = random(450);
 47:     // 砲台が発射するビームの存在フラグと座標
 48:     boolean beam_flag = false;
 49:     int beam_prev_y;
 50:     int beam_x;
 51:     int beam_y;
 52: 
 53:     // ゲームのメインループ
 54:     for (;;) {
 55:         // 直前に描画していたUFOを消去
 56:         g.draw_string(font, ufo_color, ufo_prev_x, ufo_prev_y, "    ");
 57:         // UFOを描画する。
 58:         g.draw_string(font, ufo_color, ufo_x, ufo_y, "├○┤");
 59:         // 次の消去のために、描画座標を待避
 60:         ufo_prev_x = ufo_x;
 61:         ufo_prev_y = ufo_y;
 62:         // 砲台の描画
 63:         g.draw_string(font, tank_color, tank_x, 540, " /┴\ ");
 64:         // ビームが発射されていたら…
 65:         if (beam_flag) {
 66:             // 直前のビームを消して、新たにビームを描く。
 67:             g.draw_string(font, beam_color, beam_x, beam_prev_y, " ");
 68:             g.draw_string(font, beam_color, beam_x, beam_y, "|");
 69:             beam_prev_y = beam_y;
 70: 
 71:             // 衝突判定。甘いかも。
 72:             if (beam_x >= ufo_x && beam_x < ufo_x + 80
 73:                 && beam_y >= ufo_y && beam_y < ufo_y + 60) {
 74:                 // ビームが当たったら、メインループを抜ける。
 75:                 break;
 76:             }
 77:         }
 78: 
 79:         // 砲台の移動のためのキー入力判定。
 80:         if (is_key_pressed(KeyCode.LEFT) && tank_x > 0) {
 81:             tank_x -= 10;
 82:         } elsif (is_key_pressed(KeyCode.RIGHT) && tank_x < 700) {
 83:             tank_x += 10;
 84:         }
 85:         if (is_key_pressed(KeyCode.SPACE) && !beam_flag) {
 86:             beam_flag = true;
 87:             beam_x = tank_x + 40;
 88:             beam_y = beam_prev_y = 480;
 89:         }
 90:         // UFOの移動。ufo_next_x, yに対して近づくように移動。
 91:         if (ufo_x < ufo_next_x - 10) {
 92:             ufo_x += 10;
 93:         } elsif (ufo_x > ufo_next_x + 10) {
 94:             ufo_x -= 10;
 95:         } else {
 96:             // ある程度一致したら、目標座標を再設定する。
 97:             ufo_next_x = random(700);
 98:         }
 99:         if (ufo_y < ufo_next_y - 10) {
100:             ufo_y += 10;
101:         } elsif (ufo_y > ufo_next_y + 10) {
102:             ufo_y -= 10;
103:         } else {
104:             ufo_next_y = random(450);
105:         }
106:         // ビームの移動
107:         if (beam_flag) {
108:             if (beam_y < -20) {
109:                 beam_flag = false;
110:             }
111:             beam_y -= 20;
112:         }
113:         // 時限メッセージループ。マウスやキーボードのイベントの
114:         // 有無に関わらず、20ミリ秒で抜ける。
115:         timed_message_loop(w, 20);
116:     }
117: 
118:     // ビームが当たってループを抜けると、ここに来る。
119:     for (;;) {
120:         // 爆発パターンの表示
121:         Color explosion_color = new Color(255, 0, 0);
122:         g.draw_string(font, explosion_color, ufo_x, ufo_y, "***");
123:         timed_message_loop(w, 100);
124:         g.draw_string(font, explosion_color, ufo_x, ufo_y, "###");
125:         timed_message_loop(w, 100);
126:         // Nが押されたら再ゲームスタート、Qが押されたら終了。
127:         if (is_key_pressed(KeyCode.N)) {
128:             Brush b = create_solid_brush(0, 0, 0);
129:             g.fill_rectangle(b, 0, 0, 800, 600);
130:             b.dispose();
131:             break;
132:         } elsif (is_key_pressed(KeyCode.Q)) {
133:             exit(0);
134:         }
135:     }
136: }

戻る