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); }
internal void setEnemy(Player enemy) { mEnemy = enemy; mEnemyFishkaAccessor = new ListAccessor <Fishka>(mEnemy.mFishka, (fishka) => fishka.mAlive); }
public static Cont <Move, Move> with <A>(this ListAccessor <A> list, Func <A, Cont <Move, Move> > amb) { return(list.toContBind(new MoveNothing(), amb)); }
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; } }