Форум программистов, компьютерный форум, киберфорум
Java SE (J2SE)
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.86/7: Рейтинг темы: голосов - 7, средняя оценка - 4.86
1 / 1 / 2
Регистрация: 19.06.2016
Сообщений: 36

NPE в консольных шашках

16.01.2017, 22:04. Показов 1697. Ответов 15
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Недели три назад я начал писать консольные шашки. Это моя первая какая-никакая толковая работа на Jav'е, стандартные задачки по программированию не в счет. В первый же день я пришел сюда, на форум, получил неплохую помощь в дурацких ошибках и далее начал пытаться сам.
Итог: я не очень многому, но научился, а в плане шашек у меня работает практически всё. Все фигуры могут ходить, шашки превращаются в дамки, правила соблюдаются. Я вышел на финальную стадию - мне осталось добавить только проверку, ест ли игрок при возможности, и может ли он вообще ходить (для конца игры). Застрял я там, где не ожидал:
Java
1
if( /* существует ли вообще ход, при котором съедают */ && ! /*съедают ли при ходе, который пытаются сделать*/ )  /* кинуть исключение */
Метод, который проверяет
Java
1
 /*съедают ли при ходе, который пытаются сделать*/
используется раньше (при проверке на то, что если шашка/дамка ходит на несколько клеток сразу, то каждый раз она что-нибудь съедает). NPE как раз вылезает на строке с вызовом это метода.
Я перелопатил код несколько раз, кучу сайтов, static не static, все ломал, делал обратно - ну вообще не врубаюсь, где косяк.
121 строка класса Controller.
Заранее спасибо всем, кто хотя бы прочитал это

Main

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
package controllers;
 
import java.util.Scanner;
import board.Board;
 
public class Main {
 
    static Scanner sc = new Scanner(System.in);
 
    static boolean isGameOver = false;
 
    static boolean isWhitesTurn = true;
 
    public static void swapTurn() {
        isWhitesTurn = !isWhitesTurn;
    }
 
    public static void main(String[] args) {
 
        @SuppressWarnings("unused")
        Board b = new Board();
 
        Controller.prepareBoard();
 
        View.drawBoard();
 
        while (!isGameOver) {
 
            Controller.waitForValidMove();
            View.drawBoard();
            swapTurn();
            
            // NEED TO DEAL WITH NPE FIRST
 
            // if (isWhitesTurn ? !Controller.checkWhiteMovingPossibility() :
            // !Controller.checkBlackMovingPossibility()) {
            // isGameOver = true;
            // }
 
        }
 
        System.out.println("Game over!\n" + "Winner is " + (isWhitesTurn ? "White" : "Black") + "!");
 
    }
 
}
Controller

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
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
package controllers;
 
import board.Board;
import board.Coordinates;
import board.TmpBoard;
import cells.Cell;
import pieces.Checker;
import pieces.King;
import pieces.Piece;
 
public class Controller {
 
    public static boolean hasEaten;
 
    public static void prepareBoard() {
        int[] columns026 = { 0, 2, 4, 6 };
        int[] columns157 = { 1, 3, 5, 7 };
 
        int[] rows = { 0, 1, 2, 5, 6, 7 };
 
        for (int i : rows) {
            if (i % 2 == 0) {
                for (int j : columns026) {
                    if (i == 0 || i == 1 || i == 2) {
                        Board.cells[i][j].piece = new Checker(new Coordinates(i, j), true);
                    } else {
                        Board.cells[i][j].piece = new Checker(new Coordinates(i, j), false);
                    }
                }
            } else {
                for (int j : columns157) {
                    if (i == 0 || i == 1 || i == 2) {
                        Board.cells[i][j].piece = new Checker(new Coordinates(i, j), true);
                    } else {
                        Board.cells[i][j].piece = new Checker(new Coordinates(i, j), false);
                    }
                }
            }
        }
    }
 
