Изучаю Джава, пока не понимаю кокой код "чистый", а какой... скажем так фиговый. Опытных кодеров прошу глянуть и подсказать что где подправить
enum ViewState {
START_STATE, GAME_STATE;
}
class MyWindow extends JFrame{
private static ViewState viewState;
private static JPanel mainPanelBottom;
private static JPanel mainPanelTop;
private static JPanel setting;
private static JPanel game;
private static JPanel settingField;
private static JFrame frame;
private static JPanel gameBackground;
private static JPanel gameField;
public MyWindow(){
frame = new JFrame();
mainPanelBottom = new JPanel(); //Панель кнопок
mainPanelTop = new JPanel(); //Панель стартовая и игры
setting = new BottomPanelSetting();
game = new BottomPanelGame();
settingField = new SettingField();
gameField = new GameField();
gameBackground = new GameBackground();
frame.setSize(600, 700);
frame.setLocationRelativeTo(null);
frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
frame.setTitle("крестики нолики");
mainPanelBottom.setLayout(new BorderLayout());
mainPanelTop.setLayout(new BorderLayout());
gameBackground.setPreferredSize(new Dimension(600,660));
settingField.setPreferredSize(new Dimension(600,660));
game.setPreferredSize(new Dimension(1,40));
setting.setPreferredSize(new Dimension(1,40));
settingField.setLayout(new BorderLayout());
JPanel top = new JPanel();
settingField.add(top, BorderLayout.NORTH);
top.setPreferredSize(new Dimension(1, 50));
top.setBackground(new Color(255, 127, 41));
JPanel neTop = new JPanel();
settingField.add(neTop, BorderLayout.SOUTH);
neTop.setPreferredSize(new Dimension(1,250));
neTop.setBackground(new Color(255, 127, 41));
JPanel center = new JPanel();
settingField.add(center, BorderLayout.CENTER);
center.setLayout(new BoxLayout(center, BoxLayout.Y_AXIS));
JPanel panelOne = new JPanel();
JPanel panelTwo = new JPanel();
panelOne.setBackground(Color.white);
panelTwo.setBackground(Color.white);
center.add(panelOne);
center.add(panelTwo);
JLabel settingOne = new JLabel("Жми играть");
settingOne.setFont(new Font("Serif", Font.PLAIN, 28));
panelOne.add(settingOne);
gameBackground.setLayout(new BorderLayout());
setting.setLayout(new GridLayout());
game.setLayout(new GridLayout());
gameBackground.setBackground(new Color(255, 246, 130));
gameBackground.add(gameField, BorderLayout.CENTER);
frame.getContentPane().add(BorderLayout.SOUTH, mainPanelBottom);
frame.getContentPane().add(BorderLayout.CENTER, mainPanelTop);
changeState(ViewState.START_STATE);
frame.setVisible(true);
}
public static void changeState(ViewState state) {
viewState = state;
System.out.println("change state: " + viewState);
switch (state) {
case START_STATE:
mainPanelBottom.removeAll();
mainPanelTop.removeAll();
mainPanelBottom.add(setting);
mainPanelTop.add(settingField);
mainPanelBottom.revalidate();
mainPanelTop.revalidate();
mainPanelBottom.repaint();
mainPanelTop.repaint();
break;
case GAME_STATE:
mainPanelBottom.removeAll();
mainPanelTop.removeAll();
mainPanelBottom.add(game);
mainPanelTop.add(gameBackground);
mainPanelBottom.revalidate();
mainPanelTop.revalidate();
mainPanelBottom.repaint();
mainPanelTop.repaint();
break;
default:
System.out.println("UNKNOWN STATE!");
break;
}
}
}
class Main {
public static void main(String[] args) {
MyWindow start = new MyWindow();
}
}
Класс с прорисовкой фигур
public class GameField extends JPanel {
private int width;
private int height;
private final int SIZE = 3;
private int cellWidth;
private int cellHeight;
private char [][] map;
private boolean moveX = true;
int clX;
int clY;
public GameField() {
setOpaque(false);
map = new char[SIZE][SIZE];
addMouseListener(new MouseAdapter() {
@Override
public void mouseReleased(MouseEvent e) {
clX = e.getX() / cellWidth;
clY = e.getY() / cellHeight;
System.out.println((clX + 1) + " " + (clY + 1));
if (map[clX][clY] == 0) { // only if empty cell
if (moveX) {
map[clX][clY] = 'x';
} else {
map[clX][clY] = 'o';
}
moveX = !moveX;
repaint();
}
if (isMapFull()){
System.out.println("ничья");
new Draw();
}
if (checkWin(map[clX][clY])){
System.out.println("кто-то выйграл");
new Win();
}
}
});
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2d = (Graphics2D)g;
g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
width = getWidth();
height = getHeight();
cellHeight = height/SIZE;
cellWidth = width/SIZE;
BufferedImage myPictureKrestic = null;
try {
myPictureKrestic = ImageIO.read(new File("pictures/krestic.png"));
} catch (IOException e) {
e.printStackTrace();
}
BufferedImage myPictureNolik = null;
try {
myPictureNolik = ImageIO.read(new File("pictures/nolik.png"));
} catch (IOException e) {
e.printStackTrace();
}
for (int i = 0; i < SIZE; i++) {
g2d.setColor(Color.black);
g2d.drawLine(0, i*cellHeight, width, i*cellHeight);
g2d.drawLine(i*cellWidth,0,i*cellWidth,height);
}
for (int i = 0; i < SIZE; i++) {
for (int j = 0; j < SIZE; j++) {
if ((map[i][j] == 'x')) {
g2d.drawImage(myPictureKrestic, i * cellWidth, j * cellHeight, cellWidth, cellHeight, null);
} else if ((map[i][j] == 'o')) {
g2d.drawImage(myPictureNolik, i * cellWidth, j * cellHeight, cellWidth, cellHeight, null);
}
}
}
}
public boolean isMapFull(){
for(int i=0; i < SIZE; i++){
for(int j=0;j <SIZE; j++){
if(map[i][j] == 0) return false;
}
}
return true;
}
public boolean checkWin (char symb) {
if(map[0][0] == symb && map[0][1] == symb && map[0][2] == symb) return true;
if(map[1][0] == symb && map[1][1] == symb && map[1][2] == symb) return true;
if(map[2][0] == symb && map[2][1] == symb && map[2][2] == symb) return true;
if(map[0][0] == symb && map[1][1] == symb && map[2][2] == symb) return true;
if(map[0][0] == symb && map[1][0] == symb && map[2][0] == symb) return true;
if(map[0][1] == symb && map[1][1] == symb && map[2][1] == symb) return true;
if(map[2][0] == symb && map[1][1] == symb && map[0][2] == symb) return true;
if(map[0][2] == symb && map[1][2] == symb && map[2][2] == symb) return true;
return false;
}
}
остальные классы типа:
BottomPanelSetting(); BottomPanelGame(); SettingField(); GameField(); GameBackground()
не стал добавлять, т.к. почти пустые, если кому-то интересно, полностью проект можно глянуть тут - https://github.com/Zherikhov/TicTacToe
Оборудование для ресторана: новинки профессиональной кухонной техники
Частный дом престарелых в Киеве: комфорт, забота и профессиональный уход
Оператор switch реализован таким образом, что после совпадения первого case, выполняются все остальные case, пока не встретится оператор передачи...
Есть TextView и при нажатии клавиши Enter курсор переходит на новую строку но в начало линии добавляется номер строки с точкой и пробеломИ все хорошо,...
Знаю, что в gradlebuild нужно внести запись, но у меня в проекте нет такого файла, т
Вывод на консоль в данном случае получается FileNotFoundExceptionКак именно осуществляется выбор нужного метода для вызова?