কীভাবে একটি বিটবোর্ড দিয়ে দাবা রাষ্ট্রের প্রতিনিধিত্ব করবেন


11

আমি একটি দাবা ইঞ্জিন প্রোগ্রামিং এবং গেমের অবস্থা প্রতিনিধিত্ব করতে বিটবোর্ডগুলি ব্যবহার করতে আগ্রহী। আমি জানি যে কয়েকটি ওপেন সোর্স দাবা ইঞ্জিন রয়েছে যা বিটবোর্ড ব্যবহার করে, তবে কোডটি দেখতে এবং কী চলছে তা বুঝতে এটি এত সহজ নয়। আমি কীভাবে বিটবোর্ডে সমস্ত রাজ্যের প্রতিনিধিত্ব করতে পারি তার জন্য ভাল রেফারেন্স উপাদান খুঁজছি।

কীভাবে বিটবোর্ডগুলি ব্যবহার করে গেমের পরিস্থিতি বজায় রাখা যায় এবং বিশেষত কোনও প্রদত্ত বিটবোর্ড থেকে বৈধ পদক্ষেপের একটি তালিকা কীভাবে তৈরি করা যায় বা এই ধরণের ব্যাখ্যায় ভাল রেফারেন্স সরবরাহ করা আপনাকে সবুজ চেক মার্ক উপার্জন করতে পারে তা স্পষ্টভাবে ব্যাখ্যা করে।


3
1. ওপি বিষয়টির কোনও জ্ঞান দেখায় না। অর্থাৎ ওপি নিজেকে শিক্ষিত করার জন্য গুরুত্ব সহকারে চেষ্টা করেননি। 2. এটি প্রোগ্রামিং সম্পর্কে, দাবা নয়
টনি এনিস

উত্তর:


10

দাবা ইঞ্জিন প্রোগ্রামিংয়ের সর্বোত্তম উত্স হ'ল দাবা প্রোগ্রামিং উইকি , যার বিটবোর্ডগুলিতে একটি বিশাল বিভাগ রয়েছে । আপনার একটি বিটবোর্ড-ভিত্তিক ইঞ্জিন তৈরি করার জন্য প্রয়োজনীয় সমস্ত কিছু সেখানে রয়েছে, যদিও এটি বরং ছড়িয়ে পড়ে এবং কখনও কখনও এমন লোকেরা লিখেছেন যাদের জন্য ইংরেজি দ্বিতীয় ভাষা।


2 টি লিঙ্ক এখন অবৈধ।
জ্যাকসন টেল

1
আমি এখনও এই মন্তব্যটি লেখার সময় পর্যন্ত তারা আমার পক্ষে কাজ করে।
dfan

8

আপনি কোন প্রোগ্রামিং ভাষা ব্যবহার করতে চান?

সি # তে একটি বিটবোর্ড প্রয়োগ করতে, System.UInt64 ব্যবহার করুন । দাবা বোর্ডের প্রতিটি স্কোয়ারের জন্য এটি 64 টি বিট ধারণ করতে পারে। এই মান প্রকারটি অনেকগুলি দ্রুত বিটওয়াইজ অপারেশনগুলিকে leণ দেয়।

এটি একটি ভাল বিটবোর্ড টিউটোরিয়াল

এখানে আমার নিজস্ব সি # দাবা ইঞ্জিনের কয়েকটি উদাহরণ রয়েছে। আপনি কোড থেকে দেখতে পাচ্ছেন, বিটবোর্ডগুলি ব্যবহার করে আপনার মাথাটি মুড়িয়ে রাখতে কিছুটা সময় নিতে পারে তবে তারা সাধারণত খুব দ্রুত হয়, বিশেষত অবস্থানের মূল্যায়নের জন্য।

উদাহরণ 1 - বিটবোর্ড সংজ্ঞা:

internal UInt64 WhiteKing;
internal UInt64 WhiteQueens;
internal UInt64 WhiteRooks;
internal UInt64 WhiteBishops;
internal UInt64 WhiteKnights;
internal UInt64 WhitePawns;
internal UInt64 WhitePieces;

উদাহরণ 2 - বিটবোর্ড সূচনা:

