⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 boards.cpp

📁 c+++ game uploading now
💻 CPP
📖 第 1 页 / 共 3 页
字号:
/**
 @file
 The implementation of different board representations.
*/

/* It looks ugly, it is ugly. This was more or  less generated so do 
** not edit.
*/
#include <cstring>
#include "Boards.h"

using namespace Othello;

Board::Board() 
{
    InitBoard();
    InitPrecomp();
}

void Board::InitBoard()
{
    memcpy(table, sboard, sizeof(sboard));
    isblacksturn=true;
    blacks=2;
    empties=60;
}

bool Board::IsClean() const
{
    for(unsigned int i=p11; i<s89; i++)
        switch(table[i])
        {
        case black:
        case empty:
        case white:
        case sentl:
            continue;
        default:
            return false;
        }
    return true;
}


BookBoard& BookBoard::operator= (const Board& b)
{
    memset(l, 0, 4*sizeof(l[0]));
    isblacksturn=b.isblacksturn;
    
    for(unsigned i=p11; i<s89; i++)
    {
        int x= i / 10;
        int y= i % 10;
        switch(b.table[i])
        {
        case white:
            l[(x-1)/2] |= maskwhite[y-1+8*((x-1)%2)];
            break;
        case black:
            l[(x-1)/2] &= maskblack[y-1+8*((x-1)%2)];
            break;
        case empty:
            l[(x-1)/2] |= maskempty[y-1+8*((x-1)%2)];
            break;
        }
    }
    return *this;
}

int Board::Mul4(int p1, int p2, int p3, int p4)
{
    return 3*(3*(3*table[p1]+table[p2])+table[p3])+table[p4];
}

int Board::Mul5(int p1, int p2, int p3, int p4, int p5)
{
    return 3*(3*(3*(3*table[p1]+table[p2])+table[p3])+table[p4])
           +table[p5];
}

int Board::Mul6(int p1, int p2, int p3, int p4, int p5, int p6)
{
    return 3*(3*(3*(3*(3*table[p1]+table[p2])+table[p3])+table[p4])
           +table[p5])+table[p6];
}

int Board::Mul7(int p1, int p2, int p3, int p4, int p5, int p6, int p7)
{
    return 3*(3*(3*(3*(3*(3*table[p1]+table[p2])+table[p3])+table[p4])
           +table[p5])+table[p6])+table[p7];
}

int Board::Mul8(int p1, int p2, int p3, int p4, int p5, int p6, int p7, int p8)
{
    return 3*(3*(3*(3*(3*(3*(3*table[p1]+table[p2])+table[p3])+table[p4])
           +table[p5])+table[p6])+table[p7])+table[p8];
}

