2009-12-03 3 views
0

J'écris un jeu de tic-tac-toe en Java.Vérification de deux bits adjacents dans le tableau 2D (Java)

J'ai un tableau 2D représentant une grille de 3 par 3, et j'ai besoin d'une méthode pour vérifier s'il y a 2 bits définis de telle sorte qu'une ligne de 3 peut être formée en ajoutant un troisième bit. La seule façon dont je pourrais penser à faire cela est d'itérer le long des lignes, en vérifiant un espace vide, puis en vérifiant les bits autour de lui, mais c'est un morceau de code potentiellement confus et confus.

Tous les conseils et astuces sont appréciés!

+0

Est-ce un devoir? –

Répondre

0

Pour une carte TTT dont vous savez qu'elle est toujours 3x3, il suffit de la forcer - il n'y a pas beaucoup de comparaisons.

pseudo:

foreach row 
    if (col1 and col2 and not col3 OR col1 and not col2 and col3 OR not col1 and col2 and col3) 
foreach col 
    if (row1 and row2 and not row3 OR row1 and not row2 and row3 OR not row1 and row2 and row3) 

Ne pas oublier d'ajouter les deux chèques pour les Diags.

0

La stratégie est bonne - testez tous les espaces vides sur le tableau et calculez un score, alors que les rangs de trois en ligne sont un score maximum et vous pouvez arrêter de chercher de meilleures solutions.

Que ce soit désordonné ou confus ou non est entre vos mains. Je suis assez sûr que l'on peut fournir une implémentation lisible pour cette stratégie. Pensez à des noms de méthode d'auto langue:

public Move bestMove(Board board) { 
    Score actualMax = new Score(Score.MINIMUM); 
    Move[] moves = findAllEmptyFields(board); 
    for (Move move:moves) { 
    Score actualScore = evaluateMoveForBoard(board, move); 
    if (actualScore.equals(Score.MAXIMUM) { 
     return move; 
    } else if (actualScore.higherThan(actualMax)) { 
     actualMax = actualScore; 
    } 
    } 
    return actualMax.getMove(); 
} 

Mon conseil classe fictive représente le conseil tic-tac-toe réelle, ma classe Score détient le score de ce mouvement et le mouvement pour ce score.

Peut-il être déroutant ou lisible?

0

Je dirais que l'itération gênante est toujours le moyen le plus simple de le faire. Si vous ne voulez toujours pas cela, je vous suggère de jeter un coup d'oeil à la théorie autour du bitboard. C'est une façon de représenter les échecs, les dames et les tableaux similaires, peut-être que vous pouvez y trouver quelque chose.

Robert Hyatt a écrit plusieurs bons articles sur le bitboard et les a publiés librement sur les intertubes.

0

Vous pouvez toujours attribuer l'un des 2 bits par position de grille 0 = vide 1 = joueur 1 2 = joueur 2. Remplissez dans chaque fois qu'un joueur fait un mouvement

1, 2    4,  8    16,  32 

    64, 128   256, 512   1024, 2048 

4096, 8192   16384, 32768   65536, 131072 

Vous pouvez alors utiliser un vérification simple bitwise rapide pour voir qui a gagné.

Pour vérifier la ligne supérieure, vous devez vérifier les bits 1 3 et 5. Cela peut être fait en prenant la valeur entière et & 'avec 1 | 4 | 16 ou 21. Si les valeurs sont non nulles alors le joueur 1 a une ligne. Pour vérifier joueur 2 sur la ligne supérieure vous le feriez et avec 2 | 8 | 32 ou 42. Un joueur 1 diagonal serait 1 | 256 | 65536 ou 65281 et ainsi de suite.

+0

ant raison particulière je suis descendu-voté .... un commentaire comme explication serait agréable :) – Goz