Algoritmia

aloha…

eu estou fazendo um tic tac toe… e estou com um problema de algoritmia… eu tenho o seguinte código que coloca num array todas os cantos que estiverem desocupados… mas eu agora keria um método que me colocasse num array destes as jogadas das linhas, colunas ou diagonais que apenas tivessem uma casa vazia, ou seja… jogadas vencedores…

public Move[] getLegalCornerMoves(IBoard board) { ArrayList<Move> moves = new ArrayList<Move>(); for (int i = 0, j = 0; i < BOARDSIZE; i += 2, j += 2) { Move m = new Move(i, j); if (board.isFree(m)) { moves.add(m); } }

Como é que eu faço isto sem ser com uma carrada de if´s que é a única maneira que eu estou vendo ?

Você pode pensar o seguinte…
Comece mexendo nas linhas…primeira linha…um for que percorra até encontrar um quadrado cheio, com base nessa linha que tem o quadrado preenchido, varre ela e veja se tem todos quadrados preenchidos da linha -1, ou seja…faz um incremento a cada vez que achar 1 quadrado cheio, e se for igual a -1 do tamanho total do board, você tem ai uma linha com jogada vencedora…
Não consigo imaginar um algoritmo melhor, vai ter que usar uns boolean de sentinela…acho que é isso mesmo! :shock:

Muito obrigado… já resolvi o problema… ficou um bocado grande… mas axo que tem mesmo que ser assim… se quiserem depois eu posto…

Obrigado pela atenção…

[quote=TelmaSofia]Muito obrigado… já resolvi o problema… ficou um bocado grande… mas axo que tem mesmo que ser assim… se quiserem depois eu posto…

Obrigado pela atenção… [/quote]

agradeceria se postar!:smiley:
para a gente dar uma olhadinha!:smiley:

Aqui vai…
Podia haver uma solução mais simples… mas foi a que consegui… está funcionando em pleno…

	public Move[] isOneFree(IBoard board, int ch) {
		ArrayList<Move> moves = new ArrayList<Move>();

		for (int i = 0; i < BOARDSIZE; i++) {

			if (board.get(i, 0) == ch && board.get(i, 0) == board.get(i, 1)
					&& board.get(i, 2) == 0) {
				Move m = new Move(i, 2);
				moves.add(m);
			}
			if (board.get(i, 0) == ch && board.get(i, 0) == board.get(i, 2)
					&& board.get(i, 1) == 0) {
				Move m = new Move(i, 1);
				moves.add(m);
			}
			if (board.get(i, 1) == ch && board.get(i, 1) == board.get(i, 2)
					&& board.get(i, 0) == 0) {
				Move m = new Move(i, 0);
				moves.add(m);
			}

			if (board.get(0, i) == ch && board.get(0, i) == board.get(1, i)
					&& board.get(2, i) == 0) {
				Move m = new Move(2, i);
				moves.add(m);
			}
			if (board.get(0, i) == ch && board.get(0, i) == board.get(2, i)
					&& board.get(1, i) == 0) {
				Move m = new Move(1, i);
				moves.add(m);
			}
			if (board.get(1, i) == ch && board.get(1, i) == board.get(2, i)
					&& board.get(0, i) == 0) {
				Move m = new Move(0, i);
				moves.add(m);
			}

		}

		if (board.get(0, 0) == ch && board.get(0, 0) == board.get(1, 1)
				&& board.get(2, 2) == 0) {
			Move m = new Move(2, 2);
			moves.add(m);
		}

		if (board.get(0, 0) == ch && board.get(0, 0) == board.get(2, 2)
				&& board.get(1, 1) == 0) {
			Move m = new Move(1, 1);
			moves.add(m);
		}
		if (board.get(1, 1) == ch && board.get(1, 1) == board.get(2, 2)
				&& board.get(0, 0) == 0) {
			Move m = new Move(0, 0);
			moves.add(m);
		}

		if (board.get(2, 0) == ch && board.get(2, 0) == board.get(1, 1)
				&& board.get(0, 2) == 0) {
			Move m = new Move(0, 2);
			moves.add(m);
		}

		if (board.get(2, 0) == ch && board.get(2, 0) == board.get(0, 2)
				&& board.get(1, 1) == 0) {
			Move m = new Move(1, 1);
			moves.add(m);
		}
		if (board.get(1, 1) == ch && board.get(1, 1) == board.get(0, 2)
				&& board.get(2, 0) == 0) {
			Move m = new Move(2, 0);
			moves.add(m);
		}

		return (Move[]) moves.toArray(new Move[0]);
	}
	public Move getOneFreeToWin (IGameModel model){
		List list= Arrays.asList(model.isOneFree(model.getBoard(), 'X'));
		if (list.size() == 0) {
			return getCornerMove(model);
			
		}
		Collections.shuffle(list);
		return (Move) list.get(0);
	}