понедельник, 29 июня 2026 г.

Уголки на жава

 import javax.swing.*;

import java.awt.*;

import java.awt.event.MouseAdapter;

import java.awt.event.MouseEvent;


public class CornersGame extends JFrame {

    private static final int BOARD_SIZE = 8;

    private static final int CELL_SIZE = 80;

    

    // Состояния ячеек: 0 - пусто, 1 - белые, 2 - черные

    private int[][] board = new int[BOARD_SIZE][BOARD_SIZE];

    

    private boolean whiteTurn = true; // Ход белых

    private Point selectedPiece = null; // Выбранная шашка


    public CornersGame() {

        setTitle("Игра Уголки (На двоих)");

        setSize(BOARD_SIZE * CELL_SIZE, BOARD_SIZE * CELL_SIZE + 40);

        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        setResizable(false);

        setLocationRelativeTo(null);


        initBoard();


        // Панель для отрисовки графики и обработки кликов мышкой

        JPanel boardPanel = new JPanel() {

            @Override

            protected void paintComponent(Graphics g) {

                super.paintComponent(g);

                drawBoard(g);

            }

        };


        boardPanel.addMouseListener(new MouseAdapter() {

            @Override

            public void mousePressed(MouseEvent e) {

                handleMouseClick(e.getX() / CELL_SIZE, e.getY() / CELL_SIZE);

                boardPanel.repaint();

            }

        });


        add(boardPanel);

    }


    // Расстановка шашек в стартовые «уголки» 3х3

    private void initBoard() {

        // Черные в левом верхнем углу

        for (int r = 0; r < 3; r++) {

            for (int c = 0; c < 3; c++) {

                board[r][c] = 2; 

            }

        }

        // Белые в правом нижнем углу

        for (int r = 5; r < 8; r++) {

            for (int c = 5; c < 8; c++) {

                board[r][c] = 1;

            }

        }

    }


    // Отрисовка графического интерфейса

    private void drawBoard(Graphics g) {

        Graphics2D g2 = (Graphics2D) g;

        g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);


        for (int row = 0; row < BOARD_SIZE; row++) {

            for (int col = 0; col < BOARD_SIZE; col++) {

                // Рисуем клетки шахматной доски

                g2.setColor((row + col) % 2 == 0 ? new Color(240, 217, 181) : new Color(181, 136, 99));

                g2.fillRect(col * CELL_SIZE, row * CELL_SIZE, CELL_SIZE, CELL_SIZE);


                // Подсветка выбранной шашки

                if (selectedPiece != null && selectedPiece.x == col && selectedPiece.y == row) {

                    g2.setColor(new Color(0, 255, 0, 100));

                    g2.fillRect(col * CELL_SIZE, row * CELL_SIZE, CELL_SIZE, CELL_SIZE);

                }


                // Рисуем шашки

                int piece = board[row][col];

                if (piece != 0) {

                    g2.setColor(piece == 1 ? Color.WHITE : Color.BLACK);

                    g2.fillOval(col * CELL_SIZE + 10, row * CELL_SIZE + 10, CELL_SIZE - 20, CELL_SIZE - 20);

                    // Обводка для красоты

                    g2.setColor(Color.DARK_GRAY);

                    g2.drawOval(col * CELL_SIZE + 10, row * CELL_SIZE + 10, CELL_SIZE - 20, CELL_SIZE - 20);

                }

            }

        }

    }


    // Логика кликов и ходов

    private void handleMouseClick(int col, int row) {

        if (col < 0 || col >= BOARD_SIZE || row < 0 || row >= BOARD_SIZE) return;


        int currentTurnPiece = whiteTurn ? 1 : 2;


        // Если кликнули на свою шашку — выбираем её

        if (board[row][col] == currentTurnPiece) {

            selectedPiece = new Point(col, row);

        } 

        // Если шашка выбрана и кликнули на пустую клетку — пытаемся походить

        else if (selectedPiece != null && board[row][col] == 0) {

            if (isValidMove(selectedPiece.x, selectedPiece.y, col, row)) {

                board[row][col] = currentTurnPiece;

                board[selectedPiece.y][selectedPiece.x] = 0;

                selectedPiece = null;

                whiteTurn = !whiteTurn; // Передаем ход

                checkWin();

            }

        }

    }


    // Проверка правил хода (в соседнюю клетку или прыжок через одну шашку)

    private boolean isValidMove(int fromX, int fromY, int toX, int toY) {

        int dx = Math.abs(toX - fromX);

        int dy = Math.abs(toY - fromY);


        // Ход на соседнюю клетку (по горизонтали или вертикали)

        if ((dx == 1 && dy == 0) || (dx == 0 && dy == 1)) {

            return true;

        }


        // Прыжок через одну шашку

        if ((dx == 2 && dy == 0) || (dx == 0 && dy == 2)) {

            int midX = (fromX + toX) / 2;

            int midY = (fromY + toY) / 2;

            // Прыгать можно только если между клетками есть любая шашка

            return board[midY][midX] != 0;

        }


        return false;

    }


    // Простая проверка условий победы (кто первый занял чужой дом)

    private void checkWin() {

        boolean whiteWin = true;

        for (int r = 0; r < 3; r++) {

            for (int c = 0; c < 3; c++) {

                if (board[r][c] != 1) { whiteWin = false; break; }

            }

        }


        boolean blackWin = true;

        for (int r = 5; r < 8; r++) {

            for (int c = 5; c < 8; c++) {

                if (board[r][c] != 2) { blackWin = false; break; }

            }

        }


        if (whiteWin) {

            JOptionPane.showMessageDialog(this, "Белые победили! Они заняли угол черных.");

            initBoard();

        } else if (blackWin) {

            JOptionPane.showMessageDialog(this, "Черные победили! Они заняли угол белых.");

            initBoard();

        }

    }


    public static void main(String[] args) {

        SwingUtilities.invokeLater(() -> {

            CornersGame game = new CornersGame();

            game.setVisible(true);

        });

    }

}


Комментариев нет:

Отправить комментарий