ここではマルバツゲームのメソッドの紹介を行います。
アプレットについてはこちらの記事をご覧ください。
全体のソースコードは以下の記事をご覧ください。
initメソッド
public void init() {
setLayout(null);
masu=new int;
//リセットボタンの設定
bt=new Button("RESET");
add(bt);
bt.addActionListener(this);
bt.setBounds(0,0,100,30);
//ゲームの初期化を行う
ゲームの初期化();
//マウスを使うための登録
addMouseListener(this);
}
このメソッドはアプレットを起動した時に最初に実行されるメソッドです。
このメソッドでリセットボタンの設定、マウスの登録、ゲームの初期化を行うメソッドの呼び出しを行っています。
マウスの登録をしないと、クリックしたときの処理を行うことが出来ないので注意してください。
ボタンを設定したら、actionPerformedメソッドを設定しないとエラーが出ます。
リセットボタンを押した時の処理
public void actionPerformed(ActionEvent e) {
ゲームの初期化();
}
ここではリセットボタンを押した時の処理を記述しています。
リセットボタンを押したらゲームをリセットしたいので、
ゲームの初期化メソッドを呼び出します。
スポンサーリンク
ゲームを初期化するメソッド
public void ゲームの初期化() {
for (int i=0;i<3;i++){
for (int j=0;j<3;j++){
masu[i][j]=0;
b[i][j]=0;
}
}
turn=順番を決める();
finished=false;
repaint();
}
ここではゲームを初期化していきます。
初期化する項目は、
・マスの状態
・先攻、後攻の順番
・finishedをfalseにする
これを初期化したらpaintメソッドを呼び出して画面を更新します。
repaintと書くことでpaintメソッドを再度呼び出すことが出来ます。
paintメソッド
public void paint(Graphics g) {
g.setFont(new Font("Serif",Font.PLAIN,30));
if (finished==false)
g.drawString(((turn==maru)?"○":"×")+"のターンです",200,150);
枠の表示(g);
マスの表示(g);
String str=勝敗の判定();
if (str.equals(""));
else {
g.setColor(Color.red);
g.drawString(str,FRAMEPOSX,FRAMEPOSY-50);
揃ったマスの表示(g);
}
}
このpaintメソッドは画面に描画するときに使うメソッドです。
ここではマルとバツのどちらのターンなのか、
枠線、マスの中の描画を行うメソッドの呼び出し、
勝敗判定のメソッドの呼び出しを行っています。
g.setFont(new Font("Serif",Font.PLAIN,30));
この文で、文字のフォントと大きさを指定しています。
g.setColor(Color.red);
この文で文字の色を指定しています。
フォント、色の指定について詳しくはこちらの記事をご覧ください。
スポンサーリンク
枠線の表示を行うメソッド
public void 枠の表示(Graphics g) {
//横に線を引く
for (int i=0;i<4;i++)
g.drawLine(FRAMEPOSX, FRAMEPOSY + (i * FRAMEHEIGHT),
FRAMEPOSX + (3 * FRAMEWIDTH), FRAMEPOSY + (i *
FRAMEHEIGHT));
//縦に線を引く
for (int i=0;i<4;i++)
g.drawLine(FRAMEPOSX + (i * FRAMEWIDTH), FRAMEPOSY,
FRAMEPOSX + (i * FRAMEWIDTH), FRAMEPOSY + (3 *
FRAMEHEIGHT));
}
ここでは枠線の表示を行っています。
これは枠の左と上の線の座標を設定しておき、
掛け算と足し算で他の線の座標を求めています。
線の描画について詳しくはこちらの記事をご覧ください。
マス内の描画を行うメソッド
public void マスの表示(Graphics g) {
for (int i=0;i<3;i++) {
for (int j=0;j<3;j++) {
if (masu[i][j]==maru)
g.drawString("○", FRAMEPOSX + (j * FRAMEWIDTH) + (FRAMEWIDTH / 2),
FRAMEPOSY + (i * FRAMEHEIGHT) + (FRAMEHEIGHT / 2));
if (masu[i][j]==batu)
g.drawString("×", FRAMEPOSX + (j * FRAMEWIDTH) + (FRAMEWIDTH / 2),
FRAMEPOSY + (i * FRAMEHEIGHT) + (FRAMEHEIGHT / 2));
}
}
}
ここではマス内に〇と✕を描画しています。
配列を見て、配列の中に〇か✕がある場合は
それをマスの中に描画します。
g.drawString(String型,int,int);
このintのところに入れた数値の座標のところに
Stringの値を表示します。
文字の描画について詳しくはこちらの記事をご覧ください。
スポンサーリンク
マウスのイベント処理
public void mouseEntered(MouseEvent e) { repaint(); }
public void mouseExited(MouseEvent e) { repaint(); }
public void mouseReleased(MouseEvent e){ repaint(); }
public void mouseClicked(MouseEvent e) { repaint(); }
public void mousePressed(MouseEvent e) {
x=e.getX();
y=e.getY();
//枠外をクリックされた時は何もしない
if(x < FRAMEPOSX || x > (FRAMEPOSX + (3*FRAMEWIDTH)) ||
y < FRAMEPOSY || y > (FRAMEPOSY + (3*FRAMEHEIGHT)))
return;
//ゲームが終わっている時は何もしない
if (finished) return;
//座標を配列で使用できるように変換
int masuX=(x-FRAMEPOSX)/FRAMEWIDTH;
int masuY=(y-FRAMEPOSY)/FRAMEHEIGHT;
boolean 判定=マスの確認(masuY,masuX);
if(判定==true) {
masu[masuY][masuX]=turn;
turn*=-1;
//勝敗が決まっている時はtrueにして、分かるようにする
if(勝敗の判定().equals("○の勝ちです")) finished=true;
if(勝敗の判定().equals("×の勝ちです")) finished=true;
if(勝敗の判定().equals("引き分けです")) finished=true;
}
//画面を更新する
repaint();
}
ここではマウスをクリックしたときなどの処理を記述しています。
・マウスをクリックしたときの処理
mouseClicked()
・マウスがアプレット上に入ったときの処理
mouseEntered()
・マウスがアプレットから出たときの処理
mouseExited()
・マウスのボタンを押した時の処理
mousePressed()
・マウスのボタンを離した時の処理
mouseReleased()
勝敗の判定メソッド
public String 勝敗の判定() {
//縦、横に揃っているかどうか確認する
for (int i=0;i<3;i++) {
int 縦=0;
int 横=0;
for (int j=0;j<3;j++) {
縦+=masu[j][i];
横+=masu[i][j];
}
//揃っているラインを別の配列に入れる
if (縦==3) {
for (int a=0;a<3;a++)
b[a][i]=masu[a][i];
return "○の勝ちです";
}else if (横==3) {
for (int a=0;a<3;a++)
b[i][a]=masu[i][a];
return "○の勝ちです";
}else if (縦==-3) {
for (int a=0;a<3;a++)
b[a][i]=masu[a][i];
return "×の勝ちです";
}else if (横==3) {
for (int a=0;a<3;a++)
b[i][a]=masu[i][a];
return "×の勝ちです";
}
}
//斜めに揃っているかどうか判定する
int ナナメ1=masu[0]+masu+masu[0];
int ナナメ2=masu[0][0]+masu+masu;
//揃っているラインを別の配列に入れる
if(ナナメ1==3||ナナメ1==-3) {
b[0]=masu[0];
b=masu;
b[0]=masu[0];
if (ナナメ1==3) return "○の勝ちです";
else return "×の勝ちです";
}else if (ナナメ1==-3||ナナメ2==3) {
b[0][0]=masu[0][0];
b=masu;
b=masu;
if (ナナメ1==-3) return "×の勝ちです";
else return "○の勝ちです";
}
//引き分けの判定を行う
int count=0;
for (int i=0;i<3;i++)
for (int j=0;j<3;j++)
if (masu[i][j]!=none) count++;
if (count==9) return "引き分けです";
//ゲームが終わっていない場合は空白を返す
return "";
}
ここでは勝敗がついたかどうか確認します。
配列には〇は1、✕は-1、それ以外は0が入ってます。
そのため縦、横、斜めのどれかのラインの
合計が3か-3になったら1列同じ記号で
揃っているということになるので
その方法で判定しています。
最後、勝負が決まった後に揃ったラインを
赤文字で表示するのでそのために揃ったラインを
配列に入れています。
スポンサーリンク
揃った1列を赤文字で表示する
public void 揃ったマスの表示(Graphics g) {
for (int i=0;i<3;i++) {
for (int j=0;j<3;j++){
if (b[i][j]==maru)
g.drawString("○", FRAMEPOSX + (j * FRAMEWIDTH) + (FRAMEWIDTH / 2),
FRAMEPOSY + (i * FRAMEHEIGHT) + (FRAMEHEIGHT / 2));
if (b[i][j]==batu)
g.drawString("×", FRAMEPOSX + (j * FRAMEWIDTH) + (FRAMEWIDTH / 2),
FRAMEPOSY + (i * FRAMEHEIGHT) + (FRAMEHEIGHT / 2));
}
}
}
ここでは揃った1列を赤文字で描画しています。
勝敗の判定メソッドで用意しておいた配列を使い、
揃ったラインだけを赤文字で表示しています。
マスに記号が入っているかどうか判定する
public boolean マスの確認(int x,int y) {
if(masu[x][y]==none) return true;
else return false;
}
ここでは指定されたマスに既に〇か✕が
入っていないかどうか確認するメソッドです。
何も入っていないときはtrue、
〇か✕が入っている時はfalseを返します。