-5

交叉张贴国际象棋,但没有。


lichess和chess.com都具有实时播放变体chess960的功能。但是,只有 lichess 有一个图表,显示您的实时 chess960 评分如何随时间变化。Lichess 还显示其他统计数据,如最高、最低、最佳胜利、最差损失、平均对手评级等(不过,chess.com 确实有此对应 chess960。)

我可以通过手动记录每场比赛的日期,然后在我的用户名旁边显示我的评分,在 Excel/Google 表格中创建自己的图表和统计数据,但是......

问题:有没有一种方法可以在每场 chess960 游戏之后使用某种脚本来获得评分,或者一般来说,获得评分的方法是使用某种脚本来查看玩家的公开资料,然后提取数据?

我有一种感觉,这种脚本以前已经做过,即使这不是专门为 chess.com 的 live chess960 做的。该脚本不必绘制图表(一旦您拥有数据就很容易做到:只需使用 excel/google 表格)。我只需要脚本来收集用户游戏每一行的所有日期和评分数字。


编辑1:不确定堆栈上的主题,离题的东西,但我之前已经在堆栈上发布过。我的第一篇文章是在 2014 年。似乎这些帖子受到了负面反应,因为我似乎要求用勺子喂食什么的。如果不是一些家庭作业,我不相信用勺子喂食一定是个问题,而且用勺子喂食不一定是我要问的,或者至少是打算(或“打算”?)问。你可以给我一般的想法。例如,如果这与“刮擦”或其他事情有关,那么就这么说吧。

但是,我并不认为这个问题有什么不同,如下所示:

  1. 如果 SE 在推特上发布我的问题,我如何获得通知?--> 在这里你可能会争辩说我在 se 上询问 se 本身,所以它应该被允许。我问了chess.com的人,但他们没有回复我,所以我来了。

  2. 可以通过负概率或其他方式进行套利时的定价--> 我的意思是这家伙是在用勺子喂食还是通过编写脚本来做任何事情?

编辑 2:此外,我在这篇文章中想要表达的是避免重新发明轮子/轮子重新发明的概念。我的意思是,我不可能成为互联网历史上第一个想要从 chess.com 或 lichess 或其他东西中提取数据的人。另外,国际象棋是一种已经存在了一段时间的游戏。它不像 csgo 或 valorant w/c 是相对较新的。我真的没有看到任何一点 A - 自己查找如何从网站中提取数据作为自己手动输入的替代方法,当然 B - 自己手动输入它看起来很奇怪,如果还没有现成的方法可以做到这一点。


更新 2:现已修复。请参阅“json”与“预制”。哇。

更新 1:看起来 Mike Steelson 在这里有一个答案,其中代码为

=arrayformula( regexextract(split( substitute(substitute(substitute(getDataJSON(A1;"/games";"/pgn");"[";"");"]";"");"""";"") ;char(10));"\s.*") )

举个例子

https://docs.google.com/spreadsheets/d/1MX1o5qdy0K3gTMzbimUV3SmFf-0XPCSJ8Vz4IjI-8Ak/copy

仅涉及 chess960 的情况似乎存在问题。例如考虑这个玩家:用玩家的用户名替换'gmwso'会产生奇怪的输出。我想混合 chess960 和国际象棋的输出会更混乱。

4

2 回答 2

1

在 Chess.SE 上的答案副本,以防有人在这里寻找答案。


是的,可以获得您想要的数据。Chess.com 有一个 REST API,在以下新闻文章中进行了描述:

https://www.chess.com/news/view/published-data-api

您可以使用以下 URL 获取玩家游戏的每月存档列表:

https://api.chess.com/pub/player/{username}/games/archives

在此列表中,您将找到如下所示的 URL:

https://api.chess.com/pub/player/{username}/games/{YYYY}/{MM}

如果附加/pgn到此 URL,您将获得 PGN 格式的所有游戏,这可能更易于解析。

让我们看一个例子:

https://api.chess.com/pub/player/magnuscarlsen/games/2018/01/pgn

在这里,您可以找到 Magnus Carlsen 在 2018 年 1 月玩的游戏。此列表包含一些 Chess960 游戏,它们由以下标签标识:

[Variant "Chess960"]

以下标签将为您提供游戏的 UTC 日期和时间以及当时的玩家评分:

[UTCDate "2018.01.03"]
[UTCTime "21:50:55"]
[WhiteElo "2706"]
[BlackElo "2940"]

Lichess 还有一个下载游戏的 API,我已经在这里描述过。

代码

下面是一些简单的 Kotlin 代码来提取数据(您需要更改文件和用户名):

import java.io.File

fun main() {
    val data = (File("ChessCom_magnuscarlsen_201801.pgn").readText().trim().split("\n\n\n").map {
        it.split('\n').filter { it.startsWith('[') }.map {
            val t = it.replace(Regex("[\\[\\]]"), "").split(' ', limit = 2)
            t[0] to t[1]
        }.toMap()
    })
    data.forEach {
        if (it["Variant"] == "\"Chess960\"") {
            println("${it["UTCDate"]} ${it["UTCTime"]} ${it[if (it["White"] == "\"MagnusCarlsen\"") "WhiteElo" else "BlackElo"]}")
        }
    }
}

结果:

"2018.01.03" "21:50:55" "2706"
"2018.01.03" "21:09:41" "2727"
"2018.01.03" "19:43:22" "2703"
于 2021-05-01T10:06:33.490 回答
-1

好的,我想出了一种只用记事本和命令提示符(和 java/jar)来输出 Sleafar 的方法

这是基于在 Windows cmd 中运行 Kotlin(以及如何在 Windows 上下载和安装 Kotlin,但可能所有内容都已在视频中):

  1. 例如,创建一个 .kt(不是 .kts!)文件,例如 extractgames.kt C:\Users\user(参见下面的 (A))

  2. 打开 cmd(命令提示符),然后如果需要运行cd "C:\Users\user"以更改目录。

  3. kotlinc extractgames.kt -include-runtime -d extractgames.jar

  4. java -jar extractgames.jar


(A)上面的(1),我猜代码看起来像

import java.io.File

fun main() {
    val data = (File("[insert full directory here and remove rectangular brackets. you may or may not need the \\ instead of just \]").readText().trim().split("\n\n\n").map {
        it.split('\n').filter { it.startsWith('[') }.map {
            val t = it.replace(Regex("[\\[\\]]"), "").split(' ', limit = 2)
            t[0] to t[1]
        }.toMap()
    })
    data.forEach {
        if (it["Variant"] == "\"Chess960\"") {
            println("${it["UTCDate"]} ${it["UTCTime"]} ${it[if (it["White"] == "\"[insert username here and remove rectangular brackets. i guess need not be case sensitive. but check for yourself]\"") "WhiteElo" else "BlackElo"]}")
        }
    }
}

更新 2:现已修复。请参阅“json”与“预制”。哇。

更新 1:看起来 Mike Steelson 在这里有一个答案,其中代码为

=arrayformula( regexextract(split( substitute(substitute(substitute(getDataJSON(A1;"/games";"/pgn");"[";"");"]";"");"""";"") ;char(10));"\s.*") )

举个例子

https://docs.google.com/spreadsheets/d/1MX1o5qdy0K3gTMzbimUV3SmFf-0XPCSJ8Vz4IjI-8Ak/copy

仅涉及 chess960 的情况似乎存在问题。例如考虑这个玩家:用玩家的用户名替换'gmwso'会产生奇怪的输出。我想混合 chess960 和国际象棋的输出会更混乱。

于 2021-05-01T14:21:00.573 回答