//============================================================================= // UpperHand.java // Copyright(c) 1998 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.1a9"; // 著作権表示文字列 private final static String copyright = "Copyright(c) 1998 Satoshi Kobayashi, All rights reserved."; // 使用する色のインデックス 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 String soundName[] = { "ding.au", "beep.au", "laugh.au", "ouch.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]; // ゲーム盤を表示するコンポーネント private UpperHandBoardView boardView; // プレーヤーを表示するコンポーネント private UpperHandPlayerView playerView[] = new UpperHandPlayerView[2]; // 持ち玉を表示するコンポーネント private UpperHandBallView ballView[] = new UpperHandBallView[2]; // 音声 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(); // ゲームを開始する。 startGame(); } //----------------------------------------------------------------------------- // 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); } } //----------------------------------------------------------------------------- // 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; // 先手のプレーヤーを表示するコンポーネントを配置する。 c.fill = GridBagConstraints.HORIZONTAL; layout.setConstraints(playerView[UpperHandGame.FIRST], c); add(playerView[UpperHandGame.FIRST]); // 先手の持ち玉を表示するコンポーネントを配置する。 c.fill = GridBagConstraints.NONE; layout.setConstraints(ballView[UpperHandGame.FIRST], c); add(ballView[UpperHandGame.FIRST]); // 後手のプレーヤーを表示するコンポーネントを配置する。 c.fill = GridBagConstraints.HORIZONTAL; layout.setConstraints(playerView[UpperHandGame.SECOND], c); add(playerView[UpperHandGame.SECOND]); // 後手の持ち玉を表示するコンポーネントを配置する。 c.fill = GridBagConstraints.NONE; layout.setConstraints(ballView[UpperHandGame.SECOND], c); add(ballView[UpperHandGame.SECOND]); } //----------------------------------------------------------------------------- // 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) { if (game.isFinish()) { // ゲームが終了している場合 startGame(); // 新しいゲームを始める。 } else { 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 void startGame() // ゲームを開始する。 //----------------------------------------------------------------------------- public void startGame() { // プレーヤーを初期化する。 initPlayer(); // ゲームを初期化する。 game.init(); // 次の一手に進む。 nextMove(); } //----------------------------------------------------------------------------- // public void makeMove(int p) // 位置pに着手する。 //----------------------------------------------------------------------------- public void makeMove(int p) { // 着手する。 game.makeMove(p); if (game.isFinish()) { // ゲームが終わったとき finishGame(); // 終局時の処理を行う。 } else { playSound(PUT_BALL_SOUND); // 玉を置いた音を出す。 nextMove(); // 次の一手に進む。 } } //----------------------------------------------------------------------------- // private void initPlayer() // コンピュータのプレーヤーを生成し、コンピュータが後手、先手の順になるよ // うに手番を決める。 //----------------------------------------------------------------------------- private void initPlayer() { // プレーヤーを初期化する。 if (player[UpperHandGame.SECOND] != null) { // 後手がコンピュータの場合 // 先手をコンピュータ、後手を人間に設定する。 player[UpperHandGame.FIRST] = new UpperHandPlayer(); player[UpperHandGame.SECOND] = null; // プレーヤーの名前を設定する。 playerView[UpperHandGame.FIRST].playerName("Duke"); playerView[UpperHandGame.SECOND].playerName("You"); } else { // 先手を人間、後手をコンピュータに設定する。 player[UpperHandGame.FIRST] = null; player[UpperHandGame.SECOND] = new UpperHandPlayer(); // プレーヤーの名前を設定する。 playerView[UpperHandGame.FIRST].playerName("You"); playerView[UpperHandGame.SECOND].playerName("Duke"); } } //----------------------------------------------------------------------------- // private void nextMove() // 次の一手に進む。 // 次のプレーヤーがコンピュータのときは、次に一手をコンピュータに選択 // させ、着手する。次のプレーヤーが人間のときは何もせずにリターンし、 // マウスの入力を待つ。 //----------------------------------------------------------------------------- private void nextMove() { int p = game.nextPlayer(); if (player[p] != null) { // 次のプレーヤーがコンピュータのとき // 次の一手をコンピュータに選択させ、着手する。 makeMove(player[p].selectMove(game)); } } //----------------------------------------------------------------------------- // private void finishGame() // 終局時の処理を行う。 //----------------------------------------------------------------------------- private void finishGame() { // コンピュータの手番を取得する。 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) { sound[id].play(); } }