Форум программистов, компьютерный форум, киберфорум
Java: Сети
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
0 / 0 / 0
Регистрация: 18.09.2021
Сообщений: 52

Изменение логики хода дамки в шашках

15.04.2023, 12:13. Показов 1357. Ответов 1

Студворк — интернет-сервис помощи студентам
Нужна помощь в изменении логики хода Дамки, чтобы она могла ходить через всю диагональ и есть шашки противников.
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
package logic;
 
import java.awt.Point;
import java.util.ArrayList;
import java.util.List;
 
import model.Board;
import model.Game;
 
public class MoveLogic {
 
    // Проверяет, является ли ход допустимым
    public static boolean isValidMove(Game game,
                                      int startIndex, int endIndex) {
        return game == null ? false : isValidMove(game.getBoard(),
                game.isP1Turn(), startIndex, endIndex, game.getSkipIndex());
    }
 
    // Проверяет, является ли ход допустимым, если передается доска и не текущая игра
    public static boolean isValidMove(Board board, boolean isP1Turn,
                                      int startIndex, int endIndex, int skipIndex) {
 
        // Основные проверки
        if (board == null || !Board.isValidIndex(startIndex) ||
                !Board.isValidIndex(endIndex)) {
            return false;
        } else if (startIndex == endIndex) {
            return false;
        } else if (Board.isValidIndex(skipIndex) && skipIndex != startIndex) {
            return false;
        }
 
        // Выполнить тесты, чтобы проверить ход на валидность
        if (!validateIDs(board, isP1Turn, startIndex, endIndex)) {
            return false;
        } else if (!validateDistance(board, isP1Turn, startIndex, endIndex)) {
            return false;
        }
 
        // Прошли все проверки
        return true;
    }
 
    // Проверяет соответствие идентификаторов на доске во время хода
    private static boolean validateIDs(Board board, boolean isP1Turn,
                                       int startIndex, int endIndex) {
 
        // Проверяем, свободна ли ячейка, куда собираемся переместить шашку
        if (board.get(endIndex) != Board.EMPTY) {
            return false;
        }
 
        // Проверяем, правильный ли идентификатор шашки
        int id = board.get(startIndex);
        if ((isP1Turn && id != Board.BLACK_CHECKER && id != Board.BLACK_KING)
                || (!isP1Turn && id != Board.WHITE_CHECKER
                && id != Board.WHITE_KING)) {
            return false;
        }
 
        // Проверяем середину доски
        Point middle = Board.middle(startIndex, endIndex);
        int midID = board.get(Board.toIndex(middle));
        if (midID != Board.INVALID && ((!isP1Turn &&
                midID != Board.BLACK_CHECKER && midID != Board.BLACK_KING) ||
                (isP1Turn && midID != Board.WHITE_CHECKER &&
                        midID != Board.WHITE_KING))) {
            return false;
        }
 
        // Прошли все проверки
        return true;
    }
 
    // Проверяет корректность расстояния между шашками во время хода
    private static boolean validateDistance(Board board, boolean isP1Turn,
                                            int startIndex, int endIndex) {
 
        // Проверяем, был ли выполнен диагональный ход
        Point start = Board.toPoint(startIndex);
        Point end = Board.toPoint(endIndex);
        int dx = end.x - start.x;
        int dy = end.y - start.y;
        if (Math.abs(dx) != Math.abs(dy) || Math.abs(dx) > 2 || dx == 0) {
            return false;
        }
 
        // Проверяем, что ход был в правильном направлении
        int id = board.get(startIndex);
        if ((id == Board.WHITE_CHECKER && dy > 0) ||
                (id == Board.BLACK_CHECKER && dy < 0)) {
            return false;
        }
 
// Проверяем, что если это не прыжок, то такой возможности нет
        Point middle = Board.middle(startIndex, endIndex);
        int midID = board.get(Board.toIndex(middle));
        if (midID < 0) {
 
            // Получаем нужные шашки
            List<Point> checkers;
            if (isP1Turn) {
                checkers = board.find(Board.BLACK_CHECKER);
                checkers.addAll(board.find(Board.BLACK_KING));
            } else {
                checkers = board.find(Board.WHITE_CHECKER);
                checkers.addAll(board.find(Board.WHITE_KING));
            }
 
            // Проверяем, есть ли у них возможность прыжка
            for (Point p : checkers) {
                int index = Board.toIndex(p);
                if (!MoveGenerator.getSkips(board, index).isEmpty()) {
                    return false;
                }
            }
        }
 
// Прошли все проверки
        return true;
    }
 
