我一直难以理解为什么我收到以下错误:
TicTacToeClient.java:128: error: cannot find symbol
g.drawImage(icon, (i % 3) * lengthOfSpace + 10 * (i % 3), (int) (i / 3) * lengthOfSpace + 10 * (int) (i / 3), null);
symbol: variable icon
location: class TicTacToeClient
TicTacToeClient.java:131: error: cannot find symbol
g.drawImage(opponentIcon, (i % 3) * lengthOfSpace + 10 * (i % 3), (int) (i / 3) * lengthOfSpace + 10 * (int) (i / 3), null);
symbol: variable opponentIcon
location: class TicTacToeClient
这是完整的参考代码:
package Group9;
import java.awt.*;
import java.awt.event.*;
import java.awt.image.*;
import java.io.*;
import java.net.*;
import java.util.Scanner;
import javax.imageio.ImageIO;
import javax.swing.*;
public class TicTacToeClient {
public JFrame frame = new JFrame("Tic Tac Toe");
public Painter painter;
public final int Width = 506;
public final int Height = 527;
public Image field;
public Image redX;
public Image blueX;
public Image redCircle;
public Image blueCircle;
public static JTextField T1; //Player 1 - Points
public static JTextField T2; //Player 2 - Points
public static JTextField T3; //Status of the game - Connected Etc
public static int xMouse;
public static int yMouse;
public static int Clicked;
public char mark;
public String[] Square = new String[9];
public static int ServerPort;
public Socket Sock;
public BufferedReader in;
public PrintWriter out;
public TicTacToeClient(String ServerAddress) throws Exception {
//Setup networking
Scanner scanner = new Scanner(System.in);
System.out.println("Please input the Server's Port number: ");
int ServerPort = Integer.parseInt(scanner.nextLine());
Sock = new Socket(ServerAddress, ServerPort);
in = new BufferedReader(new InputStreamReader(Sock.getInputStream()));
out = new PrintWriter(Sock.getOutputStream(), true);
//Text Boxes
//Text Field 1 -- Display Player 1 score & JTextField(5) -> Create text thing that is 5 characters long
T1 = new JTextField(20);
T1.setBounds(100,40,110,30);
painter.add(T1);
//Text Field 2 - Display Player 2 score
T2 = new JTextField(20);
T2.setBounds(400,40,110,30);
painter.add(T2);
//Text Field 3 - The purpose is to show the user what mode he's connected to and if he's currently playing or not
T3 = new JTextField(20);
T3.setBounds(235,10,130,30);
painter.add(T3);
//Buttons:
//Button 1
JButton B1 = new JButton("QUIT GAME(orsomethingelse)");
B1.setBounds(30,10,200,30);
painter.add(B1);
//Button 2
JButton B2 = new JButton("RESET GAME");
B2.setBounds(370,10, 200, 30);
painter.add(B2);
//Button Actions:
B1.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent event) {
out.println("QUIT");
T3.setText("Opponent disconnected");
}
});
}//End TicTacToeClient(String ServerAddress)
private void loadImages() {
try {
ImageIcon temp = new ImageIcon("/board.png");
field = temp.getImage();
temp = new ImageIcon("/redX.png");
redX = temp.getImage();
temp = new ImageIcon("/redCircle.png");
redCircle = temp.getImage();
temp = new ImageIcon("/blueX.png");
blueX = temp.getImage();
temp = new ImageIcon("/blueCircle.png");
blueCircle = temp.getImage();
} catch (IOException e) {
e.printStackTrace();
}
}
public void play() throws Exception {
int lengthOfSpace = 160;
String response;
Graphics g;
g.drawImage(field,60,40,null);
try {
response = in.readLine();
if (response.startsWith("Welcome")) {
char mark = response.charAt(49);
Image icon = (mark == 'X') ? blueX : redCircle;
Image opponentIcon = (mark == 'X') ? redX : blueCircle;
T3.setText(response);
}//End if(response.startsWith("Welcome"))
while (true) {
response = in.readLine();
if (response.startsWith("VALID_MOVE")) {
int i = 1 + Integer.parseInt(response.substring(11));
if (mark == 'X') {
g.drawImage(icon, (i % 3) * lengthOfSpace + 10 * (i % 3), (int) (i / 3) * lengthOfSpace + 10 * (int) (i / 3), null);
}
else if (mark == 'O') {
g.drawImage(opponentIcon, (i % 3) * lengthOfSpace + 10 * (i % 3), (int) (i / 3) * lengthOfSpace + 10 * (int) (i / 3), null);
T3.setText(response);
}
frame.repaint();
T3.setText("Opponent's Turn");
} else if (response.startsWith("OPPONENT_MOVED")) {
int i = Integer.parseInt(response.substring(15));
if (mark == 'X') {
g.drawImage(icon, (i % 3) * lengthOfSpace + 10 * (i % 3), (int) (i / 3) * lengthOfSpace + 10 * (int) (i / 3), null);
}
else if (mark == 'O') {
g.drawImage(opponentIcon, (i % 3) * lengthOfSpace + 10 * (i % 3), (int) (i / 3) * lengthOfSpace + 10 * (int) (i / 3), null);
T3.setText(response);
}
frame.repaint();
T3.setText("Your Turn");
} else if (response.startsWith("VICTORY")) {
T3.setText("You win!");
break;
} else if (response.startsWith("DEFEAT")) {
T3.setText("You lose!");
break;
} else if (response.startsWith("TIE")) {
T3.setText("You tied!");
break;
} else if (response.startsWith("MESSAGE")) {
T3.setText(response.substring(8));
}
painter.repaint();
}//End while(true)
out.println("QUIT");
}//End try
finally {
Sock.close();
}//End finally
}//End play()
class Painter extends JPanel implements MouseListener{
private static final long serialVersionUID = 1L;
public Painter() {
setFocusable(true);
requestFocus();
setBackground(Color.WHITE);
addMouseListener(this);
}//End Painter()
@Override
public void paint(Graphics g) {
super.paintComponent(g);
}//End paintComponent(Graphics g)
public void mousePressed(MouseEvent e) {
Clicked++;
out = new PrintWriter(Sock.getOutputStream(), true);
String temp = String.valueOf(mark);
out.write("Total Clicks: " + Clicked);
int xMouse = e.getX() / 160;
int yMouse = e.getY() / 160;
int i = 0;
if ((xMouse > 49) && (xMouse < 210) && (yMouse > 99) && (yMouse < 250)) {
i = 1;
Square[i] = temp;
out.write("MOVE" + i);
}
else if ((xMouse > 211) && (xMouse < 390) && (yMouse > 99) && (yMouse < 250)) {
i = 0;
Square[i] = temp;
out.write("MOVE" + i);
}
else if ((xMouse > 391) && (xMouse < 551) && (yMouse > 99) && (yMouse < 250)) {
i = 1;
Square[i] = temp;
out.write("MOVE" + i);
}
else if ((xMouse > 49) && (xMouse < 210) && (yMouse > 251) && (yMouse < 450)) {
i = 2;
Square[i] = temp;
out.write("MOVE" + i);
}
else if ((xMouse > 211) && (xMouse < 390) && (yMouse > 251) && (yMouse < 450)) {
i = 3;
Square[i] = temp;
out.write("MOVE" + i);
}
else if ((xMouse > 391) && (xMouse < 551) && (yMouse > 251) && (yMouse < 450)) {
i = 4;
Square[i] = temp;
out.write("MOVE" + i);
}
else if ((xMouse > 49) && (xMouse < 210) && (yMouse > 450) && (yMouse < 601)) {
i = 5;
Square[i] = temp;
out.write("MOVE" + i);
}
else if ((xMouse > 211) && (xMouse < 390) && (yMouse > 450) && (yMouse < 601)) {
i = 6;
Square[i] = temp;
out.write("MOVE" + i);
}
else if ((xMouse > 391) && (xMouse < 551) && (yMouse > 450) && (yMouse < 601)) {
i = 7;
Square[i] = temp;
out.write("MOVE" + i);
}
}//End mousePressed(MouseEvent e)
public void mouseClicked(MouseEvent e) {
//Not needed
}
public void mouseReleased(MouseEvent e) {
//Not needed
}
public void mouseEntered(MouseEvent e) {
//Not needed
}
public void mouseExited(MouseEvent e) {
//Not needed
}
}//End class Painter
private boolean wantsToPlayAgain() {
int response = JOptionPane.showConfirmDialog(frame,
"Want to play again?",
"Tic Tac Toe is Fun Fun Fun",
JOptionPane.YES_NO_OPTION);
frame.dispose();
return response == JOptionPane.YES_OPTION;
}
public void main(String[] args) throws Exception {
while (true) {
System.out.println("Please input the Server's IP Address: ");
Scanner scanner = new Scanner(System.in);
String ServerIP = scanner.nextLine();
System.out.println("Please input the Server's Port number: ");
int ServerPort = Integer.parseInt(scanner.nextLine());
TicTacToeClient client = new TicTacToeClient(ServerIP);
//Layout GUI
loadImages();
client.painter = new Painter();
client.painter.setPreferredSize(new Dimension(Width, Height));
client.frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
client.frame.setSize(700, 750);
client.frame.setVisible(true);
client.frame.setResizable(false);
client.play();
if (!client.wantsToPlayAgain()) {
break;
}
}
}
}//End class TicTacToeClient
它引用的代码部分是:
public void play() throws Exception {
int lengthOfSpace = 160;
String response;
Graphics g;
g.drawImage(field,60,40,null);
try {
response = in.readLine();
if (response.startsWith("Welcome")) {
char mark = response.charAt(49);
Image icon = (mark == 'X') ? blueX : redCircle;
Image opponentIcon = (mark == 'X') ? redX : blueCircle;
T3.setText(response);
}//End if(response.startsWith("Welcome"))
while (true) {
response = in.readLine();
if (response.startsWith("VALID_MOVE")) {
int i = 1 + Integer.parseInt(response.substring(11));
if (mark == 'X') {
g.drawImage(icon, (i % 3) * lengthOfSpace + 10 * (i % 3), (int) (i / 3) * lengthOfSpace + 10 * (int) (i / 3), null);
}
else if (mark == 'O') {
g.drawImage(opponentIcon, (i % 3) * lengthOfSpace + 10 * (i % 3), (int) (i / 3) * lengthOfSpace + 10 * (int) (i / 3), null);
T3.setText(response);
}
frame.repaint();
T3.setText("Opponent's Turn");
} else if (response.startsWith("OPPONENT_MOVED")) {
int i = Integer.parseInt(response.substring(15));
if (mark == 'X') {
g.drawImage(icon, (i % 3) * lengthOfSpace + 10 * (i % 3), (int) (i / 3) * lengthOfSpace + 10 * (int) (i / 3), null);
}
else if (mark == 'O') {
g.drawImage(opponentIcon, (i % 3) * lengthOfSpace + 10 * (i % 3), (int) (i / 3) * lengthOfSpace + 10 * (int) (i / 3), null);
T3.setText(response);
}
frame.repaint();
T3.setText("Your Turn");
} else if (response.startsWith("VICTORY")) {
T3.setText("You win!");
break;
} else if (response.startsWith("DEFEAT")) {
T3.setText("You lose!");
break;
} else if (response.startsWith("TIE")) {
T3.setText("You tied!");
break;
} else if (response.startsWith("MESSAGE")) {
T3.setText(response.substring(8));
}
painter.repaint();
}//End while(true)
out.println("QUIT");
}//End try
finally {
Sock.close();
}//End finally
}//End play()
答案 0 :(得分:0)
您在icon
语句中创建变量if
,因此此变量的范围仅在if
内。
您应该在if
方法之前的play()
方法之前创建它们。
错误消息也非常明显:TicTacToeClient.java:128: error: cannot find symbol ... variable icon
。有关更多信息和更好地理解,请阅读有关变量范围&#39;。