Example #1
0
 internal Player(Color color, Controller controller, Net net)
 {
     mNet              = net;
     mController       = controller;
     mColor            = color;
     mFishka           = new List <Fishka>();
     mMyFishkaAccessor = new ListAccessor <Fishka>(mFishka, (fishka) => fishka.mAlive);
     mNodeAccessor     = new ListAccessor <Node>(mNet.mNode);
     mLineAccessor     = new ListAccessor <Line>(mNet.mLine, (line) => line.mAlive);
 }
Example #2
0
 internal void setEnemy(Player enemy)
 {
     mEnemy = enemy;
     mEnemyFishkaAccessor = new ListAccessor <Fishka>(mEnemy.mFishka, (fishka) => fishka.mAlive);
 }
Example #3
0
 public static Cont <Move, Move> with <A>(this ListAccessor <A> list, Func <A, Cont <Move, Move> > amb)
 {
     return(list.toContBind(new MoveNothing(), amb));
 }
Example #4
0
        public void makeMove()
        {
            ListAccessor <Fishka> myFishka    = mPlayer.mMyFishkaAccessor;
            ListAccessor <Fishka> enemyFishka = mPlayer.mEnemyFishkaAccessor;
            ListAccessor <Node>   nodes       = mPlayer.mNodeAccessor;
            ListAccessor <Line>   lines       = mPlayer.mLineAccessor;


            // встречная атака
            if (apply(nodes.with((node) =>
            {
                if (Node.pHasFishka(mPlayer.pMine())(node) && underAttack()(node))
                {
                    return(lines.with((line) =>
                    {
                        if (line.pFromNode(node) &&
                            line.pToNode(Node.pHasFishka(mPlayer.pEnemy())))
                        {
                            return clickLineMove(line, "front attack");
                        }
                        else
                        {
                            return noMove();
                        }
                    }));
                }
                else
                {
                    return(noMove());
                }
            })))
            {
                return;
            }

            // уход из под атаки
            if (apply(nodes.with((node) =>
            {
                if (Node.pHasFishka(mPlayer.pMine())(node) && underAttack()(node))
                {
                    return(lines.with((line) =>
                    {
                        if (line.pFromNode(node) && line.pToNode(and(
                                                                     Node.pEmpty(),
                                                                     not(underAttack()))))
                        {
                            return clickLineMove(line, "run from attack");
                        }
                        else
                        {
                            return noMove();
                        }
                    }));
                }
                else
                {
                    return(noMove());
                }
            })))
            {
                return;
            }

            // атака
            if (apply(nodes.with((node) =>
            {
                if (Node.pHasFishka(mPlayer.pMine())(node))
                {
                    return(lines.with((line) =>
                    {
                        if (line.pFromNode(node) && line.pToNode(Node.pHasFishka(mPlayer.pEnemy())))
                        {
                            return clickLineMove(line, "attack!!");
                        }
                        else
                        {
                            return noMove();
                        }
                    }));
                }
                else
                {
                    return(noMove());
                }
            })))
            {
                return;
            }


            // поставить в атакующую клетку
            if (apply(myFishka.with((fishka) =>
            {
                if (!fishka.hasNode())
                {
                    return(nodes.with((node) =>
                    {
                        if (!underAttack()(node) && canAttack()(node))
                        {
                            return dragFishkaToNodeMove(fishka, node, "put for attack");
                        }
                        else
                        {
                            return noMove();
                        }
                    }));
                }
                else
                {
                    return(noMove());
                }
            })))
            {
                return;
            }

            // походить в атакующую клетку
            if (apply(nodes.with((node) =>
            {
                if (Node.pHasFishka(mPlayer.pMine())(node))
                {
                    return(lines.with((line) =>
                    {
                        if (line.pFromNode(node) && line.pToNode(and(
                                                                     Node.pEmpty(),
                                                                     not(underAttack()),
                                                                     canAttack())))
                        {
                            return clickLineMove(line, "move for attack");
                        }
                        else
                        {
                            return noMove();
                        }
                    }));
                }
                else
                {
                    return(noMove());
                }
            })))
            {
                return;
            }

            // поставить в клетку не под атакой
            if (apply(myFishka.with((fishka) =>
            {
                if (!fishka.hasNode())
                {
                    return(nodes.with((node) =>
                    {
                        if (!underAttack()(node))
                        {
                            return dragFishkaToNodeMove(fishka, node, "put safe place");
                        }
                        else
                        {
                            return noMove();
                        }
                    }));
                }
                else
                {
                    return(noMove());
                }
            })))
            {
                return;
            }


            // походить в клетку не под атакой
            if (apply(nodes.with((node) =>
            {
                if (Node.pHasFishka(mPlayer.pMine())(node))
                {
                    return(lines.with((line) =>
                    {
                        if (line.pFromNode(node) && line.pToNode(and(
                                                                     Node.pEmpty(),
                                                                     not(underAttack()))))
                        {
                            return clickLineMove(line, "move to safe place");
                        }
                        else
                        {
                            return noMove();
                        }
                    }));
                }
                else
                {
                    return(noMove());
                }
            })))
            {
                return;
            }

            // использовать цикл не под атакой
            if (apply(nodes.with((node) =>
            {
                if (Node.pHasFishka(mPlayer.pMine())(node) && !underAttack()(node))
                {
                    return(lines.with((line) =>
                    {
                        if (line.pFromNode(node) && line.isCycle())
                        {
                            return clickLineMove(line, "safe cycle");
                        }
                        else
                        {
                            return noMove();
                        }
                    }));
                }
                else
                {
                    return(noMove());
                }
            })))
            {
                return;
            }


            // поставить в любую (под атакой)
            if (apply(myFishka.with((fishka) =>
            {
                if (!fishka.hasNode())
                {
                    return(nodes.with((node) =>
                    {
                        return dragFishkaToNodeMove(fishka, node, "put somewhere");
                    }));
                }
                else
                {
                    return(noMove());
                }
            })))
            {
                return;
            }

            // походить в любую клетку (под атакой)
            if (apply(nodes.with((node) =>
            {
                if (Node.pHasFishka(mPlayer.pMine())(node))
                {
                    return(lines.with((line) =>
                    {
                        if (line.pFromNode(node) && line.pToNode(Node.pEmpty()))
                        {
                            return clickLineMove(line, "move somewhere");
                        }
                        else
                        {
                            return noMove();
                        }
                    }));
                }
                else
                {
                    return(noMove());
                }
            })))
            {
                return;
            }

            // убить фишку
            if (apply(nodes.with((node) =>
            {
                if (Node.pHasFishka(mPlayer.pMine())(node))
                {
                    return(clickNodeMove(node, "kill myself"));
                }
                else
                {
                    return(noMove());
                }
            })))
            {
                return;
            }
        }