    public static void turnCheckersIntoKings() {
        for (int i = 0; i < 7; i++) {
            if (Board.cells[0][i].piece == null) {
                continue;
            }
            if (Board.cells[0][i].piece.getClass().getSimpleName().equals("Checker")
                    && !Board.cells[0][i].piece.isWhite) {
                Board.cells[0][i].piece.turnIntoKing();
            }
 
        }
        for (int i = 0; i < 8; i++) {
            if (Board.cells[7][i].piece == null) {
                continue;
            }
            if (Board.cells[7][i].piece.getClass().getSimpleName().equals("Checker")
                    && Board.cells[7][i].piece.isWhite) {
                Board.cells[7][i].piece.turnIntoKing();
            }
        }
    }
 
    public static void waitForValidMove() {
        // waits for a move, checks it's validity and does it if everything is
        // right
 
        String s = Main.sc.next();
 
        boolean noErrors = false;
        hasEaten = false;
 
        // matching command
 
        if (s.matches("[abcdefgh][12345678](-[abcdefgh][12345678])+")) {
            char[] arr = s.toCharArray();
 
            TmpBoard tmpb = new TmpBoard();
 
            // it is almost impossible to make right checking without such
            // copying as we need to check each move, but without moving piece
            // we can't invoke needed methods
 
            copyTo(tmpb);
 
            int movesAmount = (arr.length - 2) / 3;
            try {
                for (int i = 0; i < movesAmount; i++) {
 
                    // based on char number
 
                    int sourceCol = (int) arr[i * 3] - 97;
                    int sourceRow = (int) arr[i * 3 + 1] - 48 - 1;
 
                    if (Board.cells[sourceRow][sourceCol].piece == null) {
                        throw new IllegalArgumentException("Invalid move: no piece to move!");
                    }
 
                    // checking turn consequence
 
                    if (Main.isWhitesTurn != Board.cells[sourceRow][sourceCol].piece.isWhite) {
                        throw new IllegalArgumentException("Invalid move: it is "
                                + (Main.isWhitesTurn == true ? "White's " : "Black's ") + "move!");
                    }
 
                    int targetCol = (int) arr[i * 3 + 3] - 97;
                    int targetRow = (int) arr[i * 3 + 4] - 48 - 1;
 
                    // to avoid NPE
                    Board.cells[sourceRow][sourceCol].piece.preliminaryValidityCheck(Board.cells[targetRow][targetCol]);
 
                    if (movesAmount > 1 && !Board.cells[sourceRow][sourceCol].piece
                            .doesMoveNeedEating(Board.cells[targetRow][targetCol])) {
                        throw new IllegalArgumentException("Invalid move: only eating is possible in a row!");
                    }
 
                    // checking if eating is possible
                    
                    if ((Main.isWhitesTurn ? checkIfWhiteCanEat() : checkIfBlackCanEat())
                            && !(Board.cells[sourceRow][sourceCol].piece
                                    .doesMoveNeedEating(Board.cells[targetRow][targetCol]))) {      // NPE is here
                        throw new IllegalArgumentException("Invalid move: you must eat!");
                    }
                    
                    if(Main.isWhitesTurn ? checkIfWhiteCanEat() : checkIfBlackCanEat()){
                        Piece currentPiece = Board.cells[sourceRow][sourceCol].piece;
                        Cell targetCell = Board.cells[targetRow][targetCol];
                        if(currentPiece.doesMoveNeedEating(targetCell)){
                            // okay
                        }else{
                            throw new IllegalArgumentException("Invalid move: you must eat!");
                        }
                    }
 
                    // actually moving
                    Board.cells[sourceRow][sourceCol].piece.move(Board.cells[targetRow][targetCol]);
 
                    turnCheckersIntoKings();
 
                    noErrors = true;
                }
            } catch (IllegalArgumentException e) {
 
                copyFrom(tmpb);
 
                System.err.print(e.getMessage());
                System.out.println("\nMake your move again.\n");
                waitForValidMove();
                turnCheckersIntoKings();
                noErrors = true;
 
            }
 
        }
 
        if (s.matches("DRAWBOARD") || s.matches("drawboard")) {
            View.drawBoard();
            noErrors = true;
            waitForValidMove();
        }
        // beginning of admin commands
 
        if (s.matches("@@@NEWCHECKER[abcdefgh][12345678][WB]")) {
            char[] arr = s.toCharArray();
            int col = (int) arr[13] - 97;
            int row = (int) arr[14] - 48 - 1;
            boolean isWhite = (arr[15] == 'W' ? true : false);
 
            Board.cells[row][col].piece = new Checker(new Coordinates(row, col), isWhite);
            System.err.println("// created a new checker //");
            noErrors = true;
        }
 
        if (s.matches("@@@SWAPTURN")) {
            Main.isWhitesTurn = !Main.isWhitesTurn;
            System.err.println(
                    "// swapped  turn -  now it is " + (Main.isWhitesTurn ? "White's " : "Black's ") + "turn //");
            noErrors = true;
        }
 
        if (s.matches("@@@NEWKING[abcdefgh][12345678][WB]")) {
            char[] arr = s.toCharArray();
            int col = (int) arr[10] - 97;
            int row = (int) arr[11] - 48 - 1;
            boolean isWhite = (arr[12] == 'W' ? true : false);
 
            Board.cells[row][col].piece = null;
            Board.cells[row][col].piece = new King(new Coordinates(row, col), isWhite);
            System.err.println("// created a new king //");
            noErrors = true;
        }
 
        if (s.matches("@@@NEWCHECKERARRAY([abcdefgh][12345678][WB])+")) {
            // не влезает в 15000 символов
 
        }
 
        if (s.matches("@@@MOVE[abcdefgh][12345678]TO[abcdefgh][12345678]")) {
            // не влезает в 15000 символов
 
        }
 
        if (s.matches("@@@PREPAREBOARD")) {
            prepareBoard();
        }
 
        if (s.matches("@@@CLEAR[abcdefgh][12345678]")) {
            // не влезает в 15000 символов
        }
 
        if (s.matches("@@@CLEARBOARD")) {
            for (int i = 0; i < 8; i++) {
                for (int j = 0; j < 8; j++) {
                    Board.cells[i][j].piece = null;
                }
            }
            System.err.println("// cleared the board //");
            noErrors = true;
        }
 
        if (s.matches("@@@GAMEOVER")) {
            Main.isGameOver = true;
            noErrors = true;
        }
 
        if (s.matches("@@@STOP")) {
            System.err.println("// terminated //");
            System.exit(0);
        }
 
        // end of admin commands
 
        if (!noErrors) {
            throw new IllegalArgumentException("Invalid move: wrong command!");
        }
 
    }
 
