「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: }
戻る