当前位置: 首页 > 知识库问答 >
问题:

使用pgns创建游戏资源管理器(如lichess Explorer)

佴普松
2023-03-14

目前,我正在用python做一个失败的“ia”,它给了我一个最小最大成功率(使用lichess数据库的大师级部分)最好的开场,并且只采取至少已经打了100个位置的动作,这样就不会在一场比赛中落在100%的黑人成功率上。我设法用lichess api做到了这一点,问题是当我请求超过3个深度时,lichess会因为api上生成的垃圾邮件而阻止我。

我告诉自己,我要做同样的事情,但不是使用无衣api,我要使用一个. pgns的大师部分和库"国际象棋",我可以做类似的事情,但目前我被阻止如何通过示例"e2-e4"过滤这个文件,并有每一步的成功率,并有一个递归函数来探索这个文件。

我找不到一个征集通过国际象棋-py文档和我的谷歌搜索没有拿出任何东西。

有人有主意吗?

api lichess:https://lichess.org/api#tag/Opening-探险家

png文件:https://odysee.com/@Toadofsky:b/巫妖精英数据库:b

共有2个答案

艾英范
2023-03-14

下面是一个@fougueux的例子(我没有想过用这个文件创建一个数据库,我错过了“erd”代码,这正是我需要的)

填写数据库(dbname=“game”、行id、行fen、行结果)

import json
import requests
import chess
import chess.pgn
import chess.polyglot

import pymysql


pgn = open('C:/Users/pierr/OneDrive/Bureau/lichess_elite_2020-05.pgn')
result = []

while True:
    game = chess.pgn.read_game(pgn)
    if game is not None:
        board = game.board()
        for move in game.mainline_moves():
            board.push(move)
            result.append([board.epd(), game.headers["Result"]])
    else: 
        break

connection = pymysql.connect(host='localhost',
                             user='root',
                             password='',
                             database='chess-master',
                             cursorclass=pymysql.cursors.DictCursor)

with connection:
    with connection.cursor() as cursor:
        # Create a new record
        for i in result:
            sql = "INSERT INTO `game` (`fen`, `result`) VALUES (%s, %s)"
            cursor.execute(sql, (i[0], i[1]))

以及搜索最小最大分数的算法(分数=%winrate white*1,%winrate black*0,%winrate draw*0.5),他用100多个移动游戏进行移动

import json
import requests
import chess
import chess.pgn
import chess.polyglot

board = chess.Board()

def parcourir(board, depth, traitblanc):
    
    scorelist = []
    
    for move in board.legal_moves:
        board.push(move)
                   
        url = 'http://localhost/chess-master/?fen='
        url += board.epd() # fen
        
        r = requests.get(url)
        data  = json.loads(r.text)
        
        somme = int(data[0]['COUNT(result)']) + int(data[1]['COUNT(result)']) + int(data[2]['COUNT(result)'])
       
        if(somme > 100):  
            score = (int(data[0]['COUNT(result)']) * 1) + (int(data[1]['COUNT(result)']) * 0) + (int(data[2]['COUNT(result)']) * 0.5)
            scorelist.append(score)

        board.pop()
        
    if(depth != 0):
        score = []
        for move in board.legal_moves:

            board.push(move)
            score.append(parcourir(board, depth-1, not traitblanc))
            board.pop()
            
    if(traitblanc):
        if(not scorelist):
            return -100
        return max(scorelist)
    else:
        if(not scorelist):
            return 100
        return min(scorelist)
    
print (parcourir(board, 1, True))

与php比python更舒适,我通过以下代码选择了fen:

<?php
    $servername = "localhost";
    $username = "root";
    $password = "";
    $dbname = "chess-master";
    
    $doCount = array("1-0","0-1","1/2-1/2");
    
    // Create connection
    $conn = new mysqli($servername, $username, $password, $dbname);

    $results = array();
    
    foreach($doCount as $c) {
        
        $sql = "SELECT COUNT(result) FROM `game` WHERE fen = '".$_GET['fen']."' and result = '".$c."'";
        $result = $conn->query($sql);
        while($row = $result->fetch_assoc()) {
            $results[] = $row;
            #print_r($row);
        }
    
    }   
    echo json_encode($results)
?>

谢谢你的帮助:)

袁卓
2023-03-14

一种方法是建立一个类似mongoDB的数据库

1. Read each game in the pgn file.
2. Record the epd after every move in the game.
3. Get the result of this game.
4. Record white_win, white_loss, white_draw, black_win, black_loss, black_draw, num_game.
5. Save/update to database the following info.
{
  "epd": <epd> 
  "white_win": ...,
  "white_loss": ..., 
  "...": ...
}

现在,你可以通过环保署查询数据库,得到其中的信息。

例如,可以使用python国际象棋库解析pgn文件中的每一个游戏。

首先将其保存到数据库的优点是,当您稍后进行查询时,会很快得到结果。

如果你不喜欢把它保存在数据库中,你可以这样做,但是如果文件很大,可能会很贵。你仍然可以使用上面的算法。

 类似资料:
  • 我试图完全清理资源组在Azure。 删除资源组不是选项(访问权限:参与者,而不是所有者) 做到这一点的最优雅和明显的方法(也在一些文章中描述)是使用“空”部署模板执行完整的部署: 删除SQL Server开始“...”接受“...”失败“...”开始“...”接受“...”失败“... 你想到主意了。 其他时候效果很好。 您将得到数据库删除的无限循环“开始..接受..失败..开始..接受..失败.

  • 资源管理器 是我们用来访问和管理项目资源的工作区域。在开始制作游戏时,添加资源到这里通常是必须的步骤。您可以使用 HelloWorld 模板新建一个项目,就可以看到 资源管理器 中包含了一些基本资源类型。 界面介绍 资源管理器 将项目资源文件夹中的内容以树状结构展示出来,注意只有放在项目文件夹的 assets 目录下的资源才会显示在这里。关于项目文件夹结构说明请阅读 项目结构 一节。下面我们介绍各

  • 资源管理器 面板是我们用来访问和管理项目资源的重要工具。 在开始制作游戏时,导入资源 通常是必须的步骤。您可以在新建项目时使用模板项目,新建步骤完成后会自动打开项目,默认布局中包含了 资源管理器 面板,里面有两个资源库,简称 DB,assets 和 internal, internal 属于默认的内置资源,内置资源可以复制出来,但不能直接修改。 面板操作预览 面板介绍 资源管理器 面板上主要有 头

  • 我正在使用Drowpizard 0.7.1,但也许我会很快升级到0.8.4。 是否有人知道如何向dropwizard添加管理员资源,如下面示例中的操作菜单所示?

  • 问题内容: 我正在尝试为xlib窗口创建游戏循环,但是无法正确绘制该窗口。现在,我正在使用XCreateSimpleWindow(…)创建一个窗口,并使用for循环一次绘制所有像素。(这些像素的颜色是从一个大的整数数组中读取的,现在,我将所有像素设置为蓝色。)现在,实际的游戏循环如下: 全局定义了变量dsp,win,pixels,gc。 现在,当我编译并执行二进制文件时,y坐标低的行主要是蓝色,而

  • 问题内容: 我准备使用Java创建文件浏览器。目的是尽可能地模仿默认资源管理器的行为,无论底层操作系统是什么。 我没有用Java完成GUI编程。 我查找了Swing,SWT和JFace,并从本教程开始我的项目:http : //www.ibm.com/developerworks/opensource/library/os- ecgui1/ 我想知道您对解决此问题的最佳方法的看法。如果您可以评论编