    public static void copyTo(TmpBoard tmpb) {
        for (int i = 0; i < 8; i++) {
            for (int j = 0; j < 8; j++) {
                tmpb.cells[i][j] = Board.cells[i][j];
            }
        }
    }
 
    public static void copyFrom(TmpBoard tmpb) {
        for (int i = 0; i < 8; i++) {
            for (int j = 0; j < 8; j++) {
                Board.cells[i][j] = tmpb.cells[i][j];
            }
        }
    }
 
    public static boolean checkIfWhiteCanMove() {
        // не влезает в 15000 символов
    }
 
    public static boolean checkIfBlackCanMove() {
        // не влезает в 15000 символов
    }
 
    public static boolean checkIfWhiteCanEat() {
        for (int i = 0; i < 8; i++) {
            for (int j = 0; j < 8; j++) {
                if (Board.cells[i][j].piece == null || !Board.cells[i][j].piece.isWhite) {
                    continue;
                }
                if (Board.cells[i][j].piece.canEat()) {
                    return true;
                }
            }
        }
        return false;
    }
 
    public static boolean checkIfBlackCanEat() {
        for (int i = 0; i < 8; i++) {
            for (int j = 0; j < 8; j++) {
                if (Board.cells[i][j].piece == null || Board.cells[i][j].piece.isWhite) {
                    continue;
                }
                if (Board.cells[i][j].piece.canEat()) {
                    return true;
                }
            }
        }
        return false;
    }
 
}
Piece

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
package pieces;
 
import board.Coordinates;
import board.TmpBoard;
import board.Board;
import cells.Cell;
import controllers.Controller;
 
