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);
});
}
}
Комментариев нет:
Отправить комментарий