void Board::Syncronize()
{
    //pattern 4
    diag4A1D= Mul4(p41, p32, p23, p14);
    diag5A8D= Mul4(p51, p62, p73, p84);
    diag4H1E= Mul4(p48, p37, p26, p15);
    diag5H8E= Mul4(p58, p67, p76, p85);

    //pattern 5
    diag5A1E= Mul5(p51, p42, p33, p24, p15);
    diag4A8E= Mul5(p41, p52, p63, p74, p85);
    diag5H1D= Mul5(p58, p47, p36, p25, p14);
    diag4H8D= Mul5(p48, p57, p66, p75, p84);
    
    //pattern 6
    diag6A1F= Mul6(p61, p52, p43, p34, p25, p16);
    diag3A8F= Mul6(p31, p42, p53, p64, p75, p86);
    diag3H8C= Mul6(p38, p47, p56, p65, p74, p83);
    diag6H1C= Mul6(p68, p57, p46, p35, p24, p13);

    //pattern 7
    diag7A1G= Mul7(p71, p62, p53, p44, p35, p26, p17);
    diag2A8G= Mul7(p21, p32, p43, p54, p65, p76, p87);
    diag2H8B= Mul7(p28, p37, p46, p55, p64, p73, p82);
    diag7H1B= Mul7(p78, p67, p56, p45, p34, p23, p12);

    //pattern 8
    diag1A8H= Mul8(p11, p22, p33, p44, p55, p66, p77, p88);
    diag8A1H= Mul8(p81, p72, p63, p54, p45, p36, p27, p18);
    
    line1= Mul8(p11, p12, p13, p14, p15, p16, p17, p18);
    line2= Mul8(p21, p22, p23, p24, p25, p26, p27, p28);
    line3= Mul8(p31, p32, p33, p34, p35, p36, p37, p38);
    line4= Mul8(p41, p42, p43, p44, p45, p46, p47, p48);
    line5= Mul8(p51, p52, p53, p54, p55, p56, p57, p58);
    line6= Mul8(p61, p62, p63, p64, p65, p66, p67, p68);
    line7= Mul8(p71, p72, p73, p74, p75, p76, p77, p78);
    line8= Mul8(p81, p82, p83, p84, p85, p86, p87, p88);

    colA= Mul8(p11, p21, p31, p41, p51, p61, p71, p81);
    colB= Mul8(p12, p22, p32, p42, p52, p62, p72, p82);
    colC= Mul8(p13, p23, p33, p43, p53, p63, p73, p83);
    colD= Mul8(p14, p24, p34, p44, p54, p64, p74, p84);
    colE= Mul8(p15, p25, p35, p45, p55, p65, p75, p85);
    colF= Mul8(p16, p26, p36, p46, p56, p66, p76, p86);
    colG= Mul8(p17, p27, p37, p47, p57, p67, p77, p87);
    colH= Mul8(p18, p28, p38, p48, p58, p68, p78, p88);

    //2x4 corners
    cornA1D2= Mul8(p11, p12, p13, p14, p21, p22, p23, p24);
    cornA1B4= Mul8(p11, p21, p31, p41, p12, p22, p32, p42);
    cornA8B5= Mul8(p81, p71, p61, p51, p82, p72, p62, p52);
    cornA8D7= Mul8(p81, p82, p83, p84, p71, p72, p73, p74);
    cornH8E7= Mul8(p88, p87, p86, p85, p78, p77, p76, p75);
    cornH8G5= Mul8(p88, p78, p68, p58, p87, p77, p67, p57);
    cornH1G4= Mul8(p18, p28, p38, p48, p17, p27, p37, p47);
    cornH1E2= Mul8(p18, p17, p16, p15, p28, p27, p26, p25);
    
    empties=0;
    blacks=0;
    for(unsigned int i=p11; i<s89; i++)
    {
        switch(table[i])
        {
        case empty:
            empties++;
            break;
        case black:
            blacks++;
            break;
        }
    }
}

