[解決済み] JavaによるGUI付きTicTacToe
2022-02-01 20:54:39
質問事項
TicTacToeをプレイするプログラムを書きました。 以下は、プレイヤーが勝ったかどうかをチェックするメソッドを含むクラスです。
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class TicTacToe {
public static int count = 0;
public static String[][] board = new String[3][3];
public static void buttonClicked(JButton button) {
if(button.getText().equals("")) {
count++;
if(count % 2 == 1) {
button.setText("X");
}
if(count % 2 == 0) {
button.setText("O");
}
}
}
public static void gameRules(JButton button) {
//"X" or "O"?
String string = button.getText();
//Gives coordinates of the button
int x = Character.getNumericValue(button.getName().charAt(0));
int y = Character.getNumericValue(button.getName().charAt(1));
board[x][y] = string;
//diagonal
if(board[0][0].equals(board[1][1]) && board[1][1].equals(board[2][2])) {
JOptionPane.showMessageDialog(null,string + " won.");
}
//other diagonal
else if(board[0][2].equals(board[1][1]) && board[1][1].equals(board[2][0])) {
JOptionPane.showMessageDialog(null,string + " won.");
}
//draw?
else if(count==9) {
JOptionPane.showMessageDialog(null,"draw.");
}
else {
//row
for(int i = 0; i < 3; i++) {
if(board[i][0].equals(board[i][1]) && board[i][1].equals(board[i][2])) {
JOptionPane.showMessageDialog(null,string + " won.");
}
}
//column
for(int j = 0; j < 3; j++) {
if(board[0][j].equals(board[1][j]) && board[1][j].equals(board[2][j])) {
JOptionPane.showMessageDialog(null,string + " won.");
}
}
}
}
}
他の2つのクラスは以下の通りです。これで完全なコードが完成しました。
public class Control {
public static void main(String args[]) {
Gui gui = new Gui();
TicTacToe ticTacToe = new TicTacToe();
}
}
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class Gui {
public Gui() {
JFrame frame = new JFrame();
JPanel panel = new JPanel();
panel.setLayout(new java.awt.GridLayout(3, 3));
for (int i = 0; i < 3; i++){
for(int j = 0; j < 3; j++) {
final JButton button = new JButton();
String string = i + "" + j;
button.setText("");
button.setName(string);
button.addActionListener(
new ActionListener() {
public void actionPerformed(ActionEvent e) {
TicTacToe.buttonClicked(button);
TicTacToe.gameRules(button);
}
});
button.setBorder(BorderFactory.createLineBorder(Color.BLACK));
panel.add(button);
}
}
frame.add(panel);
frame.setSize(400,400);
frame.setVisible(true);
}
}
私の問題は、誰かが対角線上で勝ったときにプログラムが認識するようになったことですが、行と列では認識されません。
問題解決のために、何かお手伝いいただけると幸いです。
どのように解決するのですか?
をインポートするだけです。
import javax.swing.*;
をTicTacToe.javaに追加します。
winのif文を編集し、静的な定義を削除してください。
if(board[0][0] != null && board[0][0].equals(board[1][1]) && board[1][1].equals(board[2][2])) {
JOptionPane.showMessageDialog(null,string + " won.");
} else if(board[0][2] != null && board[0][2].equals(board[1][1]) && board[1][1].equals(board[2][0])) {
JOptionPane.showMessageDialog(null,string + " won.");
} else if(count == 9) {
JOptionPane.showMessageDialog(null, "draw.");
} else {
for (int i = 0; i < 3; i++) {
if (board[i][0] != null && board[i][0].equals(board[i][1]) && board[i][0].equals(board[i][2])) {
JOptionPane.showMessageDialog(null, string + " won."); break;
}
if (board[0][i] != null && board[0][i].equals(board[1][i]) && board[0][i].equals(board[2][i])) {
JOptionPane.showMessageDialog(null, string + " won."); break;
}
}
}
追加
TicTacToe ticTacToe = new TicTacToe();
をGui変数に追加します。
アクションリスナーを変更します。
public void actionPerformed(ActionEvent e) {
ticTacToe.buttonClicked(button);
ticTacToe.gameRules(button);
}
削除
TicTacToe ticTacToe = new TicTacToe();
をコントロールから削除します。
NullPointerException例外が数え切れないほど発生しましたので、常にエラーをチェックしてください。
関連
-
[解決済み】popBackStack()とreplace()の操作はどう違うのですか?
-
[解決済み】Ubuntu: OpenJDK 8 - パッケージを見つけることができません。
-
[解決済み] JavaでInputStreamを読み込んでStringに変換するにはどうすればよいですか?
-
[解決済み] JavaでNullPointerExceptionを回避する方法
-
[解決済み] JavaにおけるHashMapとHashtableの違いは何ですか?
-
[解決済み] Java Mapの各エントリを効率的に反復処理するには?
-
[解決済み] Javaでメモリーリークを発生させるにはどうしたらいいですか?
-
[解決済み] Javaにおけるpublic、protected、package-private、privateの違いは何ですか?
-
[解決済み] JavaでArrayListではなくLinkedListを使用するのはいつですか?
-
[解決済み] JavaでStringをintに変換するにはどうしたらいいですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] if / for / while 内で "Missing return statement" が発生する。
-
[解決済み】Javaの".class期待値"
-
[解決済み】Doubleはdereferencedできない?
-
[解決済み】宣言されたパッケージが期待されるパッケージと一致しない ""
-
[解決済み】Javaを包含するクラスではないのか?
-
[解決済み】ソースルート外のJavaファイル intelliJ
-
[解決済み】純粋なJUnitテストにVisibleForTestingを使用する方法
-
[解決済み] java.sql.SQLException を取得しました。ResultSet が終了した後の操作は許可されません。
-
[解決済み】javaで無効な文字定数
-
[解決済み】CreateProcess error=2, The system cannot find file specified.