// Initialise piece bitboards using square contents.
private void InitPieceBitboards()
{
    this.WhiteKing = 0; 
    this.WhiteQueens = 0; 
    this.WhiteRooks = 0; 
    this.WhiteBishops = 0; 
    this.WhiteKnights = 0; 
    this.WhitePawns = 0;

    for (Int16 i = 0; i < 64; i++)
    {
        if (this.Squares[i] == Constants.WHITE_KING)
        {
            this.WhiteKing = this.WhiteKing | Constants.BITSET[i];
        }
        if (this.Squares[i] == Constants.WHITE_QUEEN)
        {
            this.WhiteQueens = this.WhiteQueens | Constants.BITSET[i];
        } 
        if (this.Squares[i] == Constants.WHITE_ROOK) 
        {
            this.WhiteRooks = this.WhiteRooks | Constants.BITSET[i];
        }
        if (this.Squares[i] == Constants.WHITE_BISHOP) 
        {
            this.WhiteBishops = this.WhiteBishops | Constants.BITSET[i];
        }
        if (this.Squares[i] == Constants.WHITE_KNIGHT) 
        {
            this.WhiteKnights = this.WhiteKnights | Constants.BITSET[i];
        }
        if (this.Squares[i] == Constants.WHITE_PAWN) 
        {
            this.WhitePawns = this.WhitePawns | Constants.BITSET[i];
        }

        this.WhitePieces = this.WhiteKing | this.WhiteQueens | 
                           this.WhiteRooks | this.WhiteBishops | 
                           this.WhiteKnights | this.WhitePawns;
        this.BlackPieces = this.BlackKing | this.BlackQueens | 
                           this.BlackRooks | this.BlackBishops | 
                           this.BlackKnights | this.BlackPawns;
        this.SquaresOccupied = this.WhitePieces | this.BlackPieces;
    }
}

উদাহরণ 3 - প্রজন্মের সরান:

// We can't capture one of our own pieces.
eligibleSquares = ~this.WhitePieces;

// Generate moves for white knights.
remainingKnights = this.WhiteKnights;

// Generate the moves for each knight...
while (remainingKnights != 0)
{
    squareFrom = BitOps.BitScanForward(remainingKnights);
    generatedMoves = Constants.ATTACKS_KNIGHT[squareFrom] & eligibleSquares;
    while (generatedMoves != 0)
    {
        squareTo = BitOps.BitScanForward(generatedMoves);
        moveList.Add(new Move(squareFrom, squareTo, Constants.WHITE_KNIGHT, 
                              this.Squares[squareTo], Constants.EMPTY));
        generatedMoves ^= Constants.BITSET[squareTo];
    }
    // Finished with this knight - move on to the next one.
    remainingKnights ^= Constants.BITSET[squareFrom];
}    

উদাহরণ 4 - উপাদান স্কোর গণনা করুন:

// Material score from scratch, in centipawns from White's perspective.
internal static Int32 ScoreMaterial(Board position)
{
    return BitOps.BitCountWegner(position.WhitePawns)   * Constants.VALUE_PAWN +
           BitOps.BitCountWegner(position.WhiteKnights) * Constants.VALUE_KNIGHT +
           BitOps.BitCountWegner(position.WhiteBishops) * Constants.VALUE_BISHOP +
           BitOps.BitCountWegner(position.WhiteRooks)   * Constants.VALUE_ROOK   +
           BitOps.BitCountWegner(position.WhiteQueens)  * Constants.VALUE_QUEEN  -
           BitOps.BitCountWegner(position.BlackPawns)   * Constants.VALUE_PAWN   -
           BitOps.BitCountWegner(position.BlackKnights) * Constants.VALUE_KNIGHT -
           BitOps.BitCountWegner(position.BlackBishops) * Constants.VALUE_BISHOP -
           BitOps.BitCountWegner(position.BlackRooks)   * Constants.VALUE_ROOK   -
           BitOps.BitCountWegner(position.BlackQueens)  * Constants.VALUE_QUEEN;
}

উদাহরণ 5 - টুকরো গতিশীলতার গণনা:

// Calculate mobility score for white knights.
remainingPieces = position.WhiteKnights;
while (remainingPieces != 0)
{
    squareFrom = BitOps.BitScanForward(remainingPieces);
    mobilityKnight += BitOps.BitCountWegner(Constants.ATTACKS_KNIGHT[squareFrom]
                                            & unoccupiedSquares);
    remainingPieces ^= Constants.BITSET[squareFrom];
 }

আপনি মুভলিস্টের সংজ্ঞা দিতে পারেন?
কার্লোস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.