#if !defined NDEBUG
//debug
bool Board::AssertIsInSync()
{
    //pattern 4
    assert(diag4A1D== Mul4(p41, p32, p23, p14));
    assert(diag5A8D== Mul4(p51, p62, p73, p84));
    assert(diag4H1E== Mul4(p48, p37, p26, p15));
    assert(diag5H8E== Mul4(p58, p67, p76, p85));

    //pattern 5
    assert(diag5A1E== Mul5(p51, p42, p33, p24, p15));
    assert(diag4A8E== Mul5(p41, p52, p63, p74, p85));
    assert(diag5H1D== Mul5(p58, p47, p36, p25, p14));
    assert(diag4H8D== Mul5(p48, p57, p66, p75, p84));
    
    //pattern 6
    assert(diag6A1F== Mul6(p61, p52, p43, p34, p25, p16));
    assert(diag3A8F== Mul6(p31, p42, p53, p64, p75, p86));
    assert(diag3H8C== Mul6(p38, p47, p56, p65, p74, p83));
    assert(diag6H1C== Mul6(p68, p57, p46, p35, p24, p13));

    //pattern 7
    assert(diag7A1G== Mul7(p71, p62, p53, p44, p35, p26, p17));
    assert(diag2A8G== Mul7(p21, p32, p43, p54, p65, p76, p87));
    assert(diag2H8B== Mul7(p28, p37, p46, p55, p64, p73, p82));
    assert(diag7H1B== Mul7(p78, p67, p56, p45, p34, p23, p12));

    //pattern 8
    assert(diag1A8H== Mul8(p11, p22, p33, p44, p55, p66, p77, p88));
    assert(diag8A1H== Mul8(p81, p72, p63, p54, p45, p36, p27, p18));
    
    assert(line1== Mul8(p11, p12, p13, p14, p15, p16, p17, p18));
    assert(line2== Mul8(p21, p22, p23, p24, p25, p26, p27, p28));
    assert(line3== Mul8(p31, p32, p33, p34, p35, p36, p37, p38));
    assert(line4== Mul8(p41, p42, p43, p44, p45, p46, p47, p48));
    assert(line5== Mul8(p51, p52, p53, p54, p55, p56, p57, p58));
    assert(line6== Mul8(p61, p62, p63, p64, p65, p66, p67, p68));
    assert(line7== Mul8(p71, p72, p73, p74, p75, p76, p77, p78));
    assert(line8== Mul8(p81, p82, p83, p84, p85, p86, p87, p88));

    assert(colA== Mul8(p11, p21, p31, p41, p51, p61, p71, p81));
    assert(colB== Mul8(p12, p22, p32, p42, p52, p62, p72, p82));
    assert(colC== Mul8(p13, p23, p33, p43, p53, p63, p73, p83));
    assert(colD== Mul8(p14, p24, p34, p44, p54, p64, p74, p84));
    assert(colE== Mul8(p15, p25, p35, p45, p55, p65, p75, p85));
    assert(colF== Mul8(p16, p26, p36, p46, p56, p66, p76, p86));
    assert(colG== Mul8(p17, p27, p37, p47, p57, p67, p77, p87));
    assert(colH== Mul8(p18, p28, p38, p48, p58, p68, p78, p88));

    assert(cornA1D2==Mul8(p11, p12, p13, p14, p21, p22, p23, p24));
    assert(cornA1B4==Mul8(p11, p21, p31, p41, p12, p22, p32, p42));
    assert(cornA8B5==Mul8(p81, p71, p61, p51, p82, p72, p62, p52));
    assert(cornA8D7==Mul8(p81, p82, p83, p84, p71, p72, p73, p74));
    assert(cornH8E7==Mul8(p88, p87, p86, p85, p78, p77, p76, p75));
    assert(cornH8G5==Mul8(p88, p78, p68, p58, p87, p77, p67, p57));
    assert(cornH1G4==Mul8(p18, p28, p38, p48, p17, p27, p37, p47));
    assert(cornH1E2==Mul8(p18, p17, p16, p15, p28, p27, p26, p25));

    unsigned int empties_=0;
    unsigned int blacks_=0;
    for(unsigned int i=p11; i<s89; i++)
    {
        switch(table[i])
        {
        case empty:
            empties_++;
            break;
        case black:
            blacks_++;
            break;
        }
    }
    assert(empties==empties_);
    assert(blacks==blacks_);

    return true;
}

#include <windows.h>
void Board::DebugPrintBoard(int x)
{
    ::OutputDebugString(isblacksturn?"Black's move\n":"White's move\n");
    for(int i=p11; i<s89; i++)
    {
        switch(table[i])
        {
        case black:
            if(x==i)
                ::OutputDebugString("B");
            else
                ::OutputDebugString("b");
            break;
        case white:
            if(x==i)
                ::OutputDebugString("W");
            else
                ::OutputDebugString("w");
            break;
        case empty:
            if(x==i)
                ::OutputDebugString("*");
            else
                ::OutputDebugString(".");
            break;
        }
        if(i%10==0)
            ::OutputDebugString("\n");
    }
    ::OutputDebugString("\n\n");
}

#endif //NDEBUG

signed char TTBoard::Persil[10*10]=
{
    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
    -1, 0, 1, 2, 3, 4, 5, 6, 7,-1,
    -1, 8, 9,10,11,12,13,14,15,-1,
    -1,16,17,18,19,20,21,22,23,-1,
    -1,24,25,26,27,28,29,30,31,-1,
    -1,32,33,34,35,36,37,38,39,-1,
    -1,40,41,42,43,44,45,46,47,-1,
    -1,48,49,50,51,52,53,54,55,-1,
    -1,56,57,58,59,60,61,62,63,-1,

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -