Android! Разработка мобильных


Sudokuv2/src/org/example/sudoku/Game.java



Pdf көрінісі
бет60/87
Дата26.01.2023
өлшемі3,48 Mb.
#63133
1   ...   56   57   58   59   60   61   62   63   ...   87
 Sudokuv2/src/org/example/sudoku/Game.java
protected boolean setTileIfValid(int x, int y, int value) {
int tiles[] = getUsedTiles(x, y);
if (value != 0) {
for (int tile : tiles) {
if (tile == value)
return false;
}
}
setTile(x, y, value);
calculateUsedTiles();
return true;
}


4 .4 . Конец истории 91
Для определения правил�ных ходов �ы �оздади� �а��ив для каждо�о тайла 
в табли�е� Для каждой пози�ии �а��ив хранит �пи�ок заполненных тайлов� кото�
рые види�ы в на�тоя�ее вре�я� Е�ли чи�ло появляет�я в �пи�ке� �то значит� что 
оно не подходит для теку�е�о тайла� Метод 
getUsedTiles()
получает �тот �пи�ок для 
заданной пози�ии тайла�
 Sudokuv2/src/org/example/sudoku/Game.java
private final int used[][][] = new int[9][9][];
protected int[] getUsedTiles(int x, int y) {
return used[x][y];
}
Ма��ив и�пол�зованных тайлов ра��читыват� довол�но накладно� по�то�у �ы 
к�шируе� �тот �а��ив и пере�читывае� е�о лиш� то�да� ко�да �то нужно� вызывая 
�етод 
calculateUsedTiles()

 Sudokuv2/src/org/example/sudoku/Game.java
private void calculateUsedTiles() {
for (int x = 0; x < 9; x++) {
for (int y = 0; y < 9; y++) {
used[x][y] = calculateUsedTiles(x, y);
// Log.d(TAG, "used[" + x + "][" + y + "] = "
// + toPuzzleString(used[x][y]));
}
}
}
Метод 
calculateUsedTiles()
про�то вызывает 
calculateUsedTiles
(
x
� 
y
) для каждой по�
зи�ии решетки девят� на девят�:
 Sudokuv2/src/org/example/sudoku/Game.java
1 private int[] calculateUsedTiles(int x, int y) {
- int c[] = new int[9];
- // горизонтальная
- for (int i = 0; i < 9; i++) {
5 if (i == x)
- continue;
- int t = getTile(i, y);
- if (t != 0)
- c[t - 1] = t;
10 }
- // вертикальная
- for (int i = 0; i < 9; i++) {
- if (i == y)
- continue;
15 int t = getTile(x, i);
- if (t != 0)
- c[t - 1] = t;
- }
- // та же клетка блока
20 int startx = (x / 3) * 3;


92 Глава 4 • Введение в 2D-графику
- int starty = (y / 3) * 3;
- for (int i = startx; i < startx + 3; i++) {
- for (int j = starty; j < starty + 3; j++) {
- if (i == x && j == y)
25 continue;
- int t = getTile(i, j);
- if (t != 0)
- c[t - 1] = t;
- }
30 }
- // сжатие
- int nused = 0;
- for (int t : c) {
- if (t != 0)
35 nused++;
- }
- int c1[] = new int[nused];
- nused = 0;
- for (int t : c) {
40 if (t != 0)
- c1[nused++] = t;
- }
- return c1;
- }
Мы начинае� � �а��ива из девяти нулей� В �троке 4 �ы проверяе� в�е тайлы� 
принадлежа�ие то�у же �оризонтал�но�у ряду� что и теку�ий� и� е�ли тайл не 
пу�той� �ы �охраняе� е�о �ифру в �а��иве�
В �троке 12 �ы делае� то же �а�ое для в�ех тайлов вертикал�ной �троки� в �тро�
ке 20 — то же �а�ое для тайлов блока три на три�
По�ледний ша�� который начинает�я в �троке 32� — �то �жатие нулей в �а��иве 
перед е�о возвра�ение�� Мы делае� �то для то�о� чтобы ко�анда 
array .length
�о�ла 
быт� и�пол�зована для бы�тро�о определения количе�тва заполненных тайлов� 
которые види�ы в теку�ей пози�ии�
Разное
Для завершения реализа�ии на� понадобят�я е�е не�кол�ко �лужебных функ�
�ий и пере�енных� 
easyPuzzle
� 
mediumPuzzle
и 
hardPuzzle
— наши закодированные 
�оловоло�ки Su��ku для про�то�о� �редне�о и вы�око�о уровней �ложно�ти �оот�
Su��ku для про�то�о� �редне�о и вы�око�о уровней �ложно�ти �оот�
для про�то�о� �редне�о и вы�око�о уровней �ложно�ти �оот�
вет�твенно�


Достарыңызбен бөлісу:
1   ...   56   57   58   59   60   61   62   63   ...   87




©emirsaba.org 2024
әкімшілігінің қараңыз

    Басты бет