Пример #1
0
 public void DoMove(Puzzle b)
 {
     DoMove(b, r1, c1, r2, c2);
 }
Пример #2
0
 internal void UndoMove(Puzzle b)
 {
     b.board[r1][c1].piece = b.board[r2][c2].piece;
     b.board[r2][c2].piece = captured;
 }
Пример #3
0
        public Move DoMove(Puzzle b, int rFrom, int cFrom, int rTo, int cTo)
        {
            r1 = rFrom;
            c1 = cFrom;
            r2 = rTo;
            c2 = cTo;
            //printf("Target content: %c\n", b.board[rTo][cTo].piece);
            capturer = b.board[rFrom][cFrom].piece;
            captured = b.board[rTo][cTo].piece;
            if (captured == ' ')
            {
                return(null);
            }
            switch (b.board[rFrom][cFrom].piece)
            {
            case 'P':
                if (rTo >= 0 && rTo == rFrom - 1 && cTo >= 0 && cTo < Puzzle.SIZE)
                {
                    Field target = null;
                    if (b.board[rFrom][cFrom].ne.c == cTo)
                    {
                        target = b.board[rFrom][cFrom].ne;
                    }
                    else if (b.board[rFrom][cFrom].nw.c == cTo)
                    {
                        target = b.board[rFrom][cFrom].nw;
                    }
                    else if (b.board[rFrom][cFrom].n.c == cTo && b.board[rFrom][cFrom].n.piece == ' ')
                    {
                        target = b.board[rFrom][cFrom].n;
                    }
                    if (target != null)
                    {
                        target.piece = b.board[rFrom][cFrom].piece;
                        b.board[rFrom][cFrom].piece = ' ';
                        return(this);
                    }
                    return(null);
                }
                break;

            case 'p':
                break;

            case 'n':
            case 'N':
                if (rTo >= 0 && rTo < Puzzle.SIZE && cTo >= 0 && cTo < Puzzle.SIZE)
                {
                    Field target = null;
                    if (b.board[rFrom][cFrom].n.n.e.c == cTo && b.board[rFrom][cFrom].n.n.e.r == rTo)
                    {
                        target = b.board[rFrom][cFrom].n.n.e;
                    }
                    else if (b.board[rFrom][cFrom].n.e.e.c == cTo && b.board[rFrom][cFrom].n.e.e.r == rTo)
                    {
                        target = b.board[rFrom][cFrom].n.e.e;
                    }
                    else if (b.board[rFrom][cFrom].n.w.w.c == cTo && b.board[rFrom][cFrom].n.w.w.r == rTo)
                    {
                        target = b.board[rFrom][cFrom].n.w.w;
                    }
                    else if (b.board[rFrom][cFrom].n.n.w.c == cTo && b.board[rFrom][cFrom].n.n.w.r == rTo)
                    {
                        target = b.board[rFrom][cFrom].n.n.w;
                    }
                    else if (b.board[rFrom][cFrom].w.w.n.c == cTo && b.board[rFrom][cFrom].w.w.n.r == rTo)
                    {
                        target = b.board[rFrom][cFrom].w.w.n;
                    }
                    else if (b.board[rFrom][cFrom].w.w.s.c == cTo && b.board[rFrom][cFrom].w.w.s.r == rTo)
                    {
                        target = b.board[rFrom][cFrom].w.w.s;
                    }
                    else if (b.board[rFrom][cFrom].s.s.e.c == cTo && b.board[rFrom][cFrom].s.s.e.r == rTo)
                    {
                        target = b.board[rFrom][cFrom].s.s.e;
                    }
                    else if (b.board[rFrom][cFrom].s.s.w.c == cTo && b.board[rFrom][cFrom].s.s.w.r == rTo)
                    {
                        target = b.board[rFrom][cFrom].s.s.w;
                    }
                    else if (b.board[rFrom][cFrom].w.w.s.c == cTo && b.board[rFrom][cFrom].w.w.s.r == rTo)
                    {
                        target = b.board[rFrom][cFrom].w.w.s;
                    }
                    else if (b.board[rFrom][cFrom].w.w.n.c == cTo && b.board[rFrom][cFrom].w.w.n.r == rTo)
                    {
                        target = b.board[rFrom][cFrom].w.w.n;
                    }
                    else if (b.board[rFrom][cFrom].s.e.e.c == cTo && b.board[rFrom][cFrom].s.e.e.r == rTo)
                    {
                        target = b.board[rFrom][cFrom].s.e.e;
                    }
                    else if (b.board[rFrom][cFrom].s.w.w.c == cTo && b.board[rFrom][cFrom].s.w.w.r == rTo)
                    {
                        target = b.board[rFrom][cFrom].s.w.w;
                    }
                    if (target != null)
                    {
                        target.piece = b.board[rFrom][cFrom].piece;
                        b.board[rFrom][cFrom].piece = ' ';
                        return(this);
                    }
                    return(null);
                }
                break;

            case 'q':
            case 'Q':
                if (rTo >= 0 && rTo < Puzzle.SIZE && cTo >= 0 && cTo < Puzzle.SIZE)
                {
                    Field target = null;
                    target = b.board[rFrom][cFrom];
                    if (rTo > rFrom && cTo > cFrom)
                    {
                        while (target.se != b.board[rTo][cTo])
                        {
                            target = target.se;
                            if (target == b.offboard || target.piece != ' ')
                            {
                                return(null);
                            }
                        }
                    }
                    else if (rTo > rFrom && cTo == cFrom)
                    {
                        while (target.s != b.board[rTo][cTo])
                        {
                            target = target.s;
                            if (target == b.offboard || target.piece != ' ')
                            {
                                return(null);
                            }
                        }
                    }
                    else if (rTo == rFrom && cTo > cFrom)
                    {
                        while (target.e != b.board[rTo][cTo])
                        {
                            target = target.e;
                            if (target == b.offboard || target.piece != ' ')
                            {
                                return(null);
                            }
                        }
                    }
                    else if (rTo < rFrom && cTo == cFrom)
                    {
                        while (target.n != b.board[rTo][cTo])
                        {
                            target = target.n;
                            if (target == b.offboard || target.piece != ' ')
                            {
                                return(null);
                            }
                        }
                    }
                    else if (rTo > rFrom && cTo < cFrom)
                    {
                        while (target.sw != b.board[rTo][cTo])
                        {
                            target = target.sw;
                            if (target == b.offboard || target.piece != ' ')
                            {
                                return(null);
                            }
                        }
                    }
                    else if (rTo == rFrom && cTo < cFrom)
                    {
                        while (target.w != b.board[rTo][cTo])
                        {
                            target = target.w;
                            if (target == b.offboard || target.piece != ' ')
                            {
                                return(null);
                            }
                        }
                    }
                    else if (rTo < rFrom && cTo < cFrom)
                    {
                        while (target.nw != b.board[rTo][cTo])
                        {
                            target = target.nw;
                            if (target == b.offboard || target.piece != ' ')
                            {
                                return(null);
                            }
                        }
                    }
                    else if (rTo < rFrom && cTo > cFrom)
                    {
                        while (target.ne != b.board[rTo][cTo])
                        {
                            target = target.ne;
                            if (target == b.offboard || target.piece != ' ')
                            {
                                return(null);
                            }
                        }
                    }
                    target       = b.board[rTo][cTo];
                    target.piece = b.board[rFrom][cFrom].piece;
                    b.board[rFrom][cFrom].piece = ' ';
                    return(this);
                }
                break;

            case 'b':
            case 'B':
                if (rTo >= 0 && rTo < Puzzle.SIZE && cTo >= 0 && cTo < Puzzle.SIZE)
                {
                    Field target = null;
                    target = b.board[rFrom][cFrom];
                    if (rTo > rFrom && cTo > cFrom)
                    {
                        while (target.se != b.board[rTo][cTo])
                        {
                            target = target.se;
                            if (target == b.offboard || target.piece != ' ')
                            {
                                return(null);
                            }
                        }
                    }
                    else if (rTo > rFrom && cTo < cFrom)
                    {
                        while (target.sw != b.board[rTo][cTo])
                        {
                            target = target.sw;
                            if (target == b.offboard || target.piece != ' ')
                            {
                                return(null);
                            }
                        }
                    }
                    else if (rTo < rFrom && cTo < cFrom)
                    {
                        while (target.nw != b.board[rTo][cTo])
                        {
                            target = target.nw;
                            if (target == b.offboard || target.piece != ' ')
                            {
                                return(null);
                            }
                        }
                    }
                    else if (rTo < rFrom && cTo > cFrom)
                    {
                        while (target.ne != b.board[rTo][cTo])
                        {
                            target = target.ne;
                            if (target == b.offboard || target.piece != ' ')
                            {
                                return(null);
                            }
                        }
                    }
                    else
                    {
                        return(null);
                    }
                    target       = b.board[rTo][cTo];
                    target.piece = b.board[rFrom][cFrom].piece;
                    b.board[rFrom][cFrom].piece = ' ';
                    return(this);
                }
                break;

            case 'r':
            case 'R':
                if (rTo >= 0 && rTo < Puzzle.SIZE && cTo >= 0 && cTo < Puzzle.SIZE)
                {
                    Field target = null;
                    target = b.board[rFrom][cFrom];
                    if (rTo > rFrom && cTo == cFrom)
                    {
                        while (target.s != b.board[rTo][cTo])
                        {
                            target = target.s;
                            if (target == b.offboard || target.piece != ' ')
                            {
                                return(null);
                            }
                        }
                    }
                    else if (rTo == rFrom && cTo > cFrom)
                    {
                        while (target.e != b.board[rTo][cTo])
                        {
                            target = target.e;
                            if (target == b.offboard || target.piece != ' ')
                            {
                                return(null);
                            }
                        }
                    }
                    else if (rTo < rFrom && cTo == cFrom)
                    {
                        while (target.n != b.board[rTo][cTo])
                        {
                            target = target.n;
                            if (target == b.offboard || target.piece != ' ')
                            {
                                return(null);
                            }
                        }
                    }
                    else if (rTo == rFrom && cTo < cFrom)
                    {
                        while (target.w != b.board[rTo][cTo])
                        {
                            target = target.w;
                            if (target == b.offboard || target.piece != ' ')
                            {
                                return(null);
                            }
                        }
                    }
                    else
                    {
                        return(null);
                    }
                    target       = b.board[rTo][cTo];
                    target.piece = b.board[rFrom][cFrom].piece;
                    b.board[rFrom][cFrom].piece = ' ';
                    return(this);
                }
                break;

            case 'k':
            case 'K':
                if (rTo >= 0 && rTo < Puzzle.SIZE && cTo >= 0 && cTo < Puzzle.SIZE)
                {
                    Field target = null;
                    target = b.board[rTo][cTo];
                    if (target != null && (target.ne == b.board[rFrom][cFrom] || target.e == b.board[rFrom][cFrom] || target.se == b.board[rFrom][cFrom] || target.s == b.board[rFrom][cFrom] || target.sw == b.board[rFrom][cFrom] || target.w == b.board[rFrom][cFrom] || target.nw == b.board[rFrom][cFrom] || target.n == b.board[rFrom][cFrom]))
                    {
                        target.piece = b.board[rFrom][cFrom].piece;
                        b.board[rFrom][cFrom].piece = ' ';
                        return(this);
                    }
                    return(null);
                }
                break;

            default:
                return(null);
            }
            return(null);
        }