public class Piece {
 
    Coordinates coordinates;
    public final boolean isWhite;
 
    public Piece(Coordinates coordinates, boolean isWhite) {
        this.coordinates = coordinates;
        this.isWhite = isWhite;
    }
 
    public Coordinates getCoordinates() {
        return this.coordinates;
    }
 
    public void move(Cell target) {
    };
 
    public void actualMove(Cell target) {
        Board.cells[this.coordinates.getRow()][this.coordinates.getCol()].piece = null;
        this.coordinates = target.getCoordinates();
        Board.cells[target.getCoordinates().getRow()][target.getCoordinates().getCol()].piece = this;
    }
 
    public void makeMove(Cell toGo, Cell toEat) {
 
        if (Board.cells[toEat.getCoordinates().getRow()][toEat.getCoordinates().getCol()].piece == null) {
            throw new IllegalArgumentException("Invalid move: no piece(s) to eat!");
        }
        if (Board.cells[toEat.getCoordinates().getRow()][toEat.getCoordinates()
                .getCol()].piece.isWhite == this.isWhite) {
            throw new IllegalArgumentException("Invalid move: cannot eat self-colour piece!");
        }
 
        Board.cells[toEat.getCoordinates().getRow()][toEat.getCoordinates().getCol()].piece = null;
 
        this.actualMove(toGo);
 
    }
 
    public void makeMove(Cell toGo) {
        this.actualMove(toGo);
    }
 
    public void preliminaryValidityCheck(Cell target) {
 
        Cell source = new Cell(this.coordinates);
        
        // see exception messages as comments
        
        int deltaCol = source.getCoordinates().getCol() - target.getCoordinates().getCol();
        int deltaRow = source.getCoordinates().getRow() - target.getCoordinates().getRow();
 
        if (Math.abs(deltaRow) != Math.abs(deltaCol)) {
            throw new IllegalArgumentException("Invalid move: not diagonal move!");
        }
 
        if (deltaRow == 0) {
            throw new IllegalArgumentException("Invalid move: ...what did you mean?");
        }
 
        if (target.getPiece() != null) {
            throw new IllegalArgumentException("Invalid move: target cell is occupied!");
        }
 
    }
 
    public boolean doesMoveNeedEating(Cell target) {
        int deltaRow = this.getCoordinates().getRow() - target.getCoordinates().getRow();
        int deltaCol = this.getCoordinates().getCol() - target.getCoordinates().getCol();
 
        for (int i = 0; i < Math.abs(deltaRow) - 1; i++) {
            Cell tmp = Board.cells[this.getCoordinates().getRow() - (deltaRow > 0 ? i : -i)][this.getCoordinates()
                    .getCol() - (deltaCol > 0 ? i : -i)];
 
            if (tmp.piece == null) {
                continue;
            }
            return true;
        }
        return false;
    }
 
    public void turnIntoKing() {
        Board.cells[this.coordinates.getRow()][this.coordinates.getCol()].piece = new King(
                new Coordinates(this.coordinates.getRow(), this.coordinates.getCol()), this.isWhite);
    }
 
    public boolean checkMoveValidity(Cell target) {
        return false;
    }
 
    public boolean canMove() {
        // не влезает в 15000 символов
    }
 
    public boolean canEat() {
        // не влезает в 15000 символов
    }
 
}
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
16.01.2017, 22:04
Ответы с готовыми решениями:

Ошибка в шашках
Здравствуйте. Скачал исходник шашек и обнаружил в нем ошибку: после рубки какой-либо шашки, можно сделать еще один ход той шашкой, которая...

Задача о шашках
Здравствуйте! &quot;Сколькими способами можно расположить 20 белых шашек на крайних линиях шахматной доски так, чтобы на противоположных...

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