    public static boolean isSafe(Board board, Point checker) {
 
        // Тривиальные случаи
        if (board == null || checker == null) {
            return true;
        }
        int index = Board.toIndex(checker);
        if (index < 0) {
            return true;
        }
        int id = board.get(index);
        if (id == Board.EMPTY) {
            return true;
        }
 
        // Определяем, может ли она быть прыгнута
        boolean isBlack = (id == Board.BLACK_CHECKER || id == Board.BLACK_KING);
        List<Point> check = new ArrayList<>();
        MoveGenerator.addPoints(check, checker, Board.BLACK_KING, 1);
        for (Point p : check) {
            int start = Board.toIndex(p);
            int tid = board.get(start);
 
            // Ничего здесь нет
            if (tid == Board.EMPTY || tid == Board.INVALID) {
                continue;
            }
 
            // Проверяем ID
            boolean isWhite = (tid == Board.WHITE_CHECKER ||
                    tid == Board.WHITE_KING);
            if (isBlack && !isWhite) {
                continue;
            }
            boolean isKing = (tid == Board.BLACK_KING || tid == Board.BLACK_KING);
 
            // Определяем, валидно ли направление прыжка
            int dx = (checker.x - p.x) * 2;
            int dy = (checker.y - p.y) * 2;
            if (!isKing && (isWhite ^ (dy < 0))) {
                continue;
            }
            int endIndex = Board.toIndex(new Point(p.x + dx, p.y + dy));
            if (MoveGenerator.isValidSkip(board, start, endIndex)) {
                return false;
            }
        }
 
        return true;
    }
}
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
package logic;
 
import java.awt.Point;
import java.util.ArrayList;
import java.util.List;
 
import model.Board;
 
public class MoveGenerator {
 
    // Возвращает список возможных ходов из данной точки на доске
    public static List<Point> getMoves(Board board, Point start) {
        return getMoves(board, Board.toIndex(start));
    }
 
    // Возвращает список возможных ходов из данного индекса на доске
    public static List<Point> getMoves(Board board, int startIndex) {
 
        // Тривиальные случаи
        List<Point> endPoints = new ArrayList<>();
        if (board == null || !Board.isValidIndex(startIndex)) {
            return endPoints;
        }
 
        // Определяем возможные точки
        int id = board.get(startIndex);
        Point p = Board.toPoint(startIndex);
        addPoints(endPoints, p, id, 1);
 
        // Удаляем невалидные точки
        for (int i = 0; i < endPoints.size(); i ++) {
            Point end = endPoints.get(i);
            if (board.get(end.x, end.y) != Board.EMPTY) {
                endPoints.remove(i --);
            }
        }
 
        return endPoints;
    }
 
 
    // Возвращает список возможных прыжков из данной точки на доске
    public static List<Point> getSkips(Board board, Point start) {
        return getSkips(board, Board.toIndex(start));
    }
 
