/************************/ /* シューティングゲーム */ /************************/ import java.awt.*; import java.awt.event.*; import java.applet.*; import java.util.*; public class Game1 extends Applet implements Runnable { boolean state = true, fire = false, game = true; int xt, yt, vx, vy, x, y, r = 25, sp = 5, target = 0; Dimension d; Thread th; Random rn; public void init() { // 背景色 setBackground(new Color(238, 255, 238)); // 初期設定 d = getSize(); x = d.width / 2 - 10; y = d.height - 20; rn = new Random(); // キーリスナの付加 addKeyListener(new Key_e()); // スレッドの生成 th = new Thread(this); th.start(); } public Insets getInsets() { return new Insets(0, 0, 0, 0); } public void stop() { state = false; } public void run() { double ang, x1, y1; while (state) { try { th.sleep(33); } catch (InterruptedException e) {} // ターゲットの移動と消滅 if (target == 1) { // ゲームオーバ x1 = xt + r - (x + 10); y1 = yt + r - (y + 10); if (Math.sqrt(x1*x1+y1*y1) < r+10) game = false; // ゲームオーバでない // 命中 else if (fire && xt <= x+10 && xt > x+10-2*r) target = 2; // 命中しない else { xt += vx; yt += vy; if (xt < -2*r || xt > d.width || yt > d.height) target = 0; } } // ターゲットの生成 else if (target == 0){ target = 1; xt = (int)((d.width - 2 * r) * rn.nextDouble()); yt = -r; ang = 0.5 * Math.PI * rn.nextDouble() + 0.25 * Math.PI; vx = (int)(sp * Math.cos(ang)); vy = (int)(sp * Math.sin(ang)); } // 再描画 repaint(); } } public void paint (Graphics g) { // ゲーム中 if (game) { // 砲台の表示 g.fill3DRect(x, y, 20, 20, true); // ターゲットの表示 if (target > 0) { if (target == 1) g.setColor(Color.green); else { g.setColor(Color.pink); target = 0; } g.fillOval(xt, yt, 2*r, 2*r); } // レーザ砲の発射 if (fire){ g.setColor(Color.red); g.drawLine(x+9, 0, x+9, d.height-10); g.drawLine(x+10, 0, x+10, d.height-10); g.drawLine(x+11, 0, x+11, d.height-10); fire = false; } } // ゲームオーバ else { Font f = new Font("TimesRoman", Font.BOLD, 50); g.setFont(f); g.drawString("Game Over", d.width/2-130, d.height/2); state = false; } } public boolean isFocusable() { return true; } class Key_e extends KeyAdapter { public void keyPressed(KeyEvent e) { if (e.getKeyCode() == 37) // 左矢印 x -= 20; else if (e.getKeyCode() == 39) // 右矢印 x += 20; if (e.isShiftDown()) // Shift キー fire = true; } } }