Поскольку я редкостная язва, то даже пытаться пролезть на хабрахабр довольно бессмысленная затея. Что не мешает мне его читать. Вот довольно таки полезная статья по созданию приложения уровнем посложнее чем набивший оскомину Hello, World.
В целом полезная. Но с точки зрения реализации некоторых алгоритмов... я содрогнулся. Элементарная задача решается путем таких жутких умственных вывертов, что я не верю никаким оправданиям автора, что ему было лень думать, или он хотел показать как эта задача может быть решена в более сложном случае.
Начнем с того, что тупо проверять все мыслимые варианты, в то время как тебе точно известно где поставлена последняя метка - граничит с идиотизмом. Достаточно проверить одну вертикальную линию, одну горизонтальную и две диагонали. 4 линии вместо 14. Это в наихудшем случае. Если метка не попадает на диагональ, то логично не проверять эту диагональ вовсе.
Замечу также что известна последняя метка - стало быть если это крестик, то сложно ожидать что вдруг выиграли нолики. И наоборот. Что еще сильнее упрощает проверку.
Сравните объем кода с оригиналом:
public Player checkWinner(int x, int y, Player player) {
if (checkWinnerHorizontal (x,y,player)) return player;
if (checkWinnerVertical (x,y,player)) return player;
if (checkWinnerCross (x,y,player)) return player;
return null;
}
private boolean checkWinnerCross(int x, int y, Player player) {
boolean flag=false;
if (x==y){//Проверяем одну диагональ
flag=true;
for (int i=0;i<3;i++)
if (field[i][i].getPlayer()!=player) {flag=false; break;}
if (flag) return true;
}
if ((2-x)==y) {//Проверяем вторую диагональ
flag=true;
for (int i=0;i<3;i++)
if (field[2-i][i].getPlayer()!=player) {flag=false; break;}
}
return flag;
}
private boolean checkWinnerVertical(int x, int y, Player player) {
for (int i=0;i<3;i++) {
if (field[x][i].getPlayer()!=player) return false;
}
return true;
}
private boolean checkWinnerHorizontal(int x, int y, Player player) {
for (int i=0;i<3;i++) {
if (field[i][y].getPlayer()!=player) return false;
}
return true;
}
P.S. Черт, как бы приделать к блогспоту нормальное форматирование кода?
Комментариев нет:
Отправить комментарий