【发布时间】:2019-07-30 21:26:07
【问题描述】:
我正在使用 java 创建这个井字游戏,但是,当我尝试编译程序时,我不断收到来自 Cell 类的 cannot find symbol 错误,我正在努力解决这个问题。
阅读cannot find symbol 错误编译我意识到问题出在Cell 类中的whoseTurn 变量上。我研究了为什么会出现 cannot find symbol 并发现这主要是由于标识符:
- 拼写错误。
- 调用标识符时使用了错误的大小写。
- 使用在另一个类中声明的变量,但隐式告诉编译器查找错误的类、作用域或包。
但是whoseTurn 变量在Cell 类中没有拼写错误,我在调用标识符时也没有遇到任何错误。但是,我能看到的唯一可行的问题是变量whoseTurn 超出范围,或者我隐式告诉编译器查找错误的类。
该类控制游戏的所有基本控件:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.border.LineBorder;
public class Cell extends JPanel {
public char token = ' ';
public Cell () {
setBorder (new LineBorder (Color.black, 1));
addMouseListener (new MouseListener ());
}//CLOSE CONSTRUCTOR
//GETTOKEN METHOD
public char getToken () {
return token;
}//CLOSE GETTOKEN METHOD
//SETTOKEN METHOD
public void setToken (char c) {
token = c;
repaint ();
}//CLOSE SETTOKEN METHOD
//PAINTCOMPONENT METHOD
protected void paintComponent (Graphics g) {//WHEN THE setTOKEN () CALLS REPAINT()
super.paintComponent (g);
if (token == 'x') {//IF STATEMENT
g.drawLine (10, 10, getWidth () - 10, getHeight() - 10);
g.drawLine (getWidth () - 10, 10, 10, getHeight() - 10);
}//CLOSE IF STATEMENT
else if (token == 'o') {//ELSE STATEMENT
g.drawOval (10, 10, getWidth() - 20, getHeight() - 20);
}//CLOSE ELSE STATEMENT
}//CLOSE PAINTCOMPONENT METHOD
//INNER CLASS
private class MouseListener extends MouseAdapter {//WHAT HAPPENS WHEN THE PLAYER CLICKS ON ANY OF THE COLUMNS
public void mouseClicked (MouseEvent e) {
if (token == ' ' && whoseTurn != ' ') {//THIS IS THE FIRST CANNOT FIND SYMBOL ERROR THAT OCCURS
setToken (whoseTurn);
}//CLOSE IF STATEMENT
if (isWon (whoseTurn)) {
jlblStatus.setText (whoseTurn + " won! Gameover!");
whoseTurn = ' ';
}//CLOSE IF STATEMENT
else if (isFull ()) {
jlblStatus.setText ("Tie game! Game over!");
whoseTurn = ' ';
}//CLOSE ELSE IF STATEMENT
else {
whoseTurn = (whoseTurn == 'X') ? '0' : 'X';
jlblStatus.setText (whoseTurn + "'s turn.");
}//CLOSE ELSE STATEMENT
}//CLOSE MOUSECLICKED METHOD
}//CLOSE INNER CLASS
}//CLOSE CELL CLASS
这个类构建了带有行和列的网格供用户点击,并检查用户是否制作了图案或填充了网格:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.border.LineBorder;
public class TicTacToeFrame extends JFrame {
public char whoseTurn = 'x'; // THIS IS THE INSTANCE VARIABLE WHICH IS CAUSING THE CANNOT FIND SYMBOL ERROR
public Cell [] [] cells = new Cell [3] [3];
JLabel jlblStatus = new JLabel ("X's turn to play");
public TicTacToeFrame () {
JPanel panel = new JPanel (new GridLayout (3, 3, 0, 0));
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
panel.add (cells [i] [j] = new Cell());
}//CLOSE NESTED FOR LOOP
}//CLOSE FOR LOOP
panel.setBorder (new LineBorder (Color.red, 1));
jlblStatus.setBorder (new LineBorder (Color.yellow, 1));
add (panel, BorderLayout.CENTER);
add (jlblStatus, BorderLayout.SOUTH);
}//CLOSE CONSTRUCTOR
//ISFULL METHOD
public boolean isFull () {//CHECKS WHETHER ALL THE ROWS AND COLUMNS ARE FULL
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
if (cells [i] [j].getToken () == ' ') {
return false;
}//CLOSE IF STATEMENT
}//CLOSE NESTED FOR LOOP
}//CLOSE FOR LOOP
return true;
}//CLOSE ISFULL METHOD
//ISWON METHOD
public boolean isWon (char token) {//THIS METHOD CHECKS WHETHER THE PLAYER HAS MADE A PATTERN IN A ROW OR COLUMN OR RIGHT DIAGONALLY OR LEFT DIAGONALLY
for (int i = 0; i < 3; i++) {
if ((cells [i] [0].getToken () == token) && (cells [i] [1].getToken () == token) && (cells [i] [2].getToken () == token)) {
return true;
}//CLOSE IF STATEMENT
}//CLOSE FOR LOOP
for (int j = 0; j < 3; j++) {
if ((cells [0] [j].getToken () == token) && (cells [1] [j].getToken () == token) && (cells [2] [j].getToken () == token)) {
return true;
}//CLOSE IF STATEMENT
}//CLOSE FOR LOOP
if ((cells [0] [0].getToken() == token) && (cells [1] [1].getToken () == token) && (cells [2] [2].getToken () == token)) {
return true;
}//CLOSE IF STATEMENT
if ((cells [0] [2].getToken() == token) && (cells [1] [1].getToken () == token) && (cells [2] [0].getToken () == token)) {
return true;
}//CLOSE IF STATEMENT
return false;
}//CLOSE ISWON METHOD
}//CLOSE TICTACFRAME CLASS
这是主类:
import javax.swing.JFrame;
public class TicTacToeMain {
public static void main (String [] args) {
JFrame TicTacToe = new TicTacToeFrame ();
TicTacToe.setTitle ("TicTacToe Game!");
TicTacToe.setSize (600, 600);//SET THE SIZE FOR THE JFRAME
TicTacToe.setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE);
TicTacToe.setLocationRelativeTo (null);
TicTacToe.setVisible (true);
}//CLOSES MAIN METHOD
}//CLOSES TIC TAC TOE MAIN CLASS
这是我在编译时不断遇到的错误:
Cell.java:43:错误:找不到符号
if (token == ' ' && whoTurn != ' ') { ^
符号:变量whichTurn
位置:类 Cell.MouseListenerCell.java:44:错误:找不到符号
setToken (whoseTurn);
^
符号:变量whichTurn
位置:类 Cell.MouseListenerCell.java:47:错误:找不到符号
if (isWon (whoseTurn)) {
^
符号:变量whichTurn
位置:类 Cell.MouseListenerCell.java:48:错误:找不到符号
jlblStatus.setText (whoseTurn + "赢了!Gameover!");
^
符号:变量whichTurn
位置:类 Cell.MouseListenerCell.java:48:错误:找不到符号
jlblStatus.setText (whoseTurn + "赢了!Gameover!");
^ 符号:变量 jlblStatus
位置:类 Cell.MouseListenerCell.java:49:错误:找不到符号
谁的转 = ' '; ^
符号:变量whichTurn
位置:类 Cell.MouseListenerCell.java:52:错误:找不到符号
否则 if (isFull ()) {
^
符号:方法 isFull()
位置:类 Cell.MouseListenerCell.java:53:错误:找不到符号
jlblStatus.setText ("平局!游戏结束!");
^
符号:变量 jlblStatus
位置:类 Cell.MouseListenerCell.java:54:错误:找不到符号
whoTurn = ' ';
^
符号:变量whichTurn
位置:类 Cell.MouseListenerCell.java:58:错误:找不到符号
whoTurn = (whoseTurn == 'X') ? “0”:“X”; ^
符号:变量whichTurn
位置:类 Cell.MouseListenerCell.java:58:错误:找不到符号
whoTurn = (whoseTurn == 'X') ? '0' : 'X';
^
符号:变量whichTurn
位置:类 Cell.MouseListener
有人可以帮我解决标识符whoseTurn 的“找不到符号”错误吗?
花时间阅读这篇文章。
【问题讨论】:
-
无关:这样的 cmets
if (token == 'x') {//IF STATEMENT是浪费时间和精力。这非常简单:您不需要嵌套块,因此您需要 cmets 来识别块的结束位置。相反:您正确缩进所有块,并且您也有短块,理想情况下没有任何嵌套。然后你可以省略那些除了分散读者之外什么都不做的大写cmets。
标签: java tic-tac-toe cannot-find-symbol