//============================================================================= // UpperHand.java // Copyright(c) 1998-1999 Satoshi Kobayashi, All rights reserved. //============================================================================= import java.applet.*; import java.awt.*; //============================================================================= // class UpperHand // Applet UpperHand を定義するクラス。 //============================================================================= public class UpperHand extends Applet { //----------------------------------------------------------------------------- // クラス変数定義 //----------------------------------------------------------------------------- // バージョン表示用文字列 private final static String version = "UpperHand Game 1.1a11"; // 著作権表示文字列 private final static String copyright = "Copyright(c) 1998-1999 Satoshi Kobayashi, All rights reserved."; // プレーヤーの名前 private final static String playerName[] = { "You", "Beginer", "Middle Class", "Junior Master" }; // 使用する色のインデックス public final static int BG_COLOR = 0; // 背景色 public final static int FG_COLOR = 1; // 前景色 public final static int NUTRAL_COLOR = 2; // 中立の玉の色 public final static int FIRST_COLOR = 3; // 先手の玉の色 public final static int SECOND_COLOR = 4; // 後手の玉の色 // 使用する色の定義 public final static Color color[] = { Color.lightGray, Color.black, Color.green.darker(), Color.blue, Color.red }; // 音声のインデックス private final static int PUT_BALL_SOUND = 0; // 玉を置いたとき private final static int BAD_MOVE_SOUND = 1; // 不正な着手のとき private final static int APP_WIN_SOUND = 2; // Appletが勝ったとき private final static int APP_LOST_SOUND = 3; // Appletが負けたとき private final static int START_GAME_SOUND = 4; // ゲームを開始したとき private final static int STOP_GAME_SOUND = 5; // ゲームを中断したとき // 音声ファイル名 private final static String soundName[] = { "ding.au", "beep.au", "laugh.au", "ouch.au", "return.au", "crash.au" }; // 画像ファイル名 private final static String imageName1[] = { "B1.gif", "R1.gif", "G1.gif" }; private final static String imageName2[] = { "B2.gif", "R2.gif", "G2.gif" }; //----------------------------------------------------------------------------- // インスタンス変数定義 //----------------------------------------------------------------------------- // ゲーム盤 private UpperHandGame game; // プレーヤー private UpperHandPlayer player[] = new UpperHandPlayer[2]; // ゲームが終了状態のときtrue private boolean isStopGame; // ゲーム盤を表示するコンポーネント private UpperHandBoardView boardView; // プレーヤーを表示するコンポーネント private UpperHandPlayerView playerView[] = new UpperHandPlayerView[2]; // 持ち玉を表示するコンポーネント private UpperHandBallView ballView[] = new UpperHandBallView[2]; // プレーヤー選択メニュー private Choice playerChoice[] = new Choice[2]; // プレーヤー/メニュー表示切り替え用パネル private Panel playerPanel[] = new Panel[2]; // 音声モード切り替えチェックボックス private Checkbox soundBox; // ゲーム開始ボタン private Button startButton; // ゲーム中断ボタン private Button stopButton; // ボタン切り替え用パネル private Panel buttonPanel; // 音声 private AudioClip sound[] = new AudioClip[soundName.length]; // 画像 public Image ballImage1[] = new Image[imageName1.length]; public Image ballImage2[] = new Image[imageName2.length]; //----------------------------------------------------------------------------- // メソッド定義 //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- // public void init() // Appletの初期化処理を行う。 //----------------------------------------------------------------------------- public void init() { // 音声データをダウンロードする。 loadSound(); // 画像データをダウンロードする。 loadImage(); // ゲーム盤を新規に作成し、初期化する。 game = new UpperHandGame(); game.init(); // 背景色を設定する。 setBackground(UpperHand.color[UpperHand.BG_COLOR]); // コンポーネントを作成する。 createComponent(); // コンポーネントを配置する。 layoutComponent(); // ゲームを終了状態にする。 stopGame(); } //----------------------------------------------------------------------------- // private void loadSound() // 音声データをダウンロードする。 //----------------------------------------------------------------------------- private void loadSound() { for (int i = 0; i < sound.length; i++) { sound[i] = getAudioClip(getCodeBase(), soundName[i]); } } //----------------------------------------------------------------------------- // private void loadImage() // 画像データをダウンロードする。 //----------------------------------------------------------------------------- private void loadImage() { showStatus("Now loading image files..."); MediaTracker tracker = new MediaTracker(this); for (int i = 0; i < ballImage1.length; i++) { ballImage1[i] = getImage(getCodeBase(), imageName1[i]); tracker.addImage(ballImage1[i], 0); ballImage2[i] = getImage(getCodeBase(), imageName2[i]); tracker.addImage(ballImage2[i], 0); } try { // 画像データがダウンロードされるのを待つ。 tracker.waitForID(0); } catch (InterruptedException e) {} if (tracker.isErrorID(0)) { // ダウンロードに失敗した場合 // 画像を破棄する。 for (int i = 0; i < ballImage1.length; i++) { ballImage1[i].flush(); ballImage1[i] = null; ballImage2[i].flush(); ballImage2[i] = null; } showStatus("Error loading image"); } else { showStatus("Done."); } } //----------------------------------------------------------------------------- // private void createComponent() // コンポーネントを作成する。 //----------------------------------------------------------------------------- private void createComponent() { // すべてのコンポーネントを取り除く。 removeAll(); // ゲーム盤を表示するコンポーネントを作成する。 boardView = new UpperHandBoardView(game, this); for (int p = UpperHandGame.FIRST; p <= UpperHandGame.SECOND; p++) { // プレーヤーを表示するコンポーネントを作成する。 playerView[p] = new UpperHandPlayerView(game, p); // 持ち玉を表示するコンポーネントを作成する。 ballView[p] = new UpperHandBallView(game, p, this); // プレーヤー選択メニューを作成する。 playerChoice[p] = new Choice(); for (int i = 0; i < playerName.length; i++) { // プレーヤーの名前をメニューに追加する。 playerChoice[p].addItem(playerName[i]); } // プレーヤー/メニュー切り替え用パネルを作成する。 playerPanel[p] = new Panel(); } // プレーヤー選択メニューの選択肢を初期状態にする。 playerChoice[UpperHandGame.FIRST].select(0); playerChoice[UpperHandGame.SECOND].select(1); // 音声モード切り替えチェックボックスを作成する。 soundBox = new Checkbox("Sound"); soundBox.setState(true); // チェックされた状態にする。 // ゲーム開始ボタンを作成する。 startButton = new Button("Start"); // ゲーム中断ボタンを作成する。 stopButton = new Button("Stop"); // ボタン切り替え用パネルを作成する。 buttonPanel = new Panel(); } //----------------------------------------------------------------------------- // private void layoutComponent() // コンポーネントを配置する。 //----------------------------------------------------------------------------- private void layoutComponent() { GridBagLayout layout = new GridBagLayout(); GridBagConstraints c = new GridBagConstraints(); // レイアウトマネージャを設定する。 setLayout(layout); // ゲーム盤を表示するコンポーネントを配置する。 c.gridheight = GridBagConstraints.REMAINDER; c.fill = GridBagConstraints.NONE; layout.setConstraints(boardView, c); add(boardView); // 以降のコンポーネントの配置方法を設定する。 c.gridheight = 1; c.gridwidth = GridBagConstraints.REMAINDER; c.anchor = GridBagConstraints.NORTH; for (int p = UpperHandGame.FIRST; p <= UpperHandGame.SECOND; p++) { // プレーヤー/メニュー表示切り替えパネルに、プレーヤーを表示する // コンポーネント、プレーヤー選択メニューを配置する。 playerPanel[p].setLayout(new CardLayout()); playerPanel[p].add("MENU", playerChoice[p]); playerPanel[p].add("VIEW", playerView[p]); // プレーヤー/メニュー表示切り替えパネルを配置する。 c.fill = GridBagConstraints.HORIZONTAL; layout.setConstraints(playerPanel[p], c); add(playerPanel[p]); // 持ち玉を表示するコンポーネントを配置する。 c.fill = GridBagConstraints.NONE; layout.setConstraints(ballView[p], c); add(ballView[p]); } // 以降のコンポーネントの配置方法を設定する。 c.gridheight = GridBagConstraints.REMAINDER; c.gridwidth = 1; // 音声モード切り替えチェックボックスを配置する。 c.anchor = GridBagConstraints.NORTHWEST; layout.setConstraints(soundBox, c); add(soundBox); // ボタン切り替えパネルに、ゲーム開始ボタン、ゲーム中断ボタンを配置する。 buttonPanel.setLayout(new CardLayout()); buttonPanel.add("START", startButton); buttonPanel.add("STOP", stopButton); // ボタン切り替えパネルを配置する。 c.anchor = GridBagConstraints.NORTHEAST; layout.setConstraints(buttonPanel, c); add(buttonPanel); } //----------------------------------------------------------------------------- // public void start() // Appletのページに移動したときの処理を行う。 //----------------------------------------------------------------------------- public void start() { } //----------------------------------------------------------------------------- // public void stop() // Appletのページから離れるときの処理を行う。 //----------------------------------------------------------------------------- public void stop() { } //----------------------------------------------------------------------------- // public void destroy() // Appletを破棄するときの処理を行う。 //----------------------------------------------------------------------------- public void destroy() { } //----------------------------------------------------------------------------- // public String getAppletInfo() // Appletのバージョン、著作件表示を返す。 //----------------------------------------------------------------------------- public String getAppletInfo() { return version + " " + copyright; } //----------------------------------------------------------------------------- // public boolean mouseDown(Event evt, int x, int y) // マウスのボタンが押されたときの処理を行う。 //----------------------------------------------------------------------------- public boolean mouseDown(Event evt, int x, int y) { playSound(BAD_MOVE_SOUND); // 不正な着手のときの音を出す。 return true; } //----------------------------------------------------------------------------- // public boolean mouseEnter(Event evt, int x, int y) // マウスがApplet内に入ったときの処理を行う。 //----------------------------------------------------------------------------- public boolean mouseEnter(Event evt, int x, int y) { // Appletの情報をステータスバーに表示する。 showStatus(getAppletInfo()); return true; } //----------------------------------------------------------------------------- // public boolean action(Event evt, Object arg) // 他のボタンからのイベントを処理する。 //----------------------------------------------------------------------------- public boolean action(Event evt, Object arg) { if (evt.target == startButton) { // ゲーム開始ボタンが押されたとき playSound(START_GAME_SOUND); startGame(); // ゲームを開始する。 return true; } else if (evt.target == stopButton) { // ゲーム中断ボタンが押されたとき playSound(STOP_GAME_SOUND); stopGame(); // ゲームを終了状態にする。 return true; } return super.action(evt, arg); // スーパークラスに処理を任せる。 } //----------------------------------------------------------------------------- // public void startGame() // ゲームを開始する。 //----------------------------------------------------------------------------- public void startGame() { // ゲーム中の表示に切り替える。 for (int p = UpperHandGame.FIRST; p <= UpperHandGame.SECOND; p++) { Panel panel = playerPanel[p]; ((CardLayout)panel.getLayout()).show(panel, "VIEW"); // プレーヤー選択メニューを隠す。 } ((CardLayout)buttonPanel.getLayout()).show(buttonPanel, "STOP"); // ゲーム中断ボタンを表示する。 initPlayer(); // プレーヤーを初期化する。 game.init(); // ゲームを初期化する。 isStopGame = false; // ゲーム中にする。 nextMove(); // 次の一手に進む。 } //----------------------------------------------------------------------------- // public void stopGame() // ゲームを終了状態にする。 //----------------------------------------------------------------------------- public void stopGame() { isStopGame = true; // ゲーム終了状態にする。 // ゲーム終了状態の表示に切り替える。 for (int p = UpperHandGame.FIRST; p <= UpperHandGame.SECOND; p++) { Panel panel = playerPanel[p]; ((CardLayout)panel.getLayout()).show(panel, "MENU"); // プレーヤー選択メニューを表示する。 } ((CardLayout)buttonPanel.getLayout()).show(buttonPanel, "START"); // ゲーム開始ボタンを表示する。 } //----------------------------------------------------------------------------- // public void makeMove(int p) // 位置pに着手する。 //----------------------------------------------------------------------------- public void makeMove(int p) { if (isStopGame) { // ゲームが終了状態のとき playSound(BAD_MOVE_SOUND); // 不正な着手のときの音を出す。 return; // 着手は行わない。 } game.makeMove(p); // 着手する。 if (game.isFinish()) { // ゲームが終わったとき finishGame(); // 終局時の処理を行う。 stopGame(); // ゲームを終了状態にする。 } else { playSound(PUT_BALL_SOUND); // 玉を置いた音を出す。 nextMove(); // 次の一手に進む。 } } //----------------------------------------------------------------------------- // private void initPlayer() // プレーヤー選択メニューの状態にしたがいプレーヤーを初期化する。 //----------------------------------------------------------------------------- private void initPlayer() { for (int p = UpperHandGame.FIRST; p <= UpperHandGame.SECOND; p++) { // プレーヤーを初期化する。 int index = playerChoice[p].getSelectedIndex(); if (index == 0) { // 人間が選択されているとき player[p] = null; } else { // コンピュータが選択されているとき // コンピュータのプレーヤーを生成する。 player[p] = new UpperHandPlayer(p, index - 1); } // プレーヤーの名前を初期化する。 playerView[p].playerName(playerChoice[p].getSelectedItem()); } } //----------------------------------------------------------------------------- // private void nextMove() // 次の一手に進む。 // 次のプレーヤーがコンピュータのときは、次に一手をコンピュータに選択 // させ、着手する。次のプレーヤーが人間のときは何もせずにリターンし、 // マウスの入力を待つ。 //----------------------------------------------------------------------------- private void nextMove() { int p = game.nextPlayer(); if (player[p] != null) { // 次のプレーヤーがコンピュータのとき try { Thread.sleep(500); // 0.5秒休止する。 } catch (InterruptedException e) {} // 次の一手をコンピュータに選択させ、着手する。 makeMove(player[p].selectMove(game)); } } //----------------------------------------------------------------------------- // private void finishGame() // 終局時の処理を行う。 //----------------------------------------------------------------------------- private void finishGame() { if (player[UpperHandGame.FIRST] == null && // コンピュータ同士の player[UpperHandGame.SECOND] == null // 対戦のとき || player[UpperHandGame.FIRST] != null && // 人間同士の player[UpperHandGame.SECOND] != null) // 対戦のとき { playSound(PUT_BALL_SOUND); } else { // コンピュータの手番を取得する。 int p = (player[UpperHandGame.FIRST] != null) ? UpperHandGame.FIRST : UpperHandGame.SECOND; // ゲームの勝者を取得する。 int winner = game.winner(); if (winner == UpperHandGame.NUTRAL) { // 引き分け playSound(PUT_BALL_SOUND); } else if (winner == p) { // コンピュータの勝ち playSound(APP_WIN_SOUND); } else { // コンピュータの負け playSound(APP_LOST_SOUND); } } } //----------------------------------------------------------------------------- // private void playSound(int id) // idで指定された音声を出力する。 //----------------------------------------------------------------------------- private void playSound(int id) { if (soundBox.getState()) { // 音声を出力する状態のとき sound[id].play(); // 音声を出力する。 } } }