2010-10-27 6 views
3

J'essaie de faire un jeu Tic-Tac-Toe très simple. J'ai stocké les valeurs de "X" et "O" dans un 0-8 ArrayList (3x3 carrés, essentiellement). Je peux faire ce qui suit pour chaque instance d'une situation gagnante:Comparaison de Java ArrayList- TicTacToe

if ((newBoard().get(0)).equals("X") && 
    (newBoard().get(1)).equals("X") && 
    (newBoard().get(2)).equals("X")){ 
System.out.println("Player-X has won!"); 
return true; 

Cependant, cela va prendre une TONNE de code! J'ai pensé à créer de nouveaux ArrayLists qui contiennent les situations dans lesquelles "X" a gagné (3-dans-roe), puis copiez et collez, remplacez "X" par "O", puis comparez avec le tableau ArrayList actuel que l'utilisateur 'interagit avec' C'est très bien, mais je ne sais pas comment les comparer. J'ai regardé l'API, mais je n'ai pas pu trouver quoi que ce soit qui puisse faire ce que je veux, qui est de comparer à ArrayLists, mais seulement pour les index spécifiés. Tout ce qui concerne le fait de rendre cette situation un peu plus petite, en termes de code, sera grandement apprécié. Merci!

+0

Merci pour votre aide! J'ai maintenant une erreur indexOutofRange, mais je l'afficherai dans une autre question. Vous avez tous eu d'excellentes solutions, mais j'ai choisi Adam parce que c'est le plus logique, compte tenu de mon niveau de compétence et de l'objectif de ce projet, sans dire que Jon et d'autres n'ont pas aidé et peut-être aider quelqu'un d'autre avenir. Merci encore! –

Répondre

1

Le point est pas que des lignes, des colonnes et diaganols sont égaux à X et O, mais ils sont tous égaux les uns aux autres si elles être X ou O de sorte qu'au lieu de l'utilisation de la ligne:

if ((newBoard().get(0)).equals(newBoard().get(1)) && newBoard().get(1).equals(newBoard().get(2))){ 
    System.out.println("Player-" + newBoard().get(0) +" has won!"); 
return true; 

Cela signifie la même chose, mais travaille pour X et O . L'étape suivante consiste à faire une fonction qui compare seulement trois indices de localisation:

private boolean checkForWin(int x, int y, int z){ 
    return newBoard().get(x).equals(newBoard().get(y)) && newBoard().get(y).equals(newBoard().get(z)); 
} 

Vous pouvez alors simplement garder le passage qui fonctionnent tous les index possibles de localisation gagnante.

+0

Vous ne pouvez pas chaîner 'equals' ... – wchargin

+0

@WChargin Bon point. J'ai édité la réponse. – Adam

0

Commander ce golf code pour voir différents algorithmes pour vérifier si et quel joueur a un jeu de morpion:

Code Golf: Tic Tac Toe

+0

En particulier la [solution Java] (http://stackoverflow.com/questions/2245801/code-golf-tic-tac-toe/2565507#2565507). – jball

7

Eh bien, une option est de ne pas penser à tous les gagnants conseils, mais tous les gagnants requis emplacements. Par exemple:

private static final int[][] LINES_OF_THREE = { 
    { 0, 1, 2 }, // Horizontals 
    { 3, 4, 5 }, 
    { 6, 7, 8 }, 
    { 0, 3, 6 }, // Verticals 
    { 1, 4, 7 }, 
    { 2, 5, 8 }, 
    { 0, 4, 8 }, // Diagonals 
    { 6, 4, 2 } 
}; 

Alors quelque chose comme:

for (int[] line : LINES_OF_THREE) { 
    boolean won = true; 
    for (int place : line) { 
    // player = "O" or "X" 
    if (!newBoard.get(place).equals(player)) { 
     won = false; 
     break; 
    } 
    } 
    if (won) { 
    // Yippee! 
    } 
} 
+1

Vous confondez votre C# et Java avec la syntaxe hybride "for (int place IN line)": p –

+0

@Luke: Oups, oui. Fixation ... –

1

Sun a publié une application TicTacToe qui utilise l'opération au niveau du bit pour stocker l'état du jeu et calculer les gains calculés.

http://java.sun.com/products/jfc/tsc/articles/tictactoe/src/TicTacToe.java

Chaque joueur a son propre état de bord et en utilisant les opérations au niveau du bit du jeu indique quels espaces sont gratuits. Tout comme la réponse de Jon, les conditions de victoire sont vérifiées par rapport à un éventail d'emplacements de victoire. Ne nécessitant qu'une seule boucle, au lieu de deux.

Si vous avez le temps d'examiner cela, il est une solution fantastique pour TICTACTOE

0

Il n'y a que trois conditions gagnantes réel dans morpion. Les lignes, les colonnes et les diagonales

Ici, avec un tableau carré [3,3] (adapter au besoin), puis vous utilisez itérer à travers les colonnes et les rangées. Ensuite, vous avez juste deux diagonales à vérifier. J'ai trouvé que c'était la façon la plus facile de le faire.

boolean HasWon(PLAYER p) 
{ 
    for (int i = 0; i < 3; i++) 
    { 
     // Columns 
     if (board[i, 0] == p) 
      if (board[i,1] == p && board[i,2] == p) 
       return true; 
     // Rows 
     if (board[0, i] == p) 
      if (board[1, i] == p && board[2, i] == p) 
       return true; 
    } 
    //Check diagonals 
    if (board[0,0] == p && board[1,1] == p && board[2,2] == p) return true; 
    if (board[2,0] == p && board[1,1] == p && board[0,2] == p) return true; 
    return false; 
}