Esempio n. 1
0
def legals():
    mvs = legal.moves()
    for mv in mvs:
        if board.whiteToMove():
            print "%s %s" % (move.num(mv), san.pr(mv, mvs))
        else:
            print "%s ...%s" % (move.num(mv), san.pr(mv, mvs))
Esempio n. 2
0
def wtrialpawn(h, sq):
    assert board.whiteToMove()
    assert h == len(board.history)
    assert board.manAt(sq) == man.pawn
    global mvs
    # pawn may move 2 squares on first move
    if rank(sq) == 2 and board.empty(fwd(sq)) and board.empty(fwd(fwd(sq))):
        mvs.append((h, "-", sq, fwd(fwd(sq))))
    # pawn moves only one square fwd if beyond original position and square is empty
    if rank(sq) < 7:
        if board.manAt(fwd(sq)) == 0:
            mvs.append((h, "-", sq, fwd(sq)))
        if man.isBlack(board.manAt(dfr(sq))):
            mvs.append((h, "x", sq, dfr(sq), board.manAt(dfr(sq))))
        if man.isBlack(board.manAt(dfl(sq))):
            mvs.append((h, "x", sq, dfl(sq), board.manAt(dfl(sq))))
    # pawn promotes on reaching last rank
    if rank(sq) == 7:
        if board.manAt(fwd(sq)) == 0:
            for pmn in [man.queen, man.rook, man.bishop, man.knight]:
                mvs.append((h, "-/", sq, fwd(sq), 0, pmn))
        if man.isBlack(board.manAt(dfr(sq))):
            for pmn in [man.queen, man.rook, man.bishop, man.knight]:
                mvs.append((h, "x/", sq, dfr(sq), board.manAt(dfr(sq)), pmn))
        if man.isBlack(board.manAt(dfl(sq))):
            for pmn in [man.queen, man.rook, man.bishop, man.knight]:
                mvs.append((h, "x/", sq, dfl(sq), board.manAt(dfl(sq)), pmn))
    # en passant
    if len(board.history) > 0:
        mv = board.lastMove()
        if tag(mv) == "-" and board.manAt(nsq(mv)) == -man.pawn and rank(
                osq(mv)) == 7 and rank(nsq(mv)) == 5:
            if nsq(mv) in [rgt(sq), lft(sq)]:
                mvs.append((h, "xep", sq, fwd(nsq(mv))))
Esempio n. 3
0
def moves():
    assert manAt(board.whiteKingAt) == king
    assert manAt(board.blackKingAt) == -king
    legalmoves = []
    for mv in trial.trialmoves():
        if not (move.tag(mv) in ["OO","OOO"]) and man.isKing(manAt(move.nsq(mv))):
            print "legal.19: mv=",mv
            board.dump()
        move.make(mv)
        assert manAt(board.whiteKingAt) == king
        assert manAt(board.blackKingAt) == -king
        if board.blackToMove():
            if move.isOO(mv):
                if not blackAttacks(e1) and not blackAttacks(f1) and not blackAttacks(g1):
                    legalmoves.append(mv)
            elif move.isOOO(mv):
                if not blackAttacks(e1) and not blackAttacks(d1) and not blackAttacks(c1):
                    legalmoves.append(mv)
            elif not blackAttacks(board.whiteKingAt):
                legalmoves.append(mv)
        elif board.whiteToMove():
            if move.isOO(mv):
                if not whiteAttacks(e8) and not whiteAttacks(f8) and not whiteAttacks(g8):
                    legalmoves.append(mv)
            elif move.isOOO(mv):
                if not whiteAttacks(e8) and not whiteAttacks(d8) and not whiteAttacks(c8):
                    legalmoves.append(mv)
            elif not whiteAttacks(board.blackKingAt):
                legalmoves.append(mv)
        move.umake(mv)
    assert manAt(board.whiteKingAt) == king
    assert manAt(board.blackKingAt) == -king
    assert noKingCapture(legalmoves) # you never see a king captured in any legal move
    return legalmoves
