| 情報学部 | 菅沼ホーム | Java 目次 | 索引 |
01 /****************************/
02 /* タワーディフェンスゲーム */
03 /* coded by Y.Suganuma */
04 /****************************/
05 import java.awt.*;
06 import java.awt.event.*;
07 import javax.swing.*;
08 import main.*;
09 import map.*;
10
11 public class Game {
12 public static void main (String[] args)
13 {
14 Win win = new Win("タワーディフェンスゲーム");
15 }
16 }
17
18 class Win extends JFrame
19 {
20 /******************/
21 /* コンストラクタ */
22 /******************/
23 Win(String name)
24 {
25 // JFrameクラスのコンストラクタ(Windowのタイトルを引き渡す)
26 super(name);
27 // Windowの大きさ
28 setSize(960, 590); // 40+20, 70+20
29 // MainPanel の大きさを決定
30 Dimension size = getSize(); // パネルの大きさの取得
31 size.width -= 60;
32 size.height -= 90;
33 // ContentPain を取得し,設定
34 Container CP = getContentPane(); // ContentPane を取得
35 CP.setLayout(null); // レイアウトマネージャを停止
36 CP.setBackground(new Color(220, 255, 220)); // 背景色
37 // マップ画像の読み込み
38 Map.block_image[0] = getToolkit().getImage("game/image/barrier1.jpg");
39 Map.block_image[1] = getToolkit().getImage("game/image/barrier2.jpg");
40 // MainPanel オブジェクトの追加
41 MainPanel pn = new MainPanel(size); // MainPanel オブジェクトの生成
42 CP.add(pn); // MainPanel オブジェクトを ContentPane に追加
43 pn.setSize(size.width, size.height);
44 pn.setLocation(10, 10);
45 // ウィンドウを表示
46 setVisible(true);
47 // イベントリスナ
48 addWindowListener(new WinEnd());
49 }
50
51 /******************************/
52 /* 上,左,下,右の余白の設定 */
53 /******************************/
54 public Insets getInsets()
55 {
56 return new Insets(50, 20, 20, 20);
57 }
58
59 /************/
60 /* 終了処理 */
61 /************/
62 class WinEnd extends WindowAdapter
63 {
64 public void windowClosing(WindowEvent e) {
65 System.exit(0);
66 }
67 }
68 }
01 package main;
02
03 import java.awt.*;
04 import java.awt.event.*;
05 import javax.swing.*;
06 import start.*;
07 import game.*;
08 import clear.*;
09 import over.*;
10
11 public class MainPanel extends JPanel implements Runnable
12 {
13 Dimension size; // パネルの大きさ
14 boolean in_game = true; // ゲーム実行中はtrue
15 public int state = 0; // ゲーム状態(0:表紙,1:ゲーム,2:クリア,3:オーバー,4:終了)
16 int old_state = 0; // 直前のゲーム状態
17 public int n_enemy[] = new int [2]; // 敵の数
18 public int n_friend[] = new int [2]; // 味方の数
19 StartPanel sp;
20 GamePanel gp;
21 GameClearPanel gcp;
22 GameOverPanel gop;
23 Thread td;
24 // コンストラクタ
25 public MainPanel(Dimension size1)
26 {
27 size = size1;
28 // グリッドレイアウト
29 setLayout(new GridLayout(1, 1, 0, 0));
30 // ゲームパネルの生成
31 sp = new StartPanel(size, this); // スタート(タイトル)
32 add(sp);
33 // スレッドの生成
34 td = new Thread(this);
35 td.start();
36 }
37 // ゲームの状態を変更
38 public void run()
39 {
40 while (in_game) {
41 try {
42 td.sleep(100); // 100 ms 毎の実施
43 }
44 catch (InterruptedException e) {}
45 if (state != old_state) {
46 // 前のパネルの削除
47 if (old_state == 0)
48 remove(sp);
49 else if (old_state == 1)
50 remove(gp);
51 else if (old_state == 2)
52 remove(gcp);
53 else
54 remove(gop);
55 // 新しいパネルの追加
56 if (state == 4) // ゲーム終了
57 in_game = false;
58 else {
59 if (state == 0) { // StartPanel
60 sp = new StartPanel(size, this);
61 add(sp);
62 }
63 else if (state == 1) { // GamePanel
64 gp = new GamePanel(size, this);
65 add(gp);
66 }
67 else if (state == 2) { // GameClearPanel
68 gcp = new GameClearPanel(size, this);
69 add(gcp);
70 }
71 else { // GameOverPanel
72 gop = new GameOverPanel(size, this);
73 add(gop);
74 }
75 validate();
76 old_state = state;
77 }
78 }
79 }
80 }
81 }
001 package map;
002
003 import java.awt.*;
004
005 public class Map
006 {
007 // ブロック画像
008 public static Image block_image[] = new Image [2];
009 // ブロックの大きさ
010 public static int block_width = 25; // ブロックの幅
011 public static int block_height = 25; // ブロックの高さ
012 // マップ
013 public static int map_row = 20; // マップの行数
014 public static int map_col = 30; // マップの列数
015 // マップ1
016 public static int map1[][][] = {{
017 {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
018 {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0},
019 {0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 0, 1, 0, 1, 1, 0, 0, 0, 1, 1, 1, 1, 0, 0},
020 {0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 2, 0, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 1, 0, 0},
021 {0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0},
022 {0, 0, 0, 0, 1, 0, 1, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 0},
023 {0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 1, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0},
024 {0, 0, 0, 0, 1, 0, 1, 0, 0, 2, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0},
025 {0, 0, 2, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 2, 0, 2, 1, 0, 0, 2, 0, 0, 0, 0, 0, 1, 0, 0, 0},
026 {0, 0, 0, 0, 0, 0, 1, 0, 0, 2, 2, 2, 2, 0, 2, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0},
027 {0, 0, 0, 0, 2, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 2, 0, 0, 0, 2, 0, 0, 1, 0, 0},
028 {0, 0, 0, 0, 2, 0, 1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 2, 0, 0, 0, 2, 0, 0, 0, 2, 2, 0, 0, 0, 0},
029 {0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 2, 2, 2, 0, 0, 0, 0, 1, 0, 0},
030 {0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0},
031 {0, 0, 0, 0, 1, 1, 1, 0, 1, 0, 0, 0, 0, 1, 1, 1, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0},
032 {0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 2, 2, 0, 0, 0, 0, 0, 0},
033 {0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 2, 0, 0, 0, 0, 1, 0, 1, 0, 0},
034 {0, 0, 0, 0, 1, 1, 0, 2, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0},
035 {0, 0, 1, 0, 0, 1, 0, 0, 0, 2, 2, 2, 0, 0, 0, 1, 0, 1, 0, 0, 2, 0, 0, 0, 0, 1, 0, 1, 0, 0},
036 {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}},
037 // マップ2
038 {{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
039 {0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
040 {0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 2, 2, 0, 0, 0, 0, 1, 0, 2, 2, 0, 0},
041 {0, 0, 0, 0, 1, 0, 0, 1, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 2, 2, 0, 1, 0, 1, 0, 0, 2, 2, 0, 0},
042 {0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
043 {0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 0, 0, 1, 0, 0, 1, 0, 2, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0},
044 {0, 0, 0, 0, 2, 0, 2, 0, 0, 0, 0, 0, 2, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0},
045 {0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 2, 2, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 2, 0, 0, 0},
046 {0, 0, 0, 0, 0, 2, 0, 0, 1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
047 {0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 2, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0},
048 {0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 2, 1, 0, 0, 1, 0, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0},
049 {0, 0, 0, 0, 0, 2, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0},
050 {0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 2, 2, 0, 0, 0, 1, 0, 1, 0, 0, 1, 0, 0, 2, 0, 0, 0, 0, 0},
051 {0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 0, 1, 0, 0},
052 {0, 0, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0},
053 {0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0},
054 {0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0},
055 {0, 0, 0, 0, 1, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
056 {0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0},
057 {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}},
058 // マップ3
059 {{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
060 {0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0},
061 {0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 0, 0},
062 {0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 0, 2, 0, 0, 1, 1, 0, 1, 0, 0, 0},
063 {0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0},
064 {0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 2, 0, 0, 0, 1, 0, 1, 1, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0},
065 {0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 0, 0, 1, 0, 1, 0, 0, 2, 0, 0, 0, 0, 0, 1, 0, 0},
066 {0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 1, 1, 1, 0, 2, 0, 0, 1, 0, 0, 0, 0, 0, 0},
067 {0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 2, 0, 0, 0},
068 {0, 0, 0, 0, 0, 2, 0, 0, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0},
069 {0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0},
070 {0, 0, 0, 0, 2, 0, 0, 2, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 2, 2, 0, 2, 2, 2, 0, 0},
071 {0, 0, 0, 0, 0, 2, 0, 0, 2, 0, 0, 0, 1, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0},
072 {0, 0, 0, 2, 0, 0, 2, 0, 0, 0, 2, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0},
073 {0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 1, 1, 0, 0},
074 {0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 2, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0},
075 {0, 0, 0, 2, 0, 1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0},
076 {0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 2, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0},
077 {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0},
078 {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}},
079 // 新規
080 {{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
081 {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
082 {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
083 {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
084 {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
085 {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
086 {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
087 {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
088 {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
089 {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
090 {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
091 {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
092 {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
093 {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
094 {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
095 {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
096 {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
097 {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
098 {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
099 {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}};
100 // 使用するマップ
101 public static int map[][];
102 }
int x[][] = new int [2][3];
int x[][] = new int [2][]; x[0] = new int [3]; // 以下,繰り返し文を使用可能 x[1] = new int [3];
int x[][] = {{1, 2, 3}, {4, 5, 6}}; // 内側の括弧が各行に相当
int x1[] = {1, 2, 3};
int x2[] = {4, 5, 6};
int x[][] = {x1, x2};

001 package start;
002
003 import java.awt.*;
004 import java.awt.event.*;
005 import javax.swing.*;
006 import main.*;
007 import map.*;
008
009 public class StartPanel extends JPanel implements ActionListener
010 {
011 boolean in_game = true;
012 Dimension size; // パネルの大きさ
013 MainPanel mp;
014 JButton b_use, b_map, b_game;
015 JTextField em1, em2, fr1, fr2, map;
016 // コンストラクタ
017 public StartPanel(Dimension size1, MainPanel mp1)
018 {
019 size = size1;
020 mp = mp1;
021 // レイアウトマネージャの停止
022 setLayout(null);
023 // 背景色の設定
024 setBackground(Color.white);
025 // 実行条件設定エリア
026 Font f = new Font("SansSerif", Font.BOLD, 20);
027 FontMetrics fm = getFontMetrics(f);
028 String str;
029 int x, y, w1, w2, w3, h;
030 // 敵
031 x = 0;
032 str = "敵の数: 敵1:";
033 JLabel lb1 = new JLabel(str, JLabel.CENTER);
034 lb1.setFont(f);
035 w1 = fm.stringWidth(str);
036 h = fm.getHeight();
037 lb1.setSize(w1, h);
038 y = size.height - h - 10;
039 x += w1;
040
041 em1 = new JTextField("10", 2);
042 em1.setFont(f);
043 em1.setSize(30, h);
044 em1.setHorizontalAlignment(JTextField.RIGHT);
045 x += 30;
046
047 str = " 敵2:";
048 w2 = fm.stringWidth(str);
049 JLabel lb2 = new JLabel(str, JLabel.CENTER);
050 lb2.setFont(f);
051 lb2.setSize(w2, h);
052 x += w2;
053
054 em2 = new JTextField("5", 2);
055 em2.setFont(f);
056 em2.setSize(30, h);
057 em2.setHorizontalAlignment(JTextField.RIGHT);
058 x += 30;
059
060 x = size.width / 2 - x / 2;
061 lb1.setLocation(x, y);
062 add(lb1);
063 x += w1;
064 em1.setLocation(x, y);
065 add(em1);
066 x += 30;
067 lb2.setLocation(x, y);
068 add(lb2);
069 x += w2;
070 em2.setLocation(x, y);
071 add(em2);
072 // 味方
073 x = 0;
074 str = "味方の数制限: 味方1:";
075 JLabel lb3 = new JLabel(str, JLabel.CENTER);
076 lb3.setFont(f);
077 w1 = fm.stringWidth(str);
078 h = fm.getHeight();
079 lb3.setSize(w1, h);
080 y -= (h + 10);
081 x += w1;
082
083 fr1 = new JTextField("10", 2);
084 fr1.setFont(f);
085 fr1.setSize(30, h);
086 fr1.setHorizontalAlignment(JTextField.RIGHT);
087 x += 30;
088
089 str = " 味方2:";
090 w2 = fm.stringWidth(str);
091 JLabel lb4 = new JLabel(str, JLabel.CENTER);
092 lb4.setFont(f);
093 lb4.setSize(w2, h);
094 x += w2;
095
096 fr2 = new JTextField("4", 2);
097 fr2.setFont(f);
098 fr2.setSize(30, h);
099 fr2.setHorizontalAlignment(JTextField.RIGHT);
100 x += 30;
101
102 x = size.width / 2 - x / 2;
103 lb3.setLocation(x, y);
104 add(lb3);
105 x += w1;
106 fr1.setLocation(x, y);
107 add(fr1);
108 x += 30;
109 lb4.setLocation(x, y);
110 add(lb4);
111 x += w2;
112 fr2.setLocation(x, y);
113 add(fr2);
114 // マップ
115 x = 0;
116 str = "使用するマップ:";
117 JLabel lb5 = new JLabel(str, JLabel.CENTER);
118 lb5.setFont(f);
119 w1 = fm.stringWidth(str);
120 h = fm.getHeight();
121 lb5.setSize(w1, h);
122 y -= (h + 10);
123 x += w1;
124
125 map = new JTextField("1", 2);
126 map.setFont(f);
127 map.setSize(30, h);
128 map.setHorizontalAlignment(JTextField.RIGHT);
129 x += 30;
130
131 x = size.width / 2 - x / 2;
132 lb5.setLocation(x, y);
133 add(lb5);
134 x += w1;
135 map.setLocation(x, y);
136 add(map);
137 // ボタンの配置
138 x = 0;
139 str = "遊び方";
140 w1 = fm.stringWidth(str) + 40;
141 h = fm.getHeight() + 10;
142 b_use = new JButton(str);
143 b_use.setFont(f);
144 b_use.addActionListener(this);
145 b_use.setSize(w1, h);
146 y -= (h + 10);
147 x += w1;
148
149 str = "マップ編集";
150 w2 = fm.stringWidth(str) + 40;
151 b_map = new JButton(str);
152 b_map.setFont(f);
153 b_map.addActionListener(this);
154 b_map.setSize(w2, h);
155 x += w2;
156
157 str = "ゲーム開始";
158 w3 = fm.stringWidth(str) + 40;
159 b_game = new JButton(str);
160 b_game.setFont(f);
161 b_game.addActionListener(this);
162 b_game.setSize(w3, h);
163 x += w3;
164
165 x = size.width / 2 - x / 2 - 5;
166 b_use.setLocation(x, y);
167 add(b_use);
168 x += (w1 + 5);
169 b_map.setLocation(x, y);
170 add(b_map);
171 x += (w2 + 5);
172 b_game.setLocation(x, y);
173 add(b_game);
174 }
175 // 描画
176 public void paintComponent(Graphics g)
177 {
178 super.paintComponent(g); // 親クラスの描画
179 FontMetrics fm;
180 Font f;
181 String str;
182 int w, h;
183
184 f = new Font("SansSerif", Font.BOLD, 40);
185 fm = g.getFontMetrics(f);
186 str = "タワーディフェンスゲーム";
187 w = fm.stringWidth(str);
188 h = fm.getHeight();
189 g.setFont(f);
190 g.drawString(str, size.width/2-w/2, size.height/2);
191 }
192 // ボタンがクリックされたときの処理
193 public void actionPerformed(ActionEvent e)
194 {
195 // 遊び方
196 if (e.getSource() == b_use) {
197 Method db = new Method();
198 db.setVisible(true);
199 requestFocusInWindow();
200 }
201 // ゲームクリア画面とゲームオーバー画面の確認
202 else if (e.getSource() == b_map) {
203 in_game = false;
204 mp.state = 2; // ゲームクリア
205 // mp.state = 3; // ゲームオーバー
206 }
207 // ゲーム開始
208 else if (e.getSource() == b_game) {
209 int k = Integer.parseInt(map.getText()) - 1;
210 if (k < 0 || k > 3)
211 k = 0;
212 Map.map = Map.map1[k]; // 使用するマップ
213 mp.n_friend[0] = Integer.parseInt(fr1.getText()); // 味方1の数
214 mp.n_friend[1] = Integer.parseInt(fr2.getText()); // 味方2の数
215 mp.n_enemy[0] = Integer.parseInt(em1.getText()); // 敵1の数
216 mp.n_enemy[1] = Integer.parseInt(em2.getText()); // 敵2の数
217 mp.state = 1;
218 }
219 }
220 }
221
222 /******************/
223 /* ゲームの遊び方 */
224 /******************/
225 class Method extends JDialog
226 {
227 // コンストラクタ
228 Method()
229 {
230 setTitle("ゲームの遊び方");
231 // ContetPain
232 Container cp = getContentPane();
233 cp.setLayout(new FlowLayout(FlowLayout.CENTER));
234 cp.setBackground(new Color(220, 255, 220)); // 背景色
235 Font f = new Font("MS 明朝", Font.PLAIN, 20);
236 setSize(850, 370);
237 // TextArea の追加
238 JTextArea ta = new JTextArea(15, 80);
239 ta.setFont(f);
240 ta.setEditable(false);
241 ta.setLineWrap(true);
242 ta.setText(" 左からランダムに現れる敵に対して,味方を適当な位置に配置することによって,敵が領域の右端に達するのを防ぐ.すべての敵を消滅させることができればゲームクリア,敵の一つでも領域の右端に達すればゲームオーバーとなる.\n");
243
244 ta.append("\n");
245 ta.append("Ⅰ.味方\n");
246 ta.append(" a.味方1: 配置したい位置をマウスでクリックした後,1 のキーを押せば( 3 のキーを押せばキャンセル)配置され,左方向に動き出す.敵と接触することによって敵を消滅させることができる.配置できる上限数のデフォルトは 10 である.\n");
247 ta.append(" b.味方2: 配置したい位置をマウスでクリックした後,2 のキーを押せば( 3 のキーを押せばキャンセル)配置される.その位置に停止したままであるが,その近傍を通過した敵を消滅させることができる.配置できる上限数のデフォルトは 4 である.\n");
248 ta.append("\n");
249 ta.append("Ⅱ.敵\n");
250 ta.append(" a.敵1: 左端から現れ,右方向に,障害物を避けながら動く.敵1の数のデフォルトは 10 である.\n");
251 ta.append(" b.敵2: 左端から現れ,右方向に,障害物を無視して動く.敵2の数のデフォルトは 5 である.\n");
252 ta.append("\n");
253 ta.append("Ⅲ.マップの編集: 既に存在する 3 種類のマップを編集したり,新しいマップを作成することができるが,マップの保存機能は持っていない.使用するマップを 1 から 4 で指定する( 4 は障害物が何も無いマップ).マップを編集したい場合は,「マップ編集」ボタンをクリックした後,障害物を配置したい位置をマウスでクリックし,1,または,2 のキーを押せば配置される.また,0 のキーを押せば障害物が無くなる.\n");
254 JScrollPane scroll = new JScrollPane(ta);
255 cp.add(scroll);
256 // Window を閉じるため
257 addWindowListener(new WinEnd());
258 }
259 // 終了処理
260 class WinEnd extends WindowAdapter
261 {
262 public void windowClosing(WindowEvent e) {
263 setVisible(false);
264 }
265 }
266 }
01 package game;
02
03 import java.awt.*;
04 import java.awt.event.*;
05 import javax.swing.*;
06 import main.*;
07 import map.*;
08
09 public class GamePanel extends JPanel
10 {
11 Dimension size; // パネルの大きさ
12 MainPanel mp;
13 // コンストラクタ
14 public GamePanel(Dimension size1, MainPanel mp1)
15 {
16 size = size1;
17 mp = mp1;
18 // レイアウトマネージャの停止
19 setLayout(null);
20 // 背景色の設定
21 setBackground(Color.white);
22 }
23 // 描画
24 public void paintComponent(Graphics g)
25 {
26 super.paintComponent(g); // 親クラスの描画
27 // 背景の描画
28 for (int i1 = 0; i1 < Map.map_col; i1++) {
29 int x = i1 * Map.block_width;
30 for (int i2 = 0; i2 < Map.map_row; i2++) {
31 if (Map.map[i2][i1] > 0) {
32 int y = i2 * Map.block_height;
33 g.drawImage(Map.block_image[Map.map[i2][i1]-1], x, y, Map.block_width, Map.block_height, this);
34 }
35 }
36 }
37 }
38 }
package clear;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import main.*;
public class GameClearPanel extends JPanel implements ActionListener
{
Dimension size; // パネルの大きさ
MainPanel mp;
JButton bt1, bt2, bt3;
// コンストラクタ
public GameClearPanel(Dimension size1, MainPanel mp1)
{
size = size1;
mp = mp1;
// レイアウトマネージャの停止
setLayout(null);
// 背景色の設定
setBackground(Color.white);
// ボタンの配置
Font f = new Font("SansSerif", Font.BOLD, 20);
FontMetrics fm = getFontMetrics(f);
String str;
int x, y, w1, w2, w3, h;
x = 0;
str = "もう一度";
w1 = fm.stringWidth(str) + 40;
h = fm.getHeight() + 10;
bt1 = new JButton(str);
bt1.setFont(f);
bt1.addActionListener(this);
bt1.setSize(w1, h);
y = size.height - h - 10;
x += w1;
str = "スタート画面";
w2 = fm.stringWidth(str) + 40;
bt2 = new JButton(str);
bt2.setFont(f);
bt2.addActionListener(this);
bt2.setSize(w2, h);
x += w2;
str = "ゲーム終了";
w3 = fm.stringWidth(str) + 40;
bt3 = new JButton(str);
bt3.setFont(f);
bt3.addActionListener(this);
bt3.setSize(w3, h);
x += w3;
x = size.width / 2 - x / 2 - 5;
bt1.setLocation(x, y);
add(bt1);
x += (w1 + 5);
bt2.setLocation(x, y);
add(bt2);
x += (w2 + 5);
bt3.setLocation(x, y);
add(bt3);
}
// 描画
public void paintComponent(Graphics g)
{
super.paintComponent(g); // 親クラスの描画
Font f = new Font("SansSerif", Font.BOLD, 40);
FontMetrics fm = g.getFontMetrics(f);
String str = "Game Clear!";
int w = fm.stringWidth(str);
g.setFont(f);
g.drawString(str, size.width/2-w/2, size.height/2);
}
// ボタンがクリックされたときの処理
public void actionPerformed(ActionEvent e)
{
if (e.getSource() == bt1) // もう一度同じゲームを実行
mp.state = 1;
else if (e.getSource() == bt2) // スタート画面
mp.state = 0;
else if (e.getSource() == bt3) { // ゲーム終了
mp.state = 4;
bt1.setEnabled(false);
bt2.setEnabled(false);
bt3.setEnabled(false);
}
}
}
package over;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import main.*;
public class GameOverPanel extends JPanel implements ActionListener
{
Dimension size; // パネルの大きさ
MainPanel mp;
JButton bt1, bt2, bt3;
// コンストラクタ
public GameOverPanel(Dimension size1, MainPanel mp1)
{
size = size1;
mp = mp1;
// レイアウトマネージャの停止
setLayout(null);
// 背景色の設定
setBackground(Color.white);
// ボタンの配置
Font f = new Font("SansSerif", Font.BOLD, 20);
FontMetrics fm = getFontMetrics(f);
String str;
int x, y, w1, w2, w3, h;
x = 0;
str = "もう一度";
w1 = fm.stringWidth(str) + 40;
h = fm.getHeight() + 10;
bt1 = new JButton(str);
bt1.setFont(f);
bt1.addActionListener(this);
bt1.setSize(w1, h);
y = size.height - h - 10;
x += w1;
str = "スタート画面";
w2 = fm.stringWidth(str) + 40;
bt2 = new JButton(str);
bt2.setFont(f);
bt2.addActionListener(this);
bt2.setSize(w2, h);
x += w2;
str = "ゲーム終了";
w3 = fm.stringWidth(str) + 40;
bt3 = new JButton(str);
bt3.setFont(f);
bt3.addActionListener(this);
bt3.setSize(w3, h);
x += w3;
x = size.width / 2 - x / 2 - 5;
bt1.setLocation(x, y);
add(bt1);
x += (w1 + 5);
bt2.setLocation(x, y);
add(bt2);
x += (w2 + 5);
bt3.setLocation(x, y);
add(bt3);
}
// 描画
public void paintComponent(Graphics g)
{
super.paintComponent(g); // 親クラスの描画
Font f = new Font("SansSerif", Font.BOLD, 40);
FontMetrics fm = g.getFontMetrics(f);
String str = "Game Over!";
int w = fm.stringWidth(str);
g.setFont(f);
g.drawString(str, size.width/2-w/2, size.height/2);
}
// ボタンがクリックされたときの処理
public void actionPerformed(ActionEvent e)
{
if (e.getSource() == bt1) // もう一度同じゲームを実行
mp.state = 1;
else if (e.getSource() == bt2) // スタート画面
mp.state = 0;
else if (e.getSource() == bt3) { // ゲーム終了
mp.state = 4;
bt1.setEnabled(false);
bt2.setEnabled(false);
bt3.setEnabled(false);
}
}
}
01 package main; 02 03 import java.awt.*; 04 import java.awt.event.*; 05 import javax.swing.*; 06 import start.*; 07 import game.*; 08 import clear.*; 09 import over.*; 10 import map.*; 11 12 public class MainPanel extends JPanel implements Runnable 13 { 14 Dimension size; // パネルの大きさ 15 boolean in_game = true; // ゲーム実行中はtrue 16 public int state = 0; // ゲーム状態(0:表紙,1:ゲーム,2:クリア,3:オーバー,4:終了,5:マップ編集) 17 int old_state = 0; // 直前のゲーム状態 18 public int n_enemy[] = new int [2]; // 敵の数 19 public int n_friend[] = new int [2]; // 味方の数 20 StartPanel sp; 21 GamePanel gp; 22 GameClearPanel gcp; 23 GameOverPanel gop; 24 MapEdit map_edit; 25 Thread td; 26 // コンストラクタ 27 public MainPanel(Dimension size1) 28 { 29 size = size1; 30 // グリッドレイアウト 31 setLayout(new GridLayout(1, 1, 0, 0)); 32 // ゲームパネルの生成 33 sp = new StartPanel(size, this); // スタート(タイトル) 34 add(sp); 35 // スレッドの生成 36 td = new Thread(this); 37 td.start(); 38 } 39 // ゲームの状態を変更 40 public void run() 41 { 42 while (in_game) { 43 try { 44 td.sleep(100); // 100 ms 毎の実施 45 } 46 catch (InterruptedException e) {} 47 if (state != old_state) { 48 // 前のパネルの削除 49 if (old_state == 0) 50 remove(sp); 51 else if (old_state == 1) 52 remove(gp); 53 else if (old_state == 2) 54 remove(gcp); 55 else if (old_state == 3) 56 remove(gop); 57 else 58 remove(map_edit); 59 // 新しいパネルの追加 60 if (state == 4) // ゲーム終了 61 in_game = false; 62 else { 63 if (state == 0) { // StartPanel 64 sp = new StartPanel(size, this); 65 add(sp); 66 } 67 else if (state == 1) { // GamePanel 68 gp = new GamePanel(size, this); 69 add(gp); 70 } 71 else if (state == 2) { // GameClearPanel 72 gcp = new GameClearPanel(size, this); 73 add(gcp); 74 } 75 else if (state == 3) { // GameOverPanel 76 gop = new GameOverPanel(size, this); 77 add(gop); 78 } 79 else { // MapEdit 80 map_edit = new MapEdit(size, this); 81 add(map_edit); 82 } 83 validate(); 84 old_state = state; 85 } 86 } 87 } 88 } 89 }
001 package start;
002
003 import java.awt.*;
004 import java.awt.event.*;
005 import javax.swing.*;
006 import main.*;
007 import map.*;
008
009 public class StartPanel extends JPanel implements ActionListener
010 {
011 boolean in_game = true;
012 Dimension size; // パネルの大きさ
013 MainPanel mp;
014 JButton b_use, b_map, b_game;
015 JTextField em1, em2, fr1, fr2, map;
016 // コンストラクタ
017 public StartPanel(Dimension size1, MainPanel mp1)
018 {
019 size = size1;
020 mp = mp1;
021 // レイアウトマネージャの停止
022 setLayout(null);
023 // 背景色の設定
024 setBackground(Color.white);
025 // 実行条件設定エリア
026 Font f = new Font("SansSerif", Font.BOLD, 20);
027 FontMetrics fm = getFontMetrics(f);
028 String str;
029 int x, y, w1, w2, w3, h;
030 // 敵
031 x = 0;
032 str = "敵の数: 敵1:";
033 JLabel lb1 = new JLabel(str, JLabel.CENTER);
034 lb1.setFont(f);
035 w1 = fm.stringWidth(str);
036 h = fm.getHeight();
037 lb1.setSize(w1, h);
038 y = size.height - h - 10;
039 x += w1;
040
041 em1 = new JTextField("10", 2);
042 em1.setFont(f);
043 em1.setSize(30, h);
044 em1.setHorizontalAlignment(JTextField.RIGHT);
045 x += 30;
046
047 str = " 敵2:";
048 w2 = fm.stringWidth(str);
049 JLabel lb2 = new JLabel(str, JLabel.CENTER);
050 lb2.setFont(f);
051 lb2.setSize(w2, h);
052 x += w2;
053
054 em2 = new JTextField("5", 2);
055 em2.setFont(f);
056 em2.setSize(30, h);
057 em2.setHorizontalAlignment(JTextField.RIGHT);
058 x += 30;
059
060 x = size.width / 2 - x / 2;
061 lb1.setLocation(x, y);
062 add(lb1);
063 x += w1;
064 em1.setLocation(x, y);
065 add(em1);
066 x += 30;
067 lb2.setLocation(x, y);
068 add(lb2);
069 x += w2;
070 em2.setLocation(x, y);
071 add(em2);
072 // 味方
073 x = 0;
074 str = "味方の数制限: 味方1:";
075 JLabel lb3 = new JLabel(str, JLabel.CENTER);
076 lb3.setFont(f);
077 w1 = fm.stringWidth(str);
078 h = fm.getHeight();
079 lb3.setSize(w1, h);
080 y -= (h + 10);
081 x += w1;
082
083 fr1 = new JTextField("10", 2);
084 fr1.setFont(f);
085 fr1.setSize(30, h);
086 fr1.setHorizontalAlignment(JTextField.RIGHT);
087 x += 30;
088
089 str = " 味方2:";
090 w2 = fm.stringWidth(str);
091 JLabel lb4 = new JLabel(str, JLabel.CENTER);
092 lb4.setFont(f);
093 lb4.setSize(w2, h);
094 x += w2;
095
096 fr2 = new JTextField("4", 2);
097 fr2.setFont(f);
098 fr2.setSize(30, h);
099 fr2.setHorizontalAlignment(JTextField.RIGHT);
100 x += 30;
101
102 x = size.width / 2 - x / 2;
103 lb3.setLocation(x, y);
104 add(lb3);
105 x += w1;
106 fr1.setLocation(x, y);
107 add(fr1);
108 x += 30;
109 lb4.setLocation(x, y);
110 add(lb4);
111 x += w2;
112 fr2.setLocation(x, y);
113 add(fr2);
114 // マップ
115 x = 0;
116 str = "使用するマップ:";
117 JLabel lb5 = new JLabel(str, JLabel.CENTER);
118 lb5.setFont(f);
119 w1 = fm.stringWidth(str);
120 h = fm.getHeight();
121 lb5.setSize(w1, h);
122 y -= (h + 10);
123 x += w1;
124
125 map = new JTextField("1", 2);
126 map.setFont(f);
127 map.setSize(30, h);
128 map.setHorizontalAlignment(JTextField.RIGHT);
129 x += 30;
130
131 x = size.width / 2 - x / 2;
132 lb5.setLocation(x, y);
133 add(lb5);
134 x += w1;
135 map.setLocation(x, y);
136 add(map);
137 // ボタンの配置
138 x = 0;
139 str = "遊び方";
140 w1 = fm.stringWidth(str) + 40;
141 h = fm.getHeight() + 10;
142 b_use = new JButton(str);
143 b_use.setFont(f);
144 b_use.addActionListener(this);
145 b_use.setSize(w1, h);
146 y -= (h + 10);
147 x += w1;
148
149 str = "マップ編集";
150 w2 = fm.stringWidth(str) + 40;
151 b_map = new JButton(str);
152 b_map.setFont(f);
153 b_map.addActionListener(this);
154 b_map.setSize(w2, h);
155 x += w2;
156
157 str = "ゲーム開始";
158 w3 = fm.stringWidth(str) + 40;
159 b_game = new JButton(str);
160 b_game.setFont(f);
161 b_game.addActionListener(this);
162 b_game.setSize(w3, h);
163 x += w3;
164
165 x = size.width / 2 - x / 2 - 5;
166 b_use.setLocation(x, y);
167 add(b_use);
168 x += (w1 + 5);
169 b_map.setLocation(x, y);
170 add(b_map);
171 x += (w2 + 5);
172 b_game.setLocation(x, y);
173 add(b_game);
174 }
175 // 描画
176 public void paintComponent(Graphics g)
177 {
178 super.paintComponent(g); // 親クラスの描画
179 FontMetrics fm;
180 Font f;
181 String str;
182 int w, h;
183
184 f = new Font("SansSerif", Font.BOLD, 40);
185 fm = g.getFontMetrics(f);
186 str = "タワーディフェンスゲーム";
187 w = fm.stringWidth(str);
188 h = fm.getHeight();
189 g.setFont(f);
190 g.drawString(str, size.width/2-w/2, size.height/2);
191 }
192 // ボタンがクリックされたときの処理
193 public void actionPerformed(ActionEvent e)
194 {
195 // 遊び方
196 if (e.getSource() == b_use) {
197 Method db = new Method();
198 db.setVisible(true);
199 requestFocusInWindow();
200 }
201 // マップの編集
202 else if (e.getSource() == b_map) {
203 int k = Integer.parseInt(map.getText()) - 1;
204 if (k < 0 || k > 3)
205 k = 0;
206 Map.map = Map.map1[k]; // 使用するマップ
207 mp.state = 5;
208 }
209 // ゲーム開始
210 else if (e.getSource() == b_game) {
211 int k = Integer.parseInt(map.getText()) - 1;
212 if (k < 0 || k > 3)
213 k = 0;
214 Map.map = Map.map1[k]; // 使用するマップ
215 mp.n_friend[0] = Integer.parseInt(fr1.getText()); // 味方1の数
216 mp.n_friend[1] = Integer.parseInt(fr2.getText()); // 味方2の数
217 mp.n_enemy[0] = Integer.parseInt(em1.getText()); // 敵1の数
218 mp.n_enemy[1] = Integer.parseInt(em2.getText()); // 敵2の数
219 mp.state = 1;
220 }
221 }
222 }
223
224 /******************/
225 /* ゲームの遊び方 */
226 /******************/
227 class Method extends JDialog
228 {
229 // コンストラクタ
230 Method()
231 {
232 setTitle("ゲームの遊び方");
233 // ContetPain
234 Container cp = getContentPane();
235 cp.setLayout(new FlowLayout(FlowLayout.CENTER));
236 cp.setBackground(new Color(220, 255, 220)); // 背景色
237 Font f = new Font("MS 明朝", Font.PLAIN, 20);
238 setSize(850, 370);
239 // TextArea の追加
240 JTextArea ta = new JTextArea(15, 80);
241 ta.setFont(f);
242 ta.setEditable(false);
243 ta.setLineWrap(true);
244 ta.setText(" 左からランダムに現れる敵に対して,味方を適当な位置に配置することによって,敵が領域の右端に達するのを防ぐ.すべての敵を消滅させることができればゲームクリア,敵の一つでも領域の右端に達すればゲームオーバーとなる.\n");
245
246 ta.append("\n");
247 ta.append("Ⅰ.味方\n");
248 ta.append(" a.味方1: 配置したい位置をマウスでクリックした後,1 のキーを押せば( 3 のキーを押せばキャンセル)配置され,左方向に動き出す.敵と接触することによって敵を消滅させることができる.配置できる上限数のデフォルトは 10 である.\n");
249 ta.append(" b.味方2: 配置したい位置をマウスでクリックした後,2 のキーを押せば( 3 のキーを押せばキャンセル)配置される.その位置に停止したままであるが,その近傍を通過した敵を消滅させることができる.配置できる上限数のデフォルトは 4 である.\n");
250 ta.append("\n");
251 ta.append("Ⅱ.敵\n");
252 ta.append(" a.敵1: 左端から現れ,右方向に,障害物を避けながら動く.敵1の数のデフォルトは 10 である.\n");
253 ta.append(" b.敵2: 左端から現れ,右方向に,障害物を無視して動く.敵2の数のデフォルトは 5 である.\n");
254 ta.append("\n");
255 ta.append("Ⅲ.マップの編集: 既に存在する 3 種類のマップを編集したり,新しいマップを作成することができるが,マップの保存機能は持っていない.使用するマップを 1 から 4 で指定する( 4 は障害物が何も無いマップ).マップを編集したい場合は,「マップ編集」ボタンをクリックした後,障害物を配置したい位置をマウスでクリックし,1,または,2 のキーを押せば配置される.また,0 のキーを押せば障害物が無くなる.\n");
256 JScrollPane scroll = new JScrollPane(ta);
257 cp.add(scroll);
258 // Window を閉じるため
259 addWindowListener(new WinEnd());
260 }
261 // 終了処理
262 class WinEnd extends WindowAdapter
263 {
264 public void windowClosing(WindowEvent e) {
265 setVisible(false);
266 }
267 }
268 }
001 package map;
002
003 import java.awt.*;
004 import java.awt.event.*;
005 import javax.swing.*;
006 import main.*;
007
008 public class MapEdit extends JPanel implements ActionListener
009 {
010 Dimension size; // パネルの大きさ
011 MainPanel mp;
012 boolean mouse = false; // マウスがクリックされたか否か
013 int k1, k2; // マウスでクリックされた位置
014 JButton bt;
015 // コンストラクタ
016 public MapEdit(Dimension size1, MainPanel mp1)
017 {
018 size = size1;
019 mp = mp1;
020 // レイアウトマネージャの停止
021 setLayout(null);
022 // 背景色の設定
023 setBackground(Color.white);
024 // リスナの追加
025 addMouseListener(new Mouse()); // マウスリスナ
026 addKeyListener(new Key()); // キーリスナ
027 // ボタンの配置
028 Font f = new Font("SansSerif", Font.BOLD, 20);
029 FontMetrics fm = getFontMetrics(f);
030 String str = "OK";
031 int w = fm.stringWidth(str) + 40;
032 int h = fm.getHeight();
033 bt = new JButton(str);
034 bt.setFont(f);
035 bt.addActionListener(this);
036 bt.setSize(w, h);
037 int x = size.width - w - 10;
038 int y = size.height / 2 - h / 2;
039 bt.setLocation(x, y);
040 add(bt);
041 }
042 // 描画
043 public void paintComponent(Graphics g)
044 {
045 super.paintComponent(g); // 親クラスの描画
046 // 背景の描画
047 for (int i1 = 0; i1 < Map.map_col; i1++) {
048 int x = i1 * Map.block_width;
049 for (int i2 = 0; i2 < Map.map_row; i2++) {
050 if (Map.map[i2][i1] > 0) {
051 int y = i2 * Map.block_height;
052 g.drawImage(Map.block_image[Map.map[i2][i1]-1], x, y, Map.block_width, Map.block_height, this);
053 }
054 }
055 g.drawLine(x, 0, x, Map.map_row * Map.block_height);
056 if (i1 == Map.map_col-1)
057 g.drawLine(x+Map.block_width, 0, x+Map.block_width, Map.map_row * Map.block_height);
058 }
059 for (int i1 = 0; i1 < Map.map_row; i1++) {
060 int y = i1 * Map.block_height;
061 g.drawLine(0, y, Map.map_col * Map.block_width, y);
062 }
063 // マウスがクリックされた位置を表示
064 if (mouse) {
065 int y = k1 * Map.block_width + 17;
066 int x = k2 * Map.block_height + 2;
067 g.drawString("Now", x, y);
068 }
069 // この Component が入力フォーカスを取得することを要求
070 requestFocusInWindow();
071 }
072 // マウスイベントの処理
073 class Mouse extends MouseAdapter {
074 public void mousePressed(MouseEvent e) {
075 k1 = e.getY() / Map.block_height;
076 k2 = e.getX() / Map.block_width;
077 if (k1 >= 0 && k1 < Map.map_row && k2 >= 0 && k2 < Map.map_col) {
078 mouse = true;
079 repaint();
080 }
081 else
082 mouse = false;
083 }
084 }
085 // キーイベントの処理
086 class Key extends KeyAdapter {
087 public void keyPressed(KeyEvent e)
088 {
089 if(mouse && e.getKeyCode() >= 48 && e.getKeyCode() <= 50) {
090 if (e.getKeyCode() == 48) // キー 0
091 Map.map[k1][k2] = 0;
092 else if (e.getKeyCode() == 49) // キー 1
093 Map.map[k1][k2] = 1;
094 else if (e.getKeyCode() == 50) // キー 2
095 Map.map[k1][k2] = 2;
096 mouse = false;
097 repaint();
098 }
099 }
100 }
101 // ボタンがクリックされたときの処理
102 public void actionPerformed(ActionEvent e)
103 {
104 if (e.getSource() == bt)
105 mp.state = 0;
106 }
107 }
Enemy.java
01 package game;
02
03 import java.awt.*;
04 import java.util.Random;
05 import main.*;
06 import map.*;
07
08 public class Enemy
09 {
10 public Image image; // 敵画像
11 public int x = 0; // 敵のx座標の初期値
12 public int y; // 敵のy座標の初期値
13 public int v = 2; // 移動速度
14 public int type; // 敵のタイプ
15 public int state = 0; // 0:右へ移動,1:下へ移動,-1:上へ移動
16 // コンストラクタ
17 public Enemy(int sw, Random rn, MainPanel mp)
18 {
19 if (sw == 0)
20 image = mp.getToolkit().getImage("game/image/enemy1.jpg");
21 else
22 image = mp.getToolkit().getImage("game/image/enemy2.jpg");
23
24 type = sw; // 敵のタイプ
25
26 y = (int)(Map.map_row * rn.nextDouble());
27 if (y >= Map.map_row)
28 y = Map.map_row - 1;
29 y *= Map.block_height;
30 }
31 }
GamePanel.java
001 package game; 002 003 import java.awt.*; 004 import java.awt.event.*; 005 import javax.swing.*; 006 import java.util.Random; 007 import main.*; 008 import map.*; 009 010 public class GamePanel extends JPanel implements Runnable 011 { 012 Dimension size; // パネルの大きさ 013 MainPanel mp; 014 Thread td; 015 boolean in_game = true; 016 int count = 0; // カウンタ 017 int n_e_now; // 出現していない敵の数 018 int e_state[]; // 敵の状態(0:存在,1:動作中,-1:消滅) 019 Enemy enemy[]; // 敵 020 int next_time; // 次の敵の出現時間 021 int next; // 次の敵 022 Random rn; 023 // コンストラクタ 024 public GamePanel(Dimension size1, MainPanel mp1) 025 { 026 size = size1; 027 mp = mp1; 028 rn = new Random(); 029 // レイアウトマネージャの停止 030 setLayout(null); 031 // 背景色の設定 032 setBackground(Color.white); 033 // 敵 034 // 敵の数 035 n_e_now = mp.n_enemy[0] + mp.n_enemy[1]; // 出現していない敵の数 036 // 敵の初期状態 037 e_state = new int [n_e_now]; 038 enemy = new Enemy [n_e_now]; 039 int k = 0; 040 for (int i1 = 0; i1 < mp.n_enemy.length; i1++) { 041 for (int i2 = 0; i2 < mp.n_enemy[i1]; i2++) { 042 e_state[k] = 0; 043 enemy[k] = new Enemy(i1, rn, mp); 044 k++; 045 } 046 } 047 // 次の敵 048 next_time = (int)(30 * rn.nextDouble()); 049 next = (int)(e_state.length * rn.nextDouble()); 050 if (next >= e_state.length) 051 next = e_state.length - 1; 052 // スレッドの生成 053 td = new Thread(this); 054 td.start(); 055 } 056 // スレッドの実行 057 public void run() 058 { 059 while (in_game) { 060 try { 061 td.sleep(33); 062 } 063 catch (InterruptedException e) {} 064 // 敵の位置 065 for (int i1 = 0; i1 < e_state.length; i1++) { 066 if (e_state[i1] > 0) { 067 int sw = 0; 068 // 敵1 069 if (enemy[i1].type == 0) { 070 // 右へ移動 071 if (enemy[i1].state == 0) { 072 enemy[i1].x += enemy[i1].v; 073 int k2 = (int)((enemy[i1].x + Map.block_width) / Map.block_width); 074 if (k2 >= Map.map_col) 075 sw = 1; 076 else { 077 int k1 = (int)(enemy[i1].y / Map.block_height); 078 if (Map.map[k1][k2] > 0) { 079 enemy[i1].x = (k2 - 1) * Map.block_width; 080 double r = Math.random(); 081 if (k1 == Map.map_row-1 && Map.map[k1-1][k2-1] == 0 || k1 > 0 && k1 < Map.map_row-1 && (Map.map[k1+1][k2-1] > 0 || r > 0.5 && Map.map[k1+1][k2-1] == 0 && Map.map[k1-1][k2-1] == 0)) 082 enemy[i1].state = -1; // 上へ 083 else if (k1 == 0 && Map.map[k1+1][k2-1] == 0 || k1 > 0 && k1 < Map.map_row-1 && (Map.map[k1-1][k2-1] > 0 || r <= 0.5 && Map.map[k1+1][k2-1] == 0 && Map.map[k1-1][k2-1] == 0)) 084 enemy[i1].state = 1; // 下へ 085 } 086 } 087 } 088 // 上へ移動 089 else if (enemy[i1].state < 0) { 090 enemy[i1].y -= enemy[i1].v; 091 int k1 = (int)((enemy[i1].y + Map.block_height) / Map.block_height); 092 int k2 = (int)(enemy[i1].x / Map.block_width) + 1; 093 if (Map.map[k1][k2] == 0) { 094 enemy[i1].y = k1 * Map.block_height; 095 enemy[i1].state = 0; // 右へ 096 } 097 else if (k1 == 0 || Map.map[k1-1][k2-1] > 0) 098 enemy[i1].state = 1; // 下へ 099 } 100 // 下へ移動 101 else { 102 enemy[i1].y += enemy[i1].v; 103 int k1 = (int)(enemy[i1].y / Map.block_height); 104 int k2 = (int)(enemy[i1].x / Map.block_width) + 1; 105 if (k1 >= Map.map_row-1) { 106 enemy[i1].y = k1 * Map.block_height; 107 if (Map.map[k1][k2] == 0) 108 enemy[i1].state = 0; // 右へ 109 else 110 enemy[i1].state = -1; // 上へ 111 } 112 else { 113 if (Map.map[k1][k2] == 0) { 114 enemy[i1].y = k1 * Map.block_height; 115 enemy[i1].state = 0; // 右へ 116 } 117 else if (Map.map[k1+1][k2-1] > 0) 118 enemy[i1].state = -1; // 上へ 119 } 120 } 121 } 122 // 敵2 123 else if (enemy[i1].type == 1) { 124 enemy[i1].x += enemy[i1].v; 125 int k2 = (int)((enemy[i1].x + Map.block_width) / Map.block_width); 126 if (k2 >= Map.map_col) 127 sw = 1; 128 } 129 // ゲームオーバーか否か 130 if (sw > 0) { 131 // in_game = false; 132 // mp.state = 3; // ゲームオーバー 133 } 134 } 135 } 136 // 次の敵 137 count++; 138 if (count == next_time) { 139 n_e_now--; 140 count = 0; 141 e_state[next] = 1; 142 if (n_e_now > 0) { 143 next_time = (int)(5 * 30 - 30 * rn.nextDouble()); 144 next = -1; 145 while (next < 0) { 146 next = (int)(e_state.length * rn.nextDouble()); 147 if (next >= e_state.length) 148 next = e_state.length - 1; 149 if (e_state[next] != 0) 150 next = -1; 151 } 152 } 153 else 154 next_time = -1; 155 } 156 // 再描画 157 // if (sw == 0) 158 repaint(); 159 } 160 } 161 // 描画 162 public void paintComponent(Graphics g) 163 { 164 super.paintComponent(g); // 親クラスの描画 165 // 背景の描画 166 for (int i1 = 0; i1 < Map.map_col; i1++) { 167 int x = i1 * Map.block_width; 168 for (int i2 = 0; i2 < Map.map_row; i2++) { 169 if (Map.map[i2][i1] > 0) { 170 int y = i2 * Map.block_height; 171 g.drawImage(Map.block_image[Map.map[i2][i1]-1], x, y, Map.block_width, Map.block_height, this); 172 } 173 } 174 } 175 // 敵の描画 176 for (int i1 = 0; i1 < e_state.length; i1++) { 177 if (e_state[i1] > 0) 178 g.drawImage(enemy[i1].image, enemy[i1].x, enemy[i1].y, Map.block_width, Map.block_height, this); 179 } 180 } 181 }
Friend.java
package game;
import java.awt.*;
import main.*;
import map.*;
public class Friend
{
public Image image; // 味方画像
public int x = 0; // 味方のx座標の初期値
public int y = 0; // 味方のy座標の初期値
public int v = 2; // 移動速度
public int type; // 味方のタイプ
public int state = 0; // 0:左へ移動,1:下へ移動,-1:上へ移動
// コンストラクタ
public Friend(int sw, MainPanel mp)
{
if (sw == 0)
image = mp.getToolkit().getImage("game/image/friend1.jpg");
else
image = mp.getToolkit().getImage("game/image/friend2.jpg");
type = sw; // 味方のタイプ
}
}
GamePanel.java
001 package game;
002
003 import java.awt.*;
004 import java.awt.event.*;
005 import javax.swing.*;
006 import java.util.Random;
007 import main.*;
008 import map.*;
009
010 public class GamePanel extends JPanel implements Runnable
011 {
012 Dimension size; // パネルの大きさ
013 MainPanel mp;
014 Thread td;
015 boolean in_game = true;
016 int count = 0; // カウンタ
017 int n_e_now; // 出現していない敵の数
018 int e_state[]; // 敵の状態(0:存在,1:動作中,-1:消滅)
019 Enemy enemy[]; // 敵
020 int next_time; // 次の敵の出現時間
021 int next; // 次の敵
022 Random rn;
023 public Image mark; // マーカー
024 boolean mouse = false;
025 int mark_x = 0; // マーカーのx座標
026 int mark_y = 0; // マーカーのy座標
027 int f_state[][]; // 味方の状態(0:存在,1:動作中,-1:消滅)
028 Friend friend[][]; // 味方
029 // コンストラクタ
030 public GamePanel(Dimension size1, MainPanel mp1)
031 {
032 size = size1;
033 mp = mp1;
034 rn = new Random();
035 // レイアウトマネージャの停止
036 setLayout(null);
037 // リスナの追加
038 addMouseListener(new Mouse()); // マウスリスナ
039 addKeyListener(new Key()); // キーリスナ
040 // 背景色の設定
041 setBackground(Color.white);
042 // マーカー
043 mark = mp.getToolkit().getImage("game/image/mark.jpg");
044 // 味方
045 // 味方の初期状態
046 f_state = new int [mp.n_friend.length][];
047 friend = new Friend [mp.n_friend.length][];
048 for (int i1 = 0; i1 < mp.n_friend.length; i1++) {
049 f_state[i1] = new int [mp.n_friend[i1]];
050 friend[i1] = new Friend [mp.n_friend[i1]];
051 for (int i2 = 0; i2 < mp.n_friend[i1]; i2++) {
052 f_state[i1][i2] = 0;
053 friend[i1][i2] = new Friend(i1, mp);
054 }
055 }
056 // 敵
057 // 敵の数
058 n_e_now = mp.n_enemy[0] + mp.n_enemy[1]; // 出現していない敵の数
059 // 敵の初期状態
060 e_state = new int [n_e_now];
061 enemy = new Enemy [n_e_now];
062 int k = 0;
063 for (int i1 = 0; i1 < mp.n_enemy.length; i1++) {
064 for (int i2 = 0; i2 < mp.n_enemy[i1]; i2++) {
065 e_state[k] = 0;
066 enemy[k] = new Enemy(i1, rn, mp);
067 k++;
068 }
069 }
070 // 次の敵
071 next_time = (int)(30 * rn.nextDouble());
072 next = (int)(e_state.length * rn.nextDouble());
073 if (next >= e_state.length)
074 next = e_state.length - 1;
075 // スレッドの生成
076 td = new Thread(this);
077 td.start();
078 }
079 // スレッドの実行
080 public void run()
081 {
082 while (in_game) {
083 try {
084 td.sleep(33);
085 }
086 catch (InterruptedException e) {}
087 int sw = 0;
088 // 味方の位置
089 // 味方1
090 for (int i1 = 0; i1 < f_state[0].length; i1++) {
091 if (f_state[0][i1] > 0) {
092 // 左へ移動
093 if (friend[0][i1].state == 0) {
094 friend[0][i1].x -= friend[0][i1].v;
095 if (friend[0][i1].x < 0)
096 f_state[0][i1] = -1;
097 else {
098 int k1 = (int)(friend[0][i1].y / Map.block_height);
099 int k2 = (int)(friend[0][i1].x / Map.block_width);
100 if (Map.map[k1][k2] > 0) {
101 friend[0][i1].x = (k2 + 1) * Map.block_width;
102 double r = rn.nextDouble();
103 if (k1 == Map.map_row-1 && Map.map[k1-1][k2+1] == 0 || k1 > 0 && k1 < Map.map_row-1 && (Map.map[k1+1][k2+1] > 0 || r > 0.5 && Map.map[k1+1][k2+1] == 0 && Map.map[k1-1][k2+1] == 0))
104 friend[0][i1].state = -1; // 上へ
105 else if (k1 == 0 && Map.map[k1+1][k2+1] == 0 || k1 > 0 && k1 < Map.map_row-1 && (Map.map[k1-1][k2+1] > 0 || r <= 0.5 && Map.map[k1+1][k2+1] == 0 && Map.map[k1-1][k2+1] == 0))
106 friend[0][i1].state = 1; // 下へ
107 }
108 }
109 }
110 // 上へ移動
111 else if (friend[0][i1].state < 0) {
112 friend[0][i1].y -= friend[0][i1].v;
113 int k1 = (int)((friend[0][i1].y + Map.block_height) / Map.block_height);
114 int k2 = (int)(friend[0][i1].x / Map.block_width) - 1;
115 if (Map.map[k1][k2] == 0) {
116 friend[0][i1].y = k1 * Map.block_height;
117 friend[0][i1].state = 0; // 左へ
118 }
119 else if (k1 == 0 || Map.map[k1-1][k2+1] > 0)
120 friend[0][i1].state = 1; // 下へ
121 }
122 // 下へ移動
123 else {
124 friend[0][i1].y += friend[0][i1].v;
125 int k1 = (int)(friend[0][i1].y / Map.block_height);
126 int k2 = (int)(friend[0][i1].x / Map.block_width) - 1;
127 if (k1 >= Map.map_row-1) {
128 friend[0][i1].y = k1 * Map.block_height;
129 if (Map.map[k1][k2] == 0)
130 friend[0][i1].state = 0; // 左へ
131 else
132 friend[0][i1].state = -1; // 上へ
133 }
134 else {
135 if (Map.map[k1][k2] == 0) {
136 friend[0][i1].y = k1 * Map.block_height;
137 friend[0][i1].state = 0; // 右へ
138 }
139 else if (Map.map[k1+1][k2+1] > 0)
140 friend[0][i1].state = -1; // 上へ
141 }
142 }
143 }
144 }
145 // 敵の位置
146 for (int i1 = 0; i1 < e_state.length; i1++) {
147 if (e_state[i1] > 0) {
148 // 敵1
149 if (enemy[i1].type == 0) {
150 // 右へ移動
151 if (enemy[i1].state == 0) {
152 enemy[i1].x += enemy[i1].v;
153 int k2 = (int)((enemy[i1].x + Map.block_width) / Map.block_width);
154 if (k2 >= Map.map_col)
155 sw = 1;
156 else {
157 int k1 = (int)(enemy[i1].y / Map.block_height);
158 if (Map.map[k1][k2] > 0) {
159 enemy[i1].x = (k2 - 1) * Map.block_width;
160 double r = Math.random();
161 if (k1 == Map.map_row-1 && Map.map[k1-1][k2-1] == 0 || k1 > 0 && k1 < Map.map_row-1 && (Map.map[k1+1][k2-1] > 0 || r > 0.5 && Map.map[k1+1][k2-1] == 0 && Map.map[k1-1][k2-1] == 0))
162 enemy[i1].state = -1; // 上へ
163 else if (k1 == 0 && Map.map[k1+1][k2-1] == 0 || k1 > 0 && k1 < Map.map_row-1 && (Map.map[k1-1][k2-1] > 0 || r <= 0.5 && Map.map[k1+1][k2-1] == 0 && Map.map[k1-1][k2-1] == 0))
164 enemy[i1].state = 1; // 下へ
165 }
166 }
167 }
168 // 上へ移動
169 else if (enemy[i1].state < 0) {
170 enemy[i1].y -= enemy[i1].v;
171 int k1 = (int)((enemy[i1].y + Map.block_height) / Map.block_height);
172 int k2 = (int)(enemy[i1].x / Map.block_width) + 1;
173 if (Map.map[k1][k2] == 0) {
174 enemy[i1].y = k1 * Map.block_height;
175 enemy[i1].state = 0; // 右へ
176 }
177 else if (k1 == 0 || Map.map[k1-1][k2-1] > 0)
178 enemy[i1].state = 1; // 下へ
179 }
180 // 下へ移動
181 else {
182 enemy[i1].y += enemy[i1].v;
183 int k1 = (int)(enemy[i1].y / Map.block_height);
184 int k2 = (int)(enemy[i1].x / Map.block_width) + 1;
185 if (k1 >= Map.map_row-1) {
186 enemy[i1].y = k1 * Map.block_height;
187 if (Map.map[k1][k2] == 0)
188 enemy[i1].state = 0; // 右へ
189 else
190 enemy[i1].state = -1; // 上へ
191 }
192 else {
193 if (Map.map[k1][k2] == 0) {
194 enemy[i1].y = k1 * Map.block_height;
195 enemy[i1].state = 0; // 右へ
196 }
197 else if (Map.map[k1+1][k2-1] > 0)
198 enemy[i1].state = -1; // 上へ
199 }
200 }
201 }
202 // 敵2
203 else if (enemy[i1].type == 1) {
204 enemy[i1].x += enemy[i1].v;
205 int k2 = (int)((enemy[i1].x + Map.block_width) / Map.block_width);
206 if (k2 >= Map.map_col)
207 sw = 1;
208 }
209 // ゲームオーバーか否か
210 if (sw > 0) {
211 // in_game = false;
212 // mp.state = 3; // ゲームオーバー
213 }
214 }
215 }
216 // 次の敵
217 count++;
218 if (count == next_time) {
219 n_e_now--;
220 count = 0;
221 e_state[next] = 1;
222 if (n_e_now > 0) {
223 next_time = (int)(5 * 30 - 30 * rn.nextDouble());
224 next = -1;
225 while (next < 0) {
226 next = (int)(e_state.length * rn.nextDouble());
227 if (next >= e_state.length)
228 next = e_state.length - 1;
229 if (e_state[next] != 0)
230 next = -1;
231 }
232 }
233 else
234 next_time = -1;
235 }
236 // 再描画
237 // if (sw == 0)
238 repaint();
239 }
240 }
241 // 描画
242 public void paintComponent(Graphics g)
243 {
244 super.paintComponent(g); // 親クラスの描画
245 // 背景の描画
246 for (int i1 = 0; i1 < Map.map_col; i1++) {
247 int x = i1 * Map.block_width;
248 for (int i2 = 0; i2 < Map.map_row; i2++) {
249 if (Map.map[i2][i1] > 0) {
250 int y = i2 * Map.block_height;
251 g.drawImage(Map.block_image[Map.map[i2][i1]-1], x, y, Map.block_width, Map.block_height, this);
252 }
253 }
254 }
255 // マーカーの描画
256 g.drawImage(mark, mark_x, mark_y, Map.block_width, Map.block_height, this);
257 // 味方の描画
258 for (int i1 = 0; i1 < mp.n_friend.length; i1++) {
259 for (int i2 = 0; i2 < f_state[i1].length; i2++) {
260 if (f_state[i1][i2] > 0)
261 g.drawImage(friend[i1][i2].image, friend[i1][i2].x, friend[i1][i2].y, Map.block_width, Map.block_height, this);
262 }
263 }
264 // 敵の描画
265 for (int i1 = 0; i1 < e_state.length; i1++) {
266 if (e_state[i1] > 0)
267 g.drawImage(enemy[i1].image, enemy[i1].x, enemy[i1].y, Map.block_width, Map.block_height, this);
268 }
269 // この Component が入力フォーカスを取得することを要求
270 requestFocusInWindow();
271 }
272 // マウスイベントの処理
273 class Mouse extends MouseAdapter {
274 public void mousePressed(MouseEvent e) {
275 int k1 = e.getY() / Map.block_height;
276 int k2 = e.getX() / Map.block_width;
277 if (k1 >= 0 && k1 < Map.map_row && k2 >= 0 && k2 < Map.map_col && Map.map[k1][k2] == 0) {
278 mark_x = k2 * Map.block_width;
279 mark_y = k1 * Map.block_height;
280 mouse = true;
281 }
282 }
283 }
284 // キーイベントの処理
285 class Key extends KeyAdapter {
286 public void keyPressed(KeyEvent e)
287 {
288 if(mouse && e.getKeyCode() >= 49 && e.getKeyCode() <= 51) {
289 if (e.getKeyCode() == 49) { // キー 1
290 if (mp.n_friend[0] > 0) {
291 mp.n_friend[0]--;
292 f_state[0][mp.n_friend[0]] = 1;
293 friend[0][mp.n_friend[0]].x = mark_x;
294 friend[0][mp.n_friend[0]].y = mark_y;
295 }
296 }
297 else if (e.getKeyCode() == 50) { // キー 2
298 if (mp.n_friend[1] > 0) {
299 mp.n_friend[1]--;
300 f_state[1][mp.n_friend[1]] = 1;
301 friend[1][mp.n_friend[1]].x = mark_x;
302 friend[1][mp.n_friend[1]].y = mark_y;
303 }
304 }
305 mark_x = 0;
306 mark_y = 0;
307 mouse = false;
308 }
309 }
310 }
311 }
001 package game;
002
003 import java.awt.*;
004 import java.awt.event.*;
005 import javax.swing.*;
006 import java.util.Random;
007 import main.*;
008 import map.*;
009
010 public class GamePanel extends JPanel implements Runnable
011 {
012 Dimension size; // パネルの大きさ
013 MainPanel mp;
014 Thread td;
015 boolean in_game = true;
016 int count = 0; // カウンタ
017 int n_e_now; // 出現していない敵の数
018 int n_e_now_ex; // 存在している敵の数
019 int e_state[]; // 敵の状態(0:存在,1:動作中,-1:消滅)
020 Enemy enemy[]; // 敵
021 int next_time; // 次の敵の出現時間
022 int next; // 次の敵
023 Random rn;
024 public Image mark; // マーカー
025 boolean mouse = false;
026 int mark_x = 0; // マーカーのx座標
027 int mark_y = 0; // マーカーのy座標
028 int f_state[][]; // 味方の状態(0:存在,1:動作中,-1:消滅)
029 Friend friend[][]; // 味方
030 // コンストラクタ
031 public GamePanel(Dimension size1, MainPanel mp1)
032 {
033 size = size1;
034 mp = mp1;
035 rn = new Random();
036 // レイアウトマネージャの停止
037 setLayout(null);
038 // リスナの追加
039 addMouseListener(new Mouse()); // マウスリスナ
040 addKeyListener(new Key()); // キーリスナ
041 // 背景色の設定
042 setBackground(Color.white);
043 // マーカー
044 mark = mp.getToolkit().getImage("game/image/mark.jpg");
045 // 味方
046 // 味方の初期状態
047 f_state = new int [mp.n_friend.length][];
048 friend = new Friend [mp.n_friend.length][];
049 for (int i1 = 0; i1 < mp.n_friend.length; i1++) {
050 f_state[i1] = new int [mp.n_friend[i1]];
051 friend[i1] = new Friend [mp.n_friend[i1]];
052 for (int i2 = 0; i2 < mp.n_friend[i1]; i2++) {
053 f_state[i1][i2] = 0;
054 friend[i1][i2] = new Friend(i1, mp);
055 }
056 }
057 // 敵
058 // 敵の数
059 n_e_now = mp.n_enemy[0] + mp.n_enemy[1]; // 出現していない敵の数
060 n_e_now_ex = n_e_now; // 存在している敵の数
061 // 敵の初期状態
062 e_state = new int [n_e_now];
063 enemy = new Enemy [n_e_now];
064 int k = 0;
065 for (int i1 = 0; i1 < mp.n_enemy.length; i1++) {
066 for (int i2 = 0; i2 < mp.n_enemy[i1]; i2++) {
067 e_state[k] = 0;
068 enemy[k] = new Enemy(i1, rn, mp);
069 k++;
070 }
071 }
072 // 次の敵
073 next_time = (int)(30 * rn.nextDouble());
074 next = (int)(e_state.length * rn.nextDouble());
075 if (next >= e_state.length)
076 next = e_state.length - 1;
077 // スレッドの生成
078 td = new Thread(this);
079 td.start();
080 }
081 // スレッドの実行
082 public void run()
083 {
084 while (in_game) {
085 try {
086 td.sleep(33);
087 }
088 catch (InterruptedException e) {}
089 int sw = 0;
090 // 味方の位置
091 // 味方1
092 for (int i1 = 0; i1 < f_state[0].length; i1++) {
093 if (f_state[0][i1] > 0) {
094 // 左へ移動
095 if (friend[0][i1].state == 0) {
096 friend[0][i1].x -= friend[0][i1].v;
097 if (friend[0][i1].x < 0)
098 f_state[0][i1] = -1;
099 else {
100 int k1 = (int)(friend[0][i1].y / Map.block_height);
101 int k2 = (int)(friend[0][i1].x / Map.block_width);
102 if (Map.map[k1][k2] > 0) {
103 friend[0][i1].x = (k2 + 1) * Map.block_width;
104 double r = rn.nextDouble();
105 if (k1 == Map.map_row-1 && Map.map[k1-1][k2+1] == 0 || k1 > 0 && k1 < Map.map_row-1 && (Map.map[k1+1][k2+1] > 0 || r > 0.5 && Map.map[k1+1][k2+1] == 0 && Map.map[k1-1][k2+1] == 0))
106 friend[0][i1].state = -1; // 上へ
107 else if (k1 == 0 && Map.map[k1+1][k2+1] == 0 || k1 > 0 && k1 < Map.map_row-1 && (Map.map[k1-1][k2+1] > 0 || r <= 0.5 && Map.map[k1+1][k2+1] == 0 && Map.map[k1-1][k2+1] == 0))
108 friend[0][i1].state = 1; // 下へ
109 }
110 }
111 }
112 // 上へ移動
113 else if (friend[0][i1].state < 0) {
114 friend[0][i1].y -= friend[0][i1].v;
115 int k1 = (int)((friend[0][i1].y + Map.block_height) / Map.block_height);
116 int k2 = (int)(friend[0][i1].x / Map.block_width) - 1;
117 if (Map.map[k1][k2] == 0) {
118 friend[0][i1].y = k1 * Map.block_height;
119 friend[0][i1].state = 0; // 左へ
120 }
121 else if (k1 == 0 || Map.map[k1-1][k2+1] > 0)
122 friend[0][i1].state = 1; // 下へ
123 }
124 // 下へ移動
125 else {
126 friend[0][i1].y += friend[0][i1].v;
127 int k1 = (int)(friend[0][i1].y / Map.block_height);
128 int k2 = (int)(friend[0][i1].x / Map.block_width) - 1;
129 if (k1 >= Map.map_row-1) {
130 friend[0][i1].y = k1 * Map.block_height;
131 if (Map.map[k1][k2] == 0)
132 friend[0][i1].state = 0; // 左へ
133 else
134 friend[0][i1].state = -1; // 上へ
135 }
136 else {
137 if (Map.map[k1][k2] == 0) {
138 friend[0][i1].y = k1 * Map.block_height;
139 friend[0][i1].state = 0; // 右へ
140 }
141 else if (Map.map[k1+1][k2+1] > 0)
142 friend[0][i1].state = -1; // 上へ
143 }
144 }
145 // 衝突判定
146 if (f_state[0][i1] > 0) {
147 int k1 = (int)(friend[0][i1].y / Map.block_height);
148 int k2 = (int)(friend[0][i1].x / Map.block_width);
149 for (int i2 = 0; i2 < e_state.length; i2++) {
150 if (e_state[i2] > 0) {
151 int t1 = (int)(enemy[i2].y / Map.block_height);
152 int t2 = (int)(enemy[i2].x / Map.block_width);
153 if (k1 == t1 && k2 == t2) {
154 e_state[i2] = -1;
155 n_e_now_ex--;
156 if (n_e_now_ex == 0) {
157 sw = -1;
158 in_game = false;
159 mp.state = 2; // ゲームクリア
160 }
161 }
162 }
163 }
164 }
165 }
166 }
167 // 味方2との衝突判定
168 for (int i1 = 0; i1 < f_state[1].length; i1++) {
169 if (f_state[1][i1] > 0) {
170 int k1 = (int)(friend[1][i1].y / Map.block_height);
171 int k2 = (int)(friend[1][i1].x / Map.block_width);
172 for (int i2 = 0; i2 < e_state.length; i2++) {
173 if (e_state[i2] > 0) {
174 int t1 = (int)(enemy[i2].y / Map.block_height);
175 int t2 = (int)(enemy[i2].x / Map.block_width);
176 if (Math.abs(k1-t1) + Math.abs(k2-t2) <= 2) {
177 e_state[i2] = -1;
178 n_e_now_ex--;
179 if (n_e_now_ex == 0) {
180 sw = -1;
181 in_game = false;
182 mp.state = 2; // ゲームクリア
183 }
184 }
185 }
186 }
187 }
188 }
189 // 敵の位置
190 for (int i1 = 0; i1 < e_state.length; i1++) {
191 if (e_state[i1] > 0) {
192 // 敵1
193 if (enemy[i1].type == 0) {
194 // 右へ移動
195 if (enemy[i1].state == 0) {
196 enemy[i1].x += enemy[i1].v;
197 int k2 = (int)((enemy[i1].x + Map.block_width) / Map.block_width);
198 if (k2 >= Map.map_col)
199 sw = 1;
200 else {
201 int k1 = (int)(enemy[i1].y / Map.block_height);
202 if (Map.map[k1][k2] > 0) {
203 enemy[i1].x = (k2 - 1) * Map.block_width;
204 double r = Math.random();
205 if (k1 == Map.map_row-1 && Map.map[k1-1][k2-1] == 0 || k1 > 0 && k1 < Map.map_row-1 && (Map.map[k1+1][k2-1] > 0 || r > 0.5 && Map.map[k1+1][k2-1] == 0 && Map.map[k1-1][k2-1] == 0))
206 enemy[i1].state = -1; // 上へ
207 else if (k1 == 0 && Map.map[k1+1][k2-1] == 0 || k1 > 0 && k1 < Map.map_row-1 && (Map.map[k1-1][k2-1] > 0 || r <= 0.5 && Map.map[k1+1][k2-1] == 0 && Map.map[k1-1][k2-1] == 0))
208 enemy[i1].state = 1; // 下へ
209 }
210 }
211 }
212 // 上へ移動
213 else if (enemy[i1].state < 0) {
214 enemy[i1].y -= enemy[i1].v;
215 int k1 = (int)((enemy[i1].y + Map.block_height) / Map.block_height);
216 int k2 = (int)(enemy[i1].x / Map.block_width) + 1;
217 if (Map.map[k1][k2] == 0) {
218 enemy[i1].y = k1 * Map.block_height;
219 enemy[i1].state = 0; // 右へ
220 }
221 else if (k1 == 0 || Map.map[k1-1][k2-1] > 0)
222 enemy[i1].state = 1; // 下へ
223 }
224 // 下へ移動
225 else {
226 enemy[i1].y += enemy[i1].v;
227 int k1 = (int)(enemy[i1].y / Map.block_height);
228 int k2 = (int)(enemy[i1].x / Map.block_width) + 1;
229 if (k1 >= Map.map_row-1) {
230 enemy[i1].y = k1 * Map.block_height;
231 if (Map.map[k1][k2] == 0)
232 enemy[i1].state = 0; // 右へ
233 else
234 enemy[i1].state = -1; // 上へ
235 }
236 else {
237 if (Map.map[k1][k2] == 0) {
238 enemy[i1].y = k1 * Map.block_height;
239 enemy[i1].state = 0; // 右へ
240 }
241 else if (Map.map[k1+1][k2-1] > 0)
242 enemy[i1].state = -1; // 上へ
243 }
244 }
245 }
246 // 敵2
247 else if (enemy[i1].type == 1) {
248 enemy[i1].x += enemy[i1].v;
249 int k2 = (int)((enemy[i1].x + Map.block_width) / Map.block_width);
250 if (k2 >= Map.map_col)
251 sw = 1;
252 }
253 // ゲームオーバーか否か
254 if (sw > 0) {
255 in_game = false;
256 mp.state = 3; // ゲームオーバー
257 }
258 }
259 }
260 // 次の敵
261 count++;
262 if (count == next_time) {
263 n_e_now--;
264 count = 0;
265 e_state[next] = 1;
266 if (n_e_now > 0) {
267 next_time = (int)(5 * 30 - 30 * rn.nextDouble());
268 next = -1;
269 while (next < 0) {
270 next = (int)(e_state.length * rn.nextDouble());
271 if (next >= e_state.length)
272 next = e_state.length - 1;
273 if (e_state[next] != 0)
274 next = -1;
275 }
276 }
277 else
278 next_time = -1;
279 }
280 // 再描画
281 if (sw == 0)
282 repaint();
283 }
284 }
285 // 描画
286 public void paintComponent(Graphics g)
287 {
288 super.paintComponent(g); // 親クラスの描画
289 // 背景の描画
290 for (int i1 = 0; i1 < Map.map_col; i1++) {
291 int x = i1 * Map.block_width;
292 for (int i2 = 0; i2 < Map.map_row; i2++) {
293 if (Map.map[i2][i1] > 0) {
294 int y = i2 * Map.block_height;
295 g.drawImage(Map.block_image[Map.map[i2][i1]-1], x, y, Map.block_width, Map.block_height, this);
296 }
297 }
298 }
299 // マーカーの描画
300 g.drawImage(mark, mark_x, mark_y, Map.block_width, Map.block_height, this);
301 // 味方の描画
302 for (int i1 = 0; i1 < mp.n_friend.length; i1++) {
303 for (int i2 = 0; i2 < f_state[i1].length; i2++) {
304 if (f_state[i1][i2] > 0)
305 g.drawImage(friend[i1][i2].image, friend[i1][i2].x, friend[i1][i2].y, Map.block_width, Map.block_height, this);
306 }
307 }
308 // 敵の描画
309 for (int i1 = 0; i1 < e_state.length; i1++) {
310 if (e_state[i1] > 0)
311 g.drawImage(enemy[i1].image, enemy[i1].x, enemy[i1].y, Map.block_width, Map.block_height, this);
312 }
313 // この Component が入力フォーカスを取得することを要求
314 requestFocusInWindow();
315 }
316 // マウスイベントの処理
317 class Mouse extends MouseAdapter {
318 public void mousePressed(MouseEvent e) {
319 int k1 = e.getY() / Map.block_height;
320 int k2 = e.getX() / Map.block_width;
321 if (k1 >= 0 && k1 < Map.map_row && k2 >= 0 && k2 < Map.map_col && Map.map[k1][k2] == 0) {
322 mark_x = k2 * Map.block_width;
323 mark_y = k1 * Map.block_height;
324 mouse = true;
325 }
326 }
327 }
328 // キーイベントの処理
329 class Key extends KeyAdapter {
330 public void keyPressed(KeyEvent e)
331 {
332 if(mouse && e.getKeyCode() >= 49 && e.getKeyCode() <= 51) {
333 if (e.getKeyCode() == 49) { // キー 1
334 if (mp.n_friend[0] > 0) {
335 mp.n_friend[0]--;
336 f_state[0][mp.n_friend[0]] = 1;
337 friend[0][mp.n_friend[0]].x = mark_x;
338 friend[0][mp.n_friend[0]].y = mark_y;
339 }
340 }
341 else if (e.getKeyCode() == 50) { // キー 2
342 if (mp.n_friend[1] > 0) {
343 mp.n_friend[1]--;
344 f_state[1][mp.n_friend[1]] = 1;
345 friend[1][mp.n_friend[1]].x = mark_x;
346 friend[1][mp.n_friend[1]].y = mark_y;
347 }
348 }
349 mark_x = 0;
350 mark_y = 0;
351 mouse = false;
352 }
353 }
354 }
355 }
| 情報学部 | 菅沼ホーム | Java 目次 | 索引 |