/**  * タイトル：じゃんけんゲームのアプレット  * 学習事項：Canvasのインナークラス、Thread、Math.random()  * 作成日：01.9.26  **/ import java.awt.*; import java.awt.event.*; import java.applet.Applet; import java.io.*; public class CanvThread2 extends Applet implements ActionListener{	SimpleCanvas canv;		// 自作のキャンバス	int user_no_te;		// ユーザーの「手」を保存する変数					// →「ぐー」は０、「ちょき」は１、「ぱー」は２、「手」が未定のあいだは３	/**	* SimpleCanvas（自作のキャンバス）の定義	**/	class SimpleCanvas extends Canvas implements Runnable{		Image img[];		// コンピュータ側のじゃんけんの「手」を表す画像を保存する配列		Thread th;		// 「手」を表す画像の切り替え（再描画）を反復するスレッド		boolean stopFlag;	// スレッドの状態（停止/実行）を記憶させる変数		/* initメソッド：SimpleCanvasの初期化を行う */		public void init(){			/*コンピュータ側の「手」を表す 画像データを読み込む */			img = new Image[3];			img[0] = getImage(getDocumentBase(), "goo.gif");	// 「ぐー」は０番			img[1] = getImage(getDocumentBase(), "choki.gif");	// 「ちょき」は１番			img[2] = getImage(getDocumentBase(), "pa.gif");	// 「ぱー」は２番		} 		/* startメソッド：画像の切り替えをおこなうスレッドを開始する */		public void start(){			/* スレッドが空（＝存在しない）の時にのみ新しいスレッドを作成、開始する */			if(th == null){				th = new Thread(this);	// 新しいスレッドを作成する				stopFlag = false;		// スレッドが「実行」の状態にあることを記憶させる				th.start();			// 新しいスレッドの処理を開始する			}		}		/* stopメソッド：画像の切り替えをおこなうスレッドを停止する */		public void stop(){			/* スレッドが存在する場合、破棄する */			if( th != null ){				stopFlag = true;	// スレッドが「停止」の状態にあることを記憶させる				th = null;		// スレッドを破棄する			}			repaint();			// 最後の１回の（すなわち、コンピュータの「手」と							// 勝負の結果を確定する）描画をおこなう		}		/* runメソッド： 「手」を表す画像の再描画を、停止の命令がかかるまで反復する */		public void run(){			/* 無限ループによってキャンバス上の再描画を反復する */			while( true ){				repaint();		// 再描画する				try{					Thread.sleep(50);	// スレッドを50ミリ秒停止する（視覚的演出）				}catch(InterruptedException e){				}				if(stopFlag){		// スレッドが「停止」状態にある場合、					break;		// 無限ループから抜け出す				}			}		}		/* paintメソッド：コンピュータの「手」を決定し、該当する画像の描画を行う 		加えて勝負の結果も表示する*/		public void paint(Graphics g){			/* じゃんけんの「手」を表す画像の番号をランダムに決定する */			int i;			i = (int)(Math.random() * 29);	// 乱数を得る（iには0〜29が入る）			/* 決定された番号に該当する画像を表示し、勝負の結果を表示する */			if (i < 10){							// iが0〜9ならば				g.drawImage( img[0], 30, 30, this );		// 「ぐ〜」を出す				if(user_no_te == 0){				// ユーザーの「手」が「ぐー」ならば					g.drawString("DRAW!", 150, 50);	 	// 引き分けであることを表示する				}else if(user_no_te == 1){			// ユーザーの「手」が「ちょき」ならば					g.drawString("YOU L0SE!",150,50);	// ユーザーの負けであることを表示する				}else if(user_no_te == 2){			// ユーザーの「手」が「ぱー」ならば					g.drawString("YOU WIN!", 150,50);	// ユーザーの勝ちであることを表示する				}else{							// それ以外（「未定」の場合）ならば					g.drawString("               ", 150, 50);	// 空白を表示する（外見上何も表示しない）				}			}else if (i > 19)	{					// iが10〜19ならば				g.drawImage( img[1], 30, 30, this );		// 「ちょき」を出す				if(user_no_te == 0){				// ユーザーの「手」が「ぐー」ならば					g.drawString("YOU WIN!",150, 50);	 // ユーザーの勝ちであることを表示する				}else if(user_no_te == 1){			// ユーザーの「手」が「ちょき」ならば					g.drawString("DRAW!", 150,50);		// 引き分けであることを表示する				}else if(user_no_te == 2){			// ユーザーの「手」が「ぱー」ならば					g.drawString("YOU LOSE!", 150,50);	// ユーザーの負けであることを表示する				}else{							// それ以外（「未定」の場合）ならば					g.drawString("               ", 150, 50);	// 空白を表示する（外見上何も表示しない）				}			}else{								// どちらでもなければ				g.drawImage( img[2], 30, 30, this );		// 「ぱ〜」を出す				if(user_no_te == 0){				// ユーザーの「手」が「ぐー」ならば					g.drawString("YOU LOSE!", 150, 50);	 // ユーザーの負けであることを表示する				}else if(user_no_te == 1){			// ユーザーの「手」が「ちょき」ならば					g.drawString("YOU WIN!", 150,50);	// ユーザーの勝ちであることを表示する				}else if(user_no_te == 2){			// ユーザーの「手」が「ぱー」ならば					g.drawString("DRAW!", 150,50);		// 引き分けであることを表示する				}else{							// それ以外（「未定」の場合）ならば					g.drawString("               ", 150, 50);	// 空白を表示する（外見上何も表示しない）				}			}		}	}// SimpleCanvasの定義はここまで	/* initメソッド：アプレットの初期化を行う */	public void init(){		/* ユーザーの「手」を表す変数を初期化する */		user_no_te = 3;	// 「手」が「未定」の状態にする				/* GUI部品を用意する */		Button start, goo,choki,pa;	// ユーザーによる入力用のボタン 		Panel p;			// ボタンを貼り付けるパネル		/* レイアウトの方法を決定する */		setLayout( new BorderLayout() );		/* SimpleCanvas（自作のキャンバス）を用意し、		 初期化した後、アプレット本体に貼り付ける */		canv = new SimpleCanvas();		canv.init();			// キャンバスの初期化を行う		add( "Center", canv );	// アプレット画面中央にキャンバスを配置する		/* スタート・ボタンを用意し、命令入力の準備をおこなった上で、		アプレット本体に貼り付ける */		start = new Button("start");		// スタート・ボタンを用意する		start.setActionCommand("START");	// このボタンが押されたときに発生するイベントの								// コマンド名を「START」と定める		start.addActionListener(this);		// このボタンの上で発生したイベントのリスナーは								// アプレット自身であると定める		add( "North", start );			// アプレット画面上部にスタート・ボタンを配置する		/* ユーザー側のじゃんけんの「手」を入力する三つのボタン（「goo」「choki」「pa」）を		用意し、命令入力の準備をおこなった上で、アプレット本体に貼り付ける */		p = new Panel();				// 三つのボタンをまとめて貼り付けるパネルを用意する		goo = new Button("goo");			// 「goo」ボタンを用意する		goo.setActionCommand("GOO");		// このボタンが押されたときに発生するイベントの								// コマンド名を「GOO」と定める		goo.addActionListener(this);		// このボタンの上で発生したイベントのリスナーは								// アプレット自身であると定める		choki = new Button("choki");		// 「choki」ボタンを用意する		choki.setActionCommand("CHOKI");	// このボタンが押されたときに発生するイベントの								// コマンド名を「CHOKI」と定める		choki.addActionListener(this);		// このボタンの上で発生したイベントのリスナーは								// アプレット自身であると定める		pa = new Button("pa");			// 「pa」ボタンを用意する		pa.setActionCommand("PA");		// このボタンが押されたときに発生するイベントの								// コマンド名を「PA」と定める		pa.addActionListener(this);			// このボタンの上で発生したイベントのリスナーは								// アプレット自身であると定める		p.add(goo );					// それぞれのボタンを「goo」「choki」「pa」の順に		p.add(choki );				// パネルに並べて貼り付ける		p.add(pa );		add("South", p );				// 三つのボタンが並んだパネルをアプレット下部に配置する	}		/* stopメソッド：アプレットの処理を停止する */	public void stop(){		canv.stop();		// キャンバスのスレッドを停止する	}		/* actionPerformedメソッド：ボタンが押されたときに発生するイベントの処理を行う */	public void actionPerformed( ActionEvent e ){		/* イベントのコマンド名を受け取る */		String command = e.getActionCommand();		/* コマンド名を手がかりに押されたボタンを判別		押されたボタンに応じてアプレットの状態を決定する*/		if (command.equals("START")){		// コマンド名が「START」→スタート・ボタンが押された場合			user_no_te = 3;			// ユーザーの「手」を保存する変数を、初期値に戻す			canv.start();				// キャンバスのスレッドを開始する		}		else if(command.equals("GOO")){ 	//コマンド名が「GOO」→「goo」ボタンが押された場合			user_no_te = 0;			// ユーザーの「手」が「ぐー」であることを記憶させ、			canv.stop();				// キャンバスのスレッドを停止する		}		else if(command.equals("CHOKI")){ 	//コマンド名が「CHOKI」→「choki」ボタンが押された場合			user_no_te = 1;			// ユーザーの「手」が「ちょき」であることを記憶させ、			canv.stop();				// キャンバスのスレッドを停止する		}		else if(command.equals("PA")){ 		//コマンド名が「PA」→「PA」ボタンが押された場合			user_no_te = 2;			// ユーザーの「手」が「ぱー」であることを記憶させ、			canv.stop();				// キャンバスのスレッドを停止する		}	} }  