ここではJavaのアプレットで作ったマルバツゲームのプログラムを紹介します。
アプレットについての基礎はこちらの記事をご覧ください。
各メソッドについての解説は以下の記事で行います。
http://mittsu2017.com/2017/09/21/post-435/
仕様
・アプレットを使って作動させる
・クリックしたマスに〇か✕を表示させる
・〇か✕がすでに入っているマスに上書きはできない
・勝敗が決まったらリセット以外できない
・勝敗が決まったら揃ったラインの記号を赤く表示する
全体のソースコード
import java.applet.Applet;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseListener;
import java.awt.event.MouseEvent;
import java.util.Random;
public class マルバツゲーム extends Applet implements MouseListener,
ActionListener {
int[][] masu;
int[][] b=new int;
int x;
int y;
int none=0,maru=1,batu=-1;
final int FRAMEPOSX=200,FRAMEWIDTH=70,
FRAMEPOSY=200,FRAMEHEIGHT=70;
//1なら○のターン、-1なら×のターン
int turn;
Button bt;
boolean finished;
//初期化
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);
}
//画面に描画する
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);
}
}
//先攻、後攻をランダムに決定する
public int 順番を決める() {
Random r=new Random();
int a=r.nextInt(2);
if (a==0) return batu;
return maru;
}
//マウスがクリックされた時等のイベントの記述
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();
}
//リセットボタンを押した時の処理
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();
}
//枠線の表示を行う
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));
}
}
}
//揃ったラインの記号を赤く表示する
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));
}
}
}
//マスに既に記号が入っていないかどうか確認する
//何も入っていなければtrue、入っていればfalseを返す
public boolean マスの確認(int x,int y) {
if(masu[x][y]==none) return true;
else return false;
}
//勝敗がついているかどうか確認する
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 "";
}
}
スポンサーリンク
htmlファイル
<html>
<body>
<applet code = "マルバツゲーム.class" width =700 height =550>
</applet>
</body>
</html>
実行方法
C:\Users\Documents\Java\jdk1.8.0_51>javac マルバツゲーム.java
C:\Users\Documents\Java\jdk1.8.0_51>appletviewer マルバツゲーム.html