15
Эксперт Java
3639 / 2971 / 918
Регистрация: 05.07.2013
Сообщений: 14,220
17.01.2017, 10:26
Самое время научиться пользоваться дебаггером
0
1 / 1 / 2
Регистрация: 19.06.2016
Сообщений: 36
17.01.2017, 15:58  [ТС]
xoraxax, а типа я не пробовал
Все переменные не null, это я без дебага знаю, а дебаг больше в этом случае не дает
0
Эксперт Java
3639 / 2971 / 918
Регистрация: 05.07.2013
Сообщений: 14,220
17.01.2017, 17:06
Цитата Сообщение от DL33_1 Посмотреть сообщение
Все переменные не null, это я без дебага знаю
если ловишь npe, значит, очевидно, одна из них null. Так что дебаггер в зубы и вперде.

Добавлено через 3 минуты
и кстати в java не принято публичные поля делать
0
1 / 1 / 2
Регистрация: 19.06.2016
Сообщений: 36
17.01.2017, 17:27  [ТС]
xoraxax,
Цитата Сообщение от xoraxax Посмотреть сообщение
очевидно, одна из них null
Это 95-97 строчки
Java
1
2
3
if (Board.cells[sourceRow][sourceCol].piece == null) {
    throw new IllegalArgumentException("Invalid move: no piece to move!");
}
Все остальное к данной ошибке не относится, поскольку если бы я передавал в метод null, ошибка бы вылезала в том классе, в котором и есть этот метод.

Цитата Сообщение от xoraxax Посмотреть сообщение
и кстати в java не принято публичные поля делать
Это я знаю, но не заморачивался совсем, поскольку все время что-нибудь менял. Когда все заработает, может, и уберу лишнее
0
2884 / 2296 / 769
Регистрация: 12.05.2014
Сообщений: 7,978
17.01.2017, 17:53
я бы начал с того, что разбил бы этот ужас на хотя бы три читаемые строки
Java
1
2
3
4
5
if ((Main.isWhitesTurn ? checkIfWhiteCanEat() : checkIfBlackCanEat())
                            && !(Board.cells[sourceRow][sourceCol].piece
                                    .doesMoveNeedEating(Board.cells[targetRow][targetCol]))) {      // NPE is here
                        throw new IllegalArgumentException("Invalid move: you must eat!");
                    }
тогда, как минимум, можно было бы точнее увидеть какой кусок кидает NPE
0
Эксперт Java
3639 / 2971 / 918
Регистрация: 05.07.2013
Сообщений: 14,220
17.01.2017, 17:58
Цитата Сообщение от DL33_1 Посмотреть сообщение
Это 95-97 строчки
у тебя вариантов 2:
1) перестать со мной спорить, привести в порядок свой код и найти ошибку
2) продолжить доказывать мне, что ни один объект не равен null, и ловить NPE.
0
1 / 1 / 2
Регистрация: 19.06.2016
Сообщений: 36
17.01.2017, 18:03  [ТС]
xoraxax, сейчас будут скрины дебага

Добавлено через 4 минуты
Паблито, да хоть по одному слову, вылезает на строке с вызовом метода (я пробовал)
0
1 / 1 / 2
Регистрация: 19.06.2016
Сообщений: 36
17.01.2017, 18:13  [ТС]
дебаг в студию
Миниатюры
NPE в консольных шашках  
0
1 / 1 / 2
Регистрация: 19.06.2016
Сообщений: 36
17.01.2017, 18:16  [ТС]
Но мне кажется, что если проверка на null есть и она проходит, наверное все-таки не в этом проблема
0
1 / 1 / 2
Регистрация: 19.06.2016
Сообщений: 36
17.01.2017, 18:20  [ТС]
Вот заодно и разделение по строкам
Миниатюры
NPE в консольных шашках  
0
2884 / 2296 / 769
Регистрация: 12.05.2014
Сообщений: 7,978
17.01.2017, 18:27
Лучший ответ Сообщение было отмечено DL33_1 как решение

Решение

вообще я имел ввиду что написать как-то так
Java
1
2
3
                    boolean b = Main.isWhitesTurn ? checkIfWhiteCanEat() : checkIfBlackCanEat();
                    Piece p = Board.cells[sourceRow][sourceCol].piece;
                    p.doesMoveNeedEating(Board.cells[targetRow][targetCol]));
1
Эксперт Java
 Аватар для KEKCoGEN
