tictactoe在java中使用regex

a7qyws3x  于 2021-07-06  发布在  Java
关注(0)|答案(4)|浏览(263)

使用regex创建tictactoe函数,该函数接收九个“x”、“o”和/或“-”字符组成的字符串,表示tic-tac趾板的状态,例如字符串: "X-OXXXO-O" 这表示:

X-O
XXX
O-O

更多示例:

"XOOOXXXXO" - False - no one got three in a row here.

"OXO-XOX-O" - True - player O won by getting three in a row vertically in the third column.

下面是我编写代码的尝试:

public static boolean regexTicTacToeWinChecker(String b) {
        return b.matches("(((^(...)*000(...)*$)|(.*0..0..0.*)|(0(...0{2}))|(.(.0){3}..))) | (((^(...)*XXX(...)*$)|(.*X..X..X.*)|(X(...X){2})|(.(.X){3}..)))");
    }

使用regex比编写大量if更有用,if涵盖了所有的情况。所以请回答雷杰克斯,帮助将不胜感激。谢谢这里有一些测试,你可以用来检查:

import org.junit.Test;
import static org.junit.Assert.assertEquals;
import org.junit.runners.JUnit4;

public class ExampleTestCases {
    @Test
    public void SomeBoardsWithWinnersTests () {
      String[] winners = new String[]{"XXX-O-O-O", "X--OOOX-X", "O--OO-XXX", "O-XOX-O-X", "OXOOXOXX-", "X-O-OOXXO", "XO--X-OOX", "X-OXOOOXX"};
      for (String winner : winners) {
            System.out.println("Testing with board " + winner);
            assertEquals(true, RegexTicTacToeWinChecker.regexTicTacToeWinChecker(winner));
      }
    }

    @Test
    public void SomeBoardsWithoutWinnersTests () {
      String[] notWinners = new String[]{"XO-------", "XX-XOO---", "-XX-OO-O-", "OXO--XXO-", "OOXXXO---", "OXXX-XOO-", "OOXXX----", "XXOOXXOO-", "OXOXOX---"};
      for (String notWinner : notWinners) {
            System.out.println("Testing with board " + notWinner);
            assertEquals(false, RegexTicTacToeWinChecker.regexTicTacToeWinChecker(notWinner));
      }
    }
}
daolsyd0

daolsyd01#

你可以试试这个:
查看regex演示
我只是将输入作为模式输入:

X-O
XXX
O-O
Pattern pattern = Pattern.compile("([XO])(?:(?:\\1\\1)|(?:(?:[\\sXO-]{2}\\1){2})|(?:[\\sXO-]{3}\\1){2}|(?:[\\sXO-]{4}\\1){2})", Pattern.CASE_INSENSITIVE);
        Matcher matcher = pattern.matcher("X-O\n" +
                "XXX\n" +
                "O-O");
        boolean matchFound = matcher.find();
        if(matchFound) {
            System.out.println("Match found and "+ matcher.group(1) + " win!");
        } else {
            System.out.println("Match not found!");
        }

输出:

Match found and X win!
syqv5f0l

syqv5f0l2#

我更喜欢让你的正则表达式尽可能简单!这意味着您需要停止将所有内容压缩到一根线。
想象一下:

XOX
OOX
XXO

为什么不从中创建几个字符串,比如:
水平线: XOX 水平线: OOX 水平线: XXO
垂直线: XOX 垂直线: OOX 垂直线: XXO
左上对角线: XOO 左下对角线: XOX 并针对以下各项运行这些值:

"^X{3}$" = player 1 won
"^O{3}$" = player 2 won

在代码中:

Pattern player1Pattern = Pattern.compile("^X{3}$");
Pattern player2Pattern = Pattern.compile("^O{3}$");
for(String s: tictactoe) {
    if(player1Pattern.matcher(s).matches()){
         //Player 1 wins
    }else if(player2Pattern.matcher(s).matches()){
         //Player 2 wins
    }else{
         //nobody wins
    }
}
js81xvg6

js81xvg63#

您可以将其分解为以下几种情况:
水平匹配:

(?:...){0,2}([OX])\1\1

垂直匹配:

.{0,2}([OX])..\2..\2

对角线匹配(两个方向):

([OX])...\3...\3
 ..([OX]).\4.\4

现在,你只要 or 将它们放在一起,并确保regex与board字符串的开头匹配:

^(?:(?:...){0,2}([OX])\1\1|.{0,2}([OX])..\2..\2|([OX])...\3...\3|..([OX]).\4.\4)

编辑:下面是一个测试regex的小java程序:

import java.util.regex.*;

public class TicTacToe {
    public static void main(String[] args) {
    Pattern r = Pattern.compile("^(?:(?:...){0,2}([OX])\\1\\1|.{0,2}([OX])..\\2..\\2|([OX])...\\3...\\3|..([OX]).\\4.\\4)");

    String board = "XXX-O-O-O";

    Matcher m = r.matcher(board);
    System.out.println(m.lookingAt() ? "match" : "no match");
    }
}
cvxl0en2

cvxl0en24#

如果你想在几个月内维护你的正则表达式,我宁愿选择可读性更好的,而不是过于聪明的。;

Vertical match:   X..X..X..|.X..X..X.|..X..X..X
Horizontal match: XXX......|...XXX...|......XXX
Diagonal match:   X...X...X|..X.X.X..

一起:

^(?:X..X..X..|.X..X..X.|..X..X..X|XXX......|...XXX...|......XXX|X...X...X|..X.X.X..)$

这使得获胜的模式几乎可以通过查看regex看到。
用同样的方法 O ,你应该可以走了:)

相关问题