Esempio n. 4
0
def best(mvlist):
    global t0
    if board.whiteToMove():
        alpha = -inf
        for mv in mvlist:
            move.make(mv)
            t0 = time.clock()
            #score = max(score,itterative_deepening())
            #score = itterative_deepening()
            score = MDTF(0, depth + 1)
            if score > alpha:
                bestmv, alpha = mv, score
            move.umake(mv)
            print score, san.pr(mv, mvlist)
        return bestmv, alpha, 0, 0  # the 0,0 are just dummy placeholder values
    else:
        assert board.blackToMove()
        beta = inf
        for mv in mvlist:
            move.make(mv)
            t0 = time.clock()
            #score = min(score,itterative_deepening())
            #score = itterative_deepening()
            score = MDTF(0, depth + 1)
            if score < beta:
                bestmv, beta = mv, score
            move.umake(mv)
            print score, san.pr(mv, mvlist)
        return bestmv, beta, 0, 0  # the 0,0 are just a dummy placeholder values
Esempio n. 5
0
def moves():
    assert manAt(board.whiteKingAt) == king
    assert manAt(board.blackKingAt) == -king
    legalmoves = []
    for mv in trial.trialmoves():
        make(mv)
        assert manAt(board.whiteKingAt) == king
        assert manAt(board.blackKingAt) == -king
        if blackToMove():
            if isOO(mv):
                if not blackAttacks(e1) and not blackAttacks(f1) and not blackAttacks(g1):
                    legalmoves.append(mv)
            elif isOOO(mv):
                if not blackAttacks(e1) and not blackAttacks(d1) and not blackAttacks(c1):
                    legalmoves.append(mv)
            elif not blackAttacks(board.whiteKingAt):
                legalmoves.append(mv)
        elif whiteToMove():
            if isOO(mv):
                if not whiteAttacks(e8) and not whiteAttacks(f8) and not whiteAttacks(g8):
                    legalmoves.append(mv)
            elif isOOO(mv):
                if not whiteAttacks(e8) and not whiteAttacks(d8) and not whiteAttacks(c8):
                    legalmoves.append(mv)
            elif not whiteAttacks(board.blackKingAt):
                legalmoves.append(mv)
        umake(mv)
    assert manAt(board.whiteKingAt) == king
    assert manAt(board.blackKingAt) == -king
    assert noKingCapture(legalmoves) # you never see a king captured in any legal move
    return legalmoves
Esempio n. 6
0
def mybest_static(silent=False):
    mvlist = legal.moves()
    if len(mvlist) > 0:
        if board.whiteToMove():
            mv, score = best.forWhite(mvlist)
        else:
            mv, score = best.forBlack(mvlist)
        if not silent:
            if move.color(mv) == 'white':
                msg = "After %s %s [%s]" % (move.num(mv), san.pr(
                    mv, mvlist), score)
            else:
                msg = "After %s ...%s [%s]" % (move.num(mv), san.pr(
                    mv, mvlist), score)
        move.make(mv)
        if not silent:
            print msg
            auto()
        if verbose:
            board.dump()
            assert board.valid()  # aggressive validation
        return True
    else:
        print "no moves"
        return False
Esempio n. 7
0
def state(legals):
    if len(legals)==0:
        if blackToMove() and whiteAttacks(board.blackKingAt):
            return 'whiteMates'
        elif whiteToMove() and blackAttacks(board.whiteKingAt):
            return 'blackMates'
        else:
            return 'stalemate'
    else:
        return 'continue'
Esempio n. 8
0
def best(mvlist):
    assert len(mvlist) > 0
    assert depth1 > 0
    if board.whiteToMove():
        mvlist.sort(cmp)
        b, s, cnt, t01, ln = bestForWhite(mvlist, depth1)
    else:
        mvlist.sort(cmp)
        b, s, cnt, t01, ln = bestForBlack(mvlist, depth1)
    return b, s, cnt, t01
Esempio n. 9
0
def mate(legals):
    assert False # do not call
    if len(legals)==0:
        if board.blackToMove() and attack.whiteAttacks(board.blackKingAt):
            return True
        elif board.whiteToMove() and attack.blackAttacks(board.whiteKingAt):
            return True
        else:
            return False
    else:
        return False
Esempio n. 10
0
def report_result():
    assert len(legal.moves()) == 0
    if board.whiteToMove():
        if blackAttacks(board.whiteKingAt):
            put_result("1-0", "black mates")
        else:
            put_result("1/2-1/2", "stalemate")
    else:
        assert board.blackToMove()
        if whiteAttacks(board.blackKingAt):
            put_result("0-1", "white mates")
        else:
            put_result("1/2-1/2", "stalemate")
Esempio n. 11
0
def AlphaBetaWithMemory(alpha, beta, d):
    if TT.has_key(board.hash):
        lowerbound, upperbound = TT[board.hash]
        if lowerbound >= beta:
            return lowerbound
        if upperbound <= alpha:
            return upperbound
        alpha = max(alpha, lowerbound)
        beta = min(beta, upperbound)
    if d == 0:
        g = static.eval()
    elif board.whiteToMove():
        g, a = -inf, alpha  # save original alpha value
        for mv in legal.moves():
            if g >= beta:
                break
            move.make(mv)
            g = max(g, AlphaBetaWithMemory(a, beta, d - 1))
            move.umake(mv)
            a = max(a, g)
    else:
        assert board.blackToMove()
        g, b = +inf, beta  #save original beta value
        for mv in legal.moves():
            if g <= alpha:
                break
            move.make(mv)
            g = min(g, AlphaBetaWithMemory(alpha, b, d - 1))
            move.umake(mv)
    # transition table storing of bounds
    # fail low implies an upper bound
    if g <= alpha:
        if TT.has_key(board.hash):
            lower, upper = TT[board.hash]
        else:
            lower, upper = -inf, +inf
        TT[board.hash] = lower, g
    # found an accurate minimax value - will not occur if called with zero window
    if g > alpha and g < beta:
        TT[board.hash] = g, g
    # fail high result implies a lower bound
    if g > beta:
        if TT.has_key(board.hash):
            lower, upper = TT[board.hash]
        else:
            lower, upper = -inf, +inf
        TT[board.hash] = g, upper
    return g
Esempio n. 12
0
def wtrialbishop(h, sq):
    assert board.whiteToMove()
    assert h == len(board.history)
    assert board.manAt(sq) == man.bishop
    global mvs
    for dir in [dfr, dfl, dbr, dbl]:
        s = dir(sq)
        done = False
        while not s == None and not done:
            if board.empty(s):
                mvs.append((h, "-", sq, s))
                s = dir(s)
            elif man.isBlack(board.manAt(s)):
                mvs.append((h, "x", sq, s, board.manAt(s)))
                done = True
            elif man.isWhite(board.manAt(s)):
                done = True
Esempio n. 13
0
def wtrialrook(h, sq):
    assert board.whiteToMove()
    assert h == len(board.history)
    assert board.manAt(sq) == man.rook
    global mvs
    for dir in [fwd, rgt, bak, lft]:
        s = dir(sq)
        done = False
        while not s == None and not done:
            if board.empty(s):
                mvs.append((h, "-", sq, s))
                s = dir(s)
            elif man.isBlack(board.manAt(s)):
                mvs.append((h, "x", sq, s, board.manAt(s)))
                done = True
            elif man.isWhite(board.manAt(s)):
                done = True
Esempio n. 14
0
def wtrialking(h, sq):
    assert board.whiteToMove()
    assert h == len(board.history)
    assert board.manAt(sq) == man.king
    global mvs
    for dir in [fwd, dfr, rgt, dbr, bak, dbl, lft, dfl]:
        s = dir(sq)
        if board.empty(s):
            mvs.append((h, "-", sq, s))
        elif man.isBlack(board.manAt(s)):
            mvs.append((h, "x", sq, s, board.manAt(s)))
        elif man.isWhite(board.manAt(s)):
            pass
    if board.whiteAllowOO and board.empty(f1) and board.empty(g1):
        mvs.append((h, "OO", e1))
    if board.whiteAllowOOO and board.empty(d1) and board.empty(
            c1) and board.empty(b1):
        mvs.append((h, "OOO", e1))
Esempio n. 15
0
def wtrialknight(h, sq):
    assert board.whiteToMove()
    assert h == len(board.history)
    assert board.manAt(sq) == man.knight
    global mvs
    for s in [
            dfr(fwd(sq)),
            dfr(rgt(sq)),
            dbr(rgt(sq)),
            dbr(bak(sq)),
            dbl(bak(sq)),
            dbl(lft(sq)),
            dfl(lft(sq)),
            dfl(fwd(sq))
    ]:
        if board.empty(s):
            mvs.append((h, "-", sq, s))
        if man.isBlack(board.manAt(s)):
            mvs.append((h, "x", sq, s, board.manAt(s)))
Esempio n. 16
0
def wtrialqueen(h, sq):
    assert board.whiteToMove()
    assert h == len(board.history)
    assert board.manAt(sq) == man.queen
    global mvs
    for dir in [fwd, rgt, bak, lft, dfr, dfl, dbr, dbl]:
        s = dir(sq)
        done = False
        while not s == None and not done:
            if board.empty(s):
                mvs.append((h, "-", sq, s))
                s = dir(s)
            elif man.isBlack(board.manAt(s)):
                mvs.append((h, "x", sq, s, board.manAt(s)))
                done = True
            elif man.isWhite(board.manAt(s)):
                done = True
            else:
                print "error in wtrialqueen"
                sys.exit(1)
Esempio n. 17
0
def wtrials(h, sqset):
    assert board.whiteToMove()
    assert h == len(board.history)
    global mvs
    mvs = []
    for sq in sqset:
        assert man.isWhite(board.manAt(sq))
        if board.manAt(sq) == man.pawn:
            wtrialpawn(h, sq)
        elif board.manAt(sq) == man.knight:
            wtrialknight(h, sq)
        elif board.manAt(sq) == man.bishop:
            wtrialbishop(h, sq)
        elif board.manAt(sq) == man.rook:
            wtrialrook(h, sq)
        elif board.manAt(sq) == man.queen:
            wtrialqueen(h, sq)
        elif board.manAt(sq) == man.king:
            wtrialking(h, sq)
        else:
            print "wtrials: square not occupied"
    return mvs
Esempio n. 18
0
def reply():
    global playing
    assert playing
    mvs = legal.moves()
    if len(mvs) > 0:
        mv = random.choice(mvs)
        s = san.pr(mv, mvs)  # use a different notation
        put_move(s)
        move.make(mv)
    else:
        assert len(mvs) == 0
        playing = False
        if board.whiteToMove():
            if blackAttacks(board.whiteKingAt):
                put_result("1-0", "white checkmated")
            else:
                put_result("1/2-1/2", "stalemate")
        else:
            assert board.blackToMove()
            if whiteAttacks(board.blackKingAt):
                put_result("0-1", "black checkmated")
            else:
                put_result("1/2-1/2", "stalemate")
Esempio n. 19
0
        if lowerbound >= upperbound:
            break
    return g,line

def AlphaBetaWithMemory(alpha,beta,d,line)
    if TT.has_key(board.hash):
        lowerbound,upperbound,cont = TT[board.hash]
        if lowerbound >= beta:
            return lowerbound,line+cont
        if upperbound <= alpha:
            return upperbound,line+cont
        alpha = max(alpha,lowerbound)
        beta = min(beta,upperbound) 
    if d==0:
        g = static.eval()
    elif board.whiteToMove():
        g,a,nline = -inf,alpha,line  # save original alpha value
        for mv in legal.moves():
            if g >= beta:
                break
            move.make(mv)
            g,nline = max(g,AlphaBetaWithMemory(a,beta,d-1,line+[mv]))
            move.umake(mv)
            a = max(a,g)
    else:
        assert board.blackToMove()
        g,b,nline = +inf,beta,line  #save original beta value
        for mv in legal.moves():
            if g <= alpha:
                break
            move.make(mv)
Esempio n. 20
0
def trialmoves():
    if board.whiteToMove():
        return wtrials(len(board.history), board.whiteMen)
    else:
        return btrials(len(board.history), board.blackMen)
Esempio n. 21
0
def toMove():
    if board.whiteToMove():
        return 'white'
    else:
        return 'black'
Esempio n. 22
0
def prActiveColor():
    if board.whiteToMove():
        return "w"
    else
        return "b"