2399 / 2224 / 565
Регистрация: 28.12.2010
Сообщений: 8,672
17.01.2017, 18:29
DL33_1, вам все верно говорят. Пройдитесь дебагом и разделите строки. Какой смысл доказывать что вы правы если вы ловите NPE? Возможно у вас проблемы внутри метода doesMoveNeedEating?
1
1 / 1 / 2
Регистрация: 19.06.2016
Сообщений: 36
17.01.2017, 18:42  [ТС]
KEKCoGEN, я уже скинул скрины дебагов чуть выше. Проходился им вдоль и поперек. При каком-нибудь null'e, если не обращать внимания на то, что они у меня несколькими строчками выше ищутся и кидается исключение, ошибка была бы раньше.

Что касается doesMoveNeedEating - его дебагил, ошибок нет, да и он вызывается чуть выше (опять же была бы ошибка раньше).
0
1 / 1 / 2
Регистрация: 19.06.2016
Сообщений: 36
17.01.2017, 18:55  [ТС]
Цитата Сообщение от Паблито Посмотреть сообщение
вообще я имел ввиду что написать как-то так
Сойдет?
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
if (Main.isWhitesTurn ? checkIfWhiteCanEat() : checkIfBlackCanEat()) {
                        Piece p = Board.cells[sourceRow][sourceCol].piece; // the
                                                                            // piece
                                                                            // the
                                                                            // method
                                                                            // is
                                                                            // called
                                                                            // on
                        Cell c = Board.cells[targetRow][targetCol]; // the cell
                                                                    // the piece
                                                                    // is going
                                                                    // to move
                                                                    // to
                        if(p.doesMoveNeedEating(c)){
                            // hooray!
                        }else{
                            throw new IllegalArgumentException("Invalid move: you must eat!");
                        }
                    }
Ничего неожиданного. Во второй if не зайдет, потому что npe.
Миниатюры
NPE в консольных шашках  
0
1 / 1 / 2
Регистрация: 19.06.2016
Сообщений: 36
17.01.2017, 19:29  [ТС]
Один момент. Кажется, я моральный инвалид.

Добавлено через 29 минут
Прошу прощения у всех, кто страдал этим идиотизмом вместе со мной.
Эту ошибку вообще никто даже теоретически не мог найти, потому что я посчитал это ненужным и стер, чтобы первое сообщение влезло в 15000 символов.

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public boolean canEat() {
        TmpBoard tmpb = new TmpBoard();
        Controller.copyTo(tmpb);
 
        for (int i = 0; i < 8; i++) {
            for (int j = 0; j < 8; j++) {
                try {
                    preliminaryValidityCheck(Board.cells[i][j]);
                    if (doesMoveNeedEating(Board.cells[i][j])) {
                        move(Board.cells[i][j]);
                        // for now move is possible and requires eating
                        return true;
                    }
                } catch (IllegalArgumentException e) {
                }
                Controller.copyFrom(tmpb);
            }
        }
        return false;
    }
Если съесть можно, этот метод не восстанавливает доску за собой и шашка уже походила, ее на месте уже нет. Null.
Еще раз прошу прощения. Спасибо Паблито.
Тема закрыта. Надеюсь.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
17.01.2017, 19:29
Помогаю со студенческими работами здесь

Как запрограмировать дамку в шашках?
как запрограмировать дамку в шашках?

Компаратор и NPE
Здравствуйте, уважаемые форумчане. Java изучаю недавно, и наткнулся на одну загвоздку. Ругается программа на вызов getPost(). Понимаю,...

Dagger2 NPE
Форумчане кто силен в даггере? Подскажите где закралась ошибка. При попытке внедрить зависимости в onCreate MainActivity .class вылетает...

Мистика и NPE
package picparcer; import java.awt.Image; import java.io.*; import java.net.*; import java.util.ArrayList; import...

Как делать оценку узла дерева минимакса в шашках?
Разбираюсь с алгоритмом минимакса на основе игры шашки. Далее изложение моего понимания работы алгоритма со этой задачей: Для каждого...


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

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru