Report#8
Java Applet/AWTについて学び、JavaAppletのオリジナルプログラムを作成し解説せよ
ソース
import java.applet.Applet;
import java.awt.*;
import java.awt.event.*;
public class minesw extends java.applet.Applet implements MouseListener{
int xmax=12;// 列
int ymax=10;//行
int xy_max=xmax * ymax;
/*0:なし1~8:開いた 9:爆弾がある 10:開いてない 11:爆弾をクリック 12:クリックしてない*/
int sts[]=new int[xy_max];
int bmax=15;//bombの数
int square=16;// マス目の幅
int margin=20;// 端まで行かないよう余裕を取る
int gend;//game over flg(0:ゲーム中 1:クリア 2:自爆)
Image offs; // オフスクリーン
Graphics gf;
public void init(){
/* オフスクリーンの設定 */
offs=createImage(300,300);
gf=offs.getGraphics();
/* マウスリスナとして自分自身を登録 */
addMouseListener(this);
gameInit();
}
public void paint(Graphics g) {
update(g);
}
public void update(Graphics g){
int i,j;
int k;// マスの番号
int xx, yy; // マスの座標
gf.setColor(Color.white);
gf.fillRect(0,0,300,300);
/* RESETボタンの描画 */
gf.setColor(Color.green); //ボタンの背景色
gf.fillRect(20,180,60,20); //RESETボタンの枠の座標
gf.setColor(Color.black); //表示する文字の色
gf.drawString("もう一度",23,193);//文字を表示する位置
/* マスの描画 */
for(i=0;i=9){
gf.setColor(Color.gray);
gf.fillRect(xx, yy, square, square);
if(sts[k]>10){
gf.setColor(Color.red);
gf.drawString("危 ",xx+3,yy+13); //マスの中に表示するマーク" ! "とそれの位置
}
}
else{
gf.setColor(Color.white); //マスを開いたときの背景色
gf.fillRect(xx, yy, square, square);
if(sts[k]!=0){
gf.setColor(Color.blue); //周囲の爆弾の数を表す数値の色
gf.drawString("" + sts[k],xx+4,yy+13); //周囲の爆弾の数
}
}
/*爆弾のあるマスを表示*/
if(gend==2 & (sts[k]==9 || sts[k]==11)){
gf.setColor(Color.red); //爆弾のあるマスの色
gf.fillRect(xx,yy,square,square);
gf.setColor(Color.black); //爆弾マークの色
gf.drawString(" * ",xx+3,yy+13); //爆弾マークの表示位置
}
gf.setColor(Color.black); //マスの枠の色
gf.drawRect(xx,yy,square,square); //枠のサイズ
}
}
if(gend==1){
gf.setColor(Color.yellow);
gf.drawString(" Clear !! ",100,170);
}
if(gend==2){
gf.setColor(Color.magenta);
gf.drawString(" Game Over ",100,170);
}
/* オフスクリーンのイメージを一挙に実際の表示領域に描く */
g.drawImage(offs,0,0,this);
}
public void mousePressed(MouseEvent e){
/* マウスボタンが押された */
int ix, iy;// マウスが押された座標
int row, col;// マウスが押された位置(行、列)
int k;
/* マウスが押された座標を得る */
ix=e.getX();
iy=e.getY();
if (ix>20 & ix<80 & iy>180 & iy<200) { //やり直しボタンの有効範囲
/* やり直しボタン */
gameInit();
repaint();
return;
}
col=(ix-margin)/square;
row=(iy-margin)/square;
if(col<0 || col>=xmax || row<0 || row>=ymax){
return;
}
k=row*xmax+col;
if((e.getModifiers() &MouseEvent.CTRL_MASK)!=0) {
//CTRLキー併用
if(sts[k]==9 || sts[k]==10){
sts[k]+=2;
}
else if(sts[k]==11 || sts[k]==12){
sts[k]-=2;
}
}
else{
if(sts[k]>=10){
sts[k]=bombCount(col,row);
if(sts[k]==0) AroundOpen(col,row);
}
if(sts[k]==9){
gend=2;
}
}
endCheck();
repaint();
}
/* マウスボタンが離された時の処理 */
public void mouseReleased(MouseEvent e){
}
/* マウスボタンがクリックされた時の処理 */
public void mouseClicked(MouseEvent e){
}
/* マウスカーソルが入ってきた時の処理*/
public void mouseEntered(MouseEvent e){
}
/* マウスカーソルが出て行く時の処理*/
public void mouseExited(MouseEvent e){
}
/*初期処理*/
public void gameInit(){
int i;
int k;
gend=0; //初期化
for(i=0;i=0 & px+i-1=0 &py+j-1=0 & px+i-1=0 &py+j-1=9){
sts[xy]=bombCount(px+i-1,py+j-1);
if(sts[xy]==0) AroundOpen(px+i-1,py+j-1);
}
}
}
}
}
}
/*ゲーム終了の判定を行う*/
public void endCheck(){
int i,cnt;
cnt=0;
for(i=0;i< xy_max;i++){
if(sts[i]<9) cnt++;
}
if((cnt+bmax)==xy_max) gend=1;
}
}
実行結果
考察
MouseListener
java.awt.eventパッケージに含まれていて、これを実装し、リスナーとして
登録することでマウスによるイベント処理できるようになる。
また、MouseListenerには
mouseClicked(MouseEvent e)
mouseEntered(MouseEvent e)
mouseExited(MouseEvent e)
mousePressed(MouseEvent e)
mouseReleased(MouseEvent e)
の5つメソッドが用意されている。このうち、ある処理だけ
したい場合に、使わないメソッドも出てくることもあるが、その場合でもすべてのメソッドを定義
しておかないとコンパイルエラーになる。
Image
Image getImage(URL base, StringfileName)と記述することで、baseというURLを
一つ目の引数として受け取り、次のfileNameを二つ目の引数として受け取ることが出来る。
トップへ