    // Возвращает список возможных прыжков из данного индекса на доске
    public static List<Point> getSkips(Board board, int startIndex) {
 
        // Тривиальные случаи
        List<Point> endPoints = new ArrayList<>();
        if (board == null || !Board.isValidIndex(startIndex)) {
            return endPoints;
        }
 
        // Определяем возможные точки
        int id = board.get(startIndex);
        Point p = Board.toPoint(startIndex);
        addPoints(endPoints, p, id, 2);
 
        // Удаляем невалидные точки
        for (int i = 0; i < endPoints.size(); i ++) {
 
            // Проверяем, что прыжок валидный
            Point end = endPoints.get(i);
            if (!isValidSkip(board, startIndex, Board.toIndex(end))) {
                endPoints.remove(i --);
            }
        }
 
        return endPoints;
    }
 
 
    // Проверяет, что данный прыжок на доске валиден
    public static boolean isValidSkip(Board board, int startIndex, int endIndex) {
 
        if (board == null) {
            return false;
        }
 
        // Проверяем, что конечная точка пустая
        if (board.get(endIndex) != Board.EMPTY) {
            return false;
        }
 
        // Проверяем, что середина прыжка занята противником
        int id = board.get(startIndex);
        int midID = board.get(Board.toIndex(Board.middle(startIndex, endIndex)));
        if (id == Board.INVALID || id == Board.EMPTY) {
            return false;
        } else if (midID == Board.INVALID || midID == Board.EMPTY) {
            return false;
        } else if ((midID == Board.BLACK_CHECKER || midID == Board.BLACK_KING)
                ^ (id == Board.WHITE_CHECKER || id == Board.WHITE_KING)) {
            return false;
        }
        
        return true;
    }
    
 
    public static void addPoints(List<Point> points, Point p, int id, int delta) {
        
        // Add points moving down
        boolean isKing = (id == Board.BLACK_KING || id == Board.WHITE_KING);
        if (isKing || id == Board.BLACK_CHECKER) {
            points.add(new Point(p.x + delta, p.y + delta));
            points.add(new Point(p.x - delta, p.y + delta));
        }
        
        // Add points moving up
        if (isKing || id == Board.WHITE_CHECKER) {
            points.add(new Point(p.x + delta, p.y - delta));
            points.add(new Point(p.x - delta, p.y - delta));
        }
    }
}
Вложения
Тип файла: zip Java-Checkers-master.zip (76.7 Кб, 0 просмотров)
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
15.04.2023, 12:13
Ответы с готовыми решениями:

Переход хода в китайских шашках
Как сделать, чтобы была активна только одна из 6 групп шашек, пока игрок не сделает ход, после ход передается след. игроку, т.е. след....

Алгоритм определения правильности хода в "Шашках"
Здравствуйте, уважаемые программисты! Пишу игру &quot;Шашки&quot; на PHP, для хранение игровой доски использую одномерный массив размером 64. В нём:...

Изменение хода программы при нажатии символа
Добрый день! Научите как запрограммировать на Паскале: Например, печатается какой-то символ бесконечно. Нажимается другой символ и...

1
0 / 0 / 0
Регистрация: 18.09.2021
Сообщений: 52
16.04.2023, 23:31  [ТС]
Вот изменил, теперь дамка может ходить по всей диагонали, но почему-то не ест вражеские шашки

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
package logic;
 
import java.awt.Point;
import java.util.ArrayList;
import java.util.List;
 
import model.Board;
import model.Game;
 
public class MoveLogic {
 
    // Проверяет, является ли ход допустимым
    public static boolean isValidMove(Game game,
                                      int startIndex, int endIndex) {
        return game == null ? false : isValidMove(game.getBoard(),
                game.isP1Turn(), startIndex, endIndex, game.getSkipIndex());
    }
 
    // Проверяет, является ли ход допустимым, если передается доска и информация о текущем игроке
    public static boolean isValidMove(Board board, boolean isP1Turn,
                                      int startIndex, int endIndex, int skipIndex) {
 
        // Основные проверки
        if (board == null || !Board.isValidIndex(startIndex) ||
                !Board.isValidIndex(endIndex)) {
            return false;
        } else if (startIndex == endIndex) {
            return false;
        } else if (Board.isValidIndex(skipIndex) && skipIndex != startIndex) {
            return false;
        }
 
        // Выполнить тесты, чтобы проверить ход на валидность
        if (!validateIDs(board, isP1Turn, startIndex, endIndex)) {
            return false;
        } else if (!validateDistance(board, isP1Turn, startIndex, endIndex)) {
            return false;
        }
 
        
        return true;
    }
 
