【问题标题】:2048 get board with python selenium2048 用 python selenium 获取板子
【发布时间】:2015-11-23 05:48:12
【问题描述】:

我正在尝试创建一个可以玩 2048 游戏的 AI。我的问题是我无法获得我想要的格式的电路板。

我的代码(获取板子):

def get_board():
    board = {"1": '-',"2": '-', "3": '-',"4": '-',
            "5": '-',"6": '-', "7": '-',"8": '-',
            "9": '-',"10": '-', "11": '-',"12": '-',
            "13": '-',"14": '-', "15": '-',"16": '-'}
    tiles = driver.find_elements_by_class_name("tile")
    for tl in tiles:
        til = tl.get_attribute("class")       
        tile = til.split()
        if "tile-position-1-1" in tile:
            value = driver.find_elements_by_xpath("/html/body/div/div[3]/div[3]/div[1]/div")
            board["1"] = value
        elif "tile-position-2-1" in tile:
            value = driver.find_elements_by_xpath("/html/body/div/div[3]/div[3]/div[2]/div")
            board["2"] = value
        elif "tile-position-3-1" in tile:
            value = driver.find_elements_by_xpath("/html/body/div/div[3]/div[3]/div[2]/div")
            board["3"] = value
        return board

我希望它把图块放在字典的正确位置,例如: 如果 tile 1-1 是 4 那么它应该做board['1'] = "4"

有什么想法可以做到吗?

【问题讨论】:

  • 列表不是比字典更适合吗?
  • 不,因为人工智能的工作方式......
  • 尝试将此问题重新表述为一个编程问题,并提供一个不起作用的最小示例。您是否对如何使用selenium 阅读网页内容感到困惑,或者对如何更新字典或在存储游戏板时寻找数据结构建议感到困惑?
  • tile 1-1 是如何翻译成 ['1'] 的? 1-2会去哪里?和2-1?您需要将您提供的内容简化为您所要求的内容,通过提供一些代码表明您已经完成了一些工作,并解释为什么它不起作用。
  • 1-1 就像绳索......这就是它在页面中的方式,但我希望它像 1-1 是 1,2-1 是 2,3-1 是 3,4- 1 是 4,然后 1-2 是 5,2-2 是 6.....4-4 是 16(问题是我在编程方面很新,这是我第一次使用 selenium,所以我不知道为什么它不起作用:/)

标签: python python-3.x selenium selenium-webdriver


【解决方案1】:

我不懂 Python,但这是 Java,希望你能翻译一下。

我将棋盘放入int 的二维数组中,格式为board[1][2] = 16,其中该图块上的类为tile tile-16 tile-position-1-2 tile-new。我知道这不是你要求的,但你没有提供足够的细节来说明你如何存储各种位置......

List<WebElement> tiles = driver.findElements(By.cssSelector("div.tile"));
int[][] board = new int[5][5]; // need 5 instead of 4 because we are going to use indices 1-4 and not 0-3
for (WebElement tile : tiles)
{
    String className = tile.getAttribute("className");
    String regex = "tile tile-(\\d*) tile-position-(\\d)-(\\d) tile-new";
    Matcher matcher = Pattern.compile(regex).matcher(className);
    matcher.matches();
    int x = Integer.parseInt(matcher.group(2));
    int y = Integer.parseInt(matcher.group(3));
    int value = Integer.parseInt(matcher.group(1));
    board[x][y] = value;
}

代码使用 tile 类获取 DIV,因为所有具有任何值的 tile 都在此处定义。 (板的 HTML 有点奇怪 IMO 但我不是网页设计师......所以也许只是我)。然后它遍历所有图块并获取存储所有位置和值数据的类名。它使用正则表达式来粘贴 className,然后将值分配给数组 board 中的正确位置。

如果你转储 board 的值,你会得到类似的东西

0000
0020
0000
0020

希望对您有所帮助。

【讨论】:

  • 我会尽力理解和翻译它(我不懂Java)还是谢谢:D
  • 应该不会太难...基于 Selenium 的方法应该很容易翻译。 int[][] 是一个二维数组。 for (WebElement tile : tiles) 就像其他语言中的 foreach()。我认为,正则表达式会很简单,因为正则表达式字符串很明显,您只需要提取特定的匹配组,将它们转换为int,然后将它们分配到二维数组中。如果您需要更多帮助,请告诉我,我会看看我能做些什么。
  • 我仍然无法弄清楚,但我认为我正在处理过程.....问题是我不知道出了什么问题......我得到一个 AttributeError: 'NoneType'对象没有属性“组”........当我打印(板)时,我得到类似:[[0, 0, 0, 0, 0], [0, 0, 0, 0, 0] , [0, 0, 0, 0, '2'], [0, 0, 0, 0, 0], [0, '2', 0, 0, 0]] 多一个数字和多行....
  • 所以关于我设置它的方式的一件事是我不使用board的第0个索引...只使用第1-4行。这样它就与类名匹配了。所以从 x = 1 到 4 和 y = 1 到 4 循环,你应该很好。或者你可以花时间-1'ing所有索引...... :)
  • 是的,我现在想通了,我刚刚做了 range(1, 5) .....但我还有另一个问题....如果我尝试循环执行一次之后,它会说Traceback(最近一次调用最后):文件“C:\Users\panag\OneDrive\Python\Finished\Uncompiled\2048\browser auto play\as.py”,第 24 行,在 game_board = get_board() 文件中C:\Users\panag\OneDrive\Python\Finished\Uncompiled\2048\browser auto play\as.py",第 16 行,在 get_board x = int(m.group(3)) AttributeError: 'NoneType' object has no属性“组”
猜你喜欢
  • 2018-12-14
  • 1970-01-01
  • 2017-08-22
  • 2018-09-29
  • 2021-12-14
  • 1970-01-01
  • 1970-01-01
  • 2015-09-06
  • 1970-01-01
相关资源
最近更新 更多