トップ 新規 編集 差分 一覧 ソース 検索 ヘルプ PDF RSS ログイン

Javaの応用:○×ゲーム

 ○×ゲーム

3x3のマスに○×を入れて、3つ連続すれば勝利。サンプルなので人がいつでも○で先攻。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
package sample.game;

import java.awt.BorderLayout;
import java.awt.Font;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Random;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;

//ルール:○が先攻、×が後攻。ここでは人が先攻
public class MaruBatsu {
    enum OX {O,X,未};    //○×のマーカー
    private OX[][] slot = new OX[3][3];
    private MaruBatsu(){
        reset();
        new Player();
    }
    private void reset(){
        for(int y=0;y<3;y++) {
            for(int x=0;x<3;x++) {
                slot[x][y] = OX.未;    //未入力状態でリセット
            }
        }
    }
    private Random random = new Random();
    private void cpuTurn(){
        while(true) {
            int x = random.nextInt(3);
            int y = random.nextInt(3);
            if(slot[x][y]==OX.未){
                slot[x][y] = OX.X;
                break;
            }
        }
    }
    private int cycle(int x) {
        if(x>2) x=x-3;
        return x;
    }
    private String message;
    private boolean isEnd(){
        boolean drawFlag = true;    //すべて"未"がなくなれば引き分けなので
        for(int y=0;y<3;y++) {
            for(int x=0;x<3;x++) {
                if(slot[x][y]==OX.未) {
                    drawFlag=false;
                    continue;
                }
                if(x==y) {
                    if( ((slot[x][y]==slot[x][cycle(y+1)])&&(slot[x][y]==slot[x][cycle(y+2)]))||
                        ((slot[x][y]==slot[cycle(x+1)][y])&&(slot[x][y]==slot[cycle(x+2)][y]))||
                        ((slot[x][y]==slot[cycle(x+1)][cycle(y+1)])&&(slot[x][y]==slot[cycle(x+2)][cycle(y+2)]))){
                        message = slot[x][y].toString()+"が勝ちました";
                        return true;
                    }
                }
            }
        }
        if(drawFlag) {
            message = "引き分けです";
            return true;
        }
        return false;
    }
    public static void main(String[] args) {
        new MaruBatsu();
    }
    @SuppressWarnings("serial")
    class Player extends JFrame {
        OXButton[][] oxButton = new OXButton[3][3];
        JLabel status = new JLabel("好きな場所をクリックしてください");
        JPanel dataPanel = new JPanel(new GridLayout(3,3));
        Player(){
            super("○×ゲーム");
            initPanel();
            add(dataPanel,BorderLayout.CENTER);
            add(status,BorderLayout.SOUTH);
            setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //×押したら終了
            pack();
            setVisible(true); //表示
        }
        private void initPanel() {
            for(int y=0;y<3;y++) {
                for(int x=0;x<3;x++) {
                    oxButton[x][y] = new OXButton(x,y,slot[x][y]);
                    dataPanel.add(oxButton[x][y]);
                }
            }
        }
        public void drawData() {
            for(int y=0;y<3;y++) {
                for(int x=0;x<3;x++) {
                    oxButton[x][y].setText(slot[x][y].toString());
                    oxButton[x][y].setEnabled(slot[x][y]==OX.未);    //すでにマークされた場所は押せないように
                }
            }
        }
        void showEndDialog (String msg){
            int rtv = JOptionPane.showConfirmDialog(this,
                    "<html>"+msg+"<br>" +
                    "再チャレンジしますか?",
                    "終了&再チャレンジ?",
                    JOptionPane.YES_NO_OPTION);
            if(rtv==JOptionPane.YES_OPTION) {
                reset();
                drawData();
            } else {
                System.exit(0);
            }
        }
        class OXButton extends JButton {
            private int x=0,y=0;    //このボタンのx座標、y座標
            OXButton(int x,int y,OX ox) {
                super(ox.toString());
                this.x = x;
                this.y = y;
                setFont(new Font("SansSerif",Font.PLAIN,40));
                addActionListener(new ActionListener(){
                    @Override
                    public void actionPerformed(ActionEvent e) {
                        pushed();
                    }
                });
            }
            private void pushed() {
                slot[x][y] = OX.O;
                drawData();
                if(isEnd()) {
                    showEndDialog(message);
                    return;
                }
                cpuTurn();
                drawData();
                if(isEnd()) {
                    showEndDialog(message);
                }
            }
        }
    }
}
MaruBatsu.java

最終更新時間:2008年04月13日 07時14分59秒