    // Проверяет соответствие идентификаторов на доске для заданных индексов и цвета игрока
    private static boolean validateIDs(Board board, boolean isP1Turn,
                                       int startIndex, int endIndex) {
 
        
        if (board.get(endIndex) != Board.EMPTY) {
            return false;
        }
 
        
        int id = board.get(startIndex);
        if ((isP1Turn && id != Board.BLACK_CHECKER && id != Board.BLACK_KING)
                || (!isP1Turn && id != Board.WHITE_CHECKER
                && id != Board.WHITE_KING)) {
            return false;
        }
 
        
        Point middle = Board.middle(startIndex, endIndex);
        int midID = board.get(Board.toIndex(middle));
        if (midID != Board.INVALID && ((!isP1Turn &&
                midID != Board.BLACK_CHECKER && midID != Board.BLACK_KING) ||
                (isP1Turn && midID != Board.WHITE_CHECKER &&
                        midID != Board.WHITE_KING))) {
            return false;
        }
        return true;
    }
    private static boolean validateDistance(Board board, boolean isP1Turn, 
           int startIndex, int endIndex) { 
  Point start = Board.toPoint(startIndex); 
  Point end = Board.toPoint(endIndex); 
  int dx = end.x - start.x; 
  int dy = end.y - start.y; 
  int id = board.get(startIndex); // получаем id шашки
  if (id == Board.WHITE_KING || id == Board.BLACK_KING) { // проверяем, является ли шашка дамкой
    if (Math.abs(dx) != Math.abs(dy)) { // если это дамка, то она может ходить по всей диагонали
      return false;
    }
  } else { // если это обычная шашка, то проверяем условия как раньше
    if (Math.abs(dx) != Math.abs(dy) || Math.abs(dx) > 2 || dx == 0) { 
      return false; 
    }
    if ((id == Board.WHITE_CHECKER && dy > 0) || 
      (id == Board.BLACK_CHECKER && dy < 0)) { 
      return false; 
    } 
    Point middle = Board.middle(startIndex, endIndex); 
    int midID = board.get(Board.toIndex(middle)); 
    if (midID < 0) { 
      List<Point> checkers; 
      if (isP1Turn) { 
        checkers = board.find(Board.BLACK_CHECKER);   
        checkers.addAll(board.find(Board.BLACK_KING)); 
      } else { 
        checkers = board.find(Board.WHITE_CHECKER);  
        checkers.addAll(board.find(Board.WHITE_KING)); 
      } 
      for (Point p : checkers) { 
        int index = Board.toIndex(p); 
        if (!MoveGenerator.getSkips(board, index).isEmpty()) { 
          return false; 
        } 
      } 
    }
  }
  return true; 
}   public static boolean isSafe(Board board, Point checker) {
 
        
        if (board == null || checker == null) {
            return true;
        }
        int index = Board.toIndex(checker);
        if (index < 0) {
            return true;
        }
        int id = board.get(index);
        if (id == Board.EMPTY) {
            return true;
        }
 
        
        boolean isBlack = (id == Board.BLACK_CHECKER || id == Board.BLACK_KING);
        List<Point> check = new ArrayList<>();
        MoveGenerator.addPoints(check, checker, Board.BLACK_KING, 1);
        for (Point p : check) {
            int start = Board.toIndex(p);
            int tid = board.get(start);
 
            
            if (tid == Board.EMPTY || tid == Board.INVALID) {
                continue;
            }
 
            
            boolean isWhite = (tid == Board.WHITE_CHECKER ||
                    tid == Board.WHITE_KING);
            if (isBlack && !isWhite) {
                continue;
            }
            boolean isKing = (tid == Board.BLACK_KING || tid == Board.BLACK_KING);
 
            
            int dx = (checker.x - p.x) * 2;
            int dy = (checker.y - p.y) * 2;
            if (!isKing && (isWhite ^ (dy < 0))) {
                continue;
            }
            int endIndex = Board.toIndex(new Point(p.x + dx, p.y + dy));
            if (MoveGenerator.isValidSkip(board, start, endIndex)) {
                return false;
            }
        }
 
        return true;
    }
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
16.04.2023, 23:31
Помогаю со студенческими работами здесь

изменение логики
помогите изменить логику базы данных в соответствие со следующим описанием: пользователь без ролей не должен видеть ни одного действия по...

Принципиальное изменение логики приложения
Всем привет. Никогда ранее не приходилось принципиально менять логику своего приложения. Пару лет назад писал CAD-систему, заточенную...

Sticky sidebar — изменение логики
Имеется скрипт http://www.profilepicture.co.uk/demos/stickybox/ Работает он следующим образом: имеется боковая колонка и когда сайдбар...

Изменение логики построения песни
Что-то я не пойму. Обычно я привык так: Куплет 1 Припев Куплет 2 Припев ну и так далее. Сейчас мне приходится наблюдать...

Обнулить клетку начала хода, и перезаписать шашку в клетку конца хода.
Добрый день! Казалось бы простая функция записи массива (позиции) расстановки шашек. Есть функция Запись позиции, она вызывается в скрипте...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru