public int expand(Node p, HeuristicType ht) { Playfield afterState = new Playfield(p.state); ParetoMCTSPlayer m_player = new ParetoMCTSPlayer(new ParetoTreePolicy(0.7), GameManager.getRNG(), afterState, ht); m_player.run(afterState, 30000, false); //m_player.m_root.printStats(); //Helpfunctions.Instance.logg("turn: " + p.state.isOwnTurn); int memberSize = m_player.m_root.pa.m_members.size(); // will it always > 0? for (int i = 0; i < memberSize; i++) // this is other's turn { Node afterNode; Playfield pf = m_player.m_root.pa.m_members.get(i).m_state; if (ht == HeuristicType.DrawCard) { if (pf.moveTrigger.newHandcardList.Count == 0) { continue; } afterNode = new ChanceNode(p, pf, null, p.depth, 1); //last param is wrong pf.printActions(); } else if (ht == HeuristicType.LethalCheck) { if (pf.getLethalScore() == 1.0) { afterNode = new Node(p, pf, null, p.depth + 1); } continue; } else { afterNode = new Node(p, pf, null, p.depth + 1); } p.children.Add(afterNode); } return(p.children.Count); }
public int expand(Node p, HeuristicType ht, int numberIter) { Playfield afterState = new Playfield(p.state); ParetoMCTSPlayer m_player = new ParetoMCTSPlayer(new ParetoTreePolicy(0.7), GameManager.getRNG(), afterState, ht); m_player.run(afterState, numberIter, false); //m_player.m_root.printStats(); //Helpfunctions.Instance.logg("turn: " + p.state.isOwnTurn); int memberSize = m_player.m_root.pa.m_members.size(); // will it always > 0? //if (ht == HeuristicType.Boardvalue) // m_player.m_root.pa.printArchive(); if (ht == HeuristicType.DrawCard) { Console.WriteLine("chance: " + memberSize); if (memberSize > 1) { chanceCount += memberSize - 1; } m_player.m_root.pa.printArchive(); } for (int i = 0; i < memberSize; i++) // this is other's turn { Node afterNode; Playfield pf = m_player.m_root.pa.m_members.get(i).m_state; if (ht == HeuristicType.DrawCard) { if (pf.moveTrigger.newHandcardList.Count == 0) { continue; } if ((pf.isOwnTurn && pf.homeDeck.Count > 0) || (!pf.isOwnTurn && pf.awayDeck.Count > 0)) { List <Action> actionList = pf.getActions(); Playfield tempPf = new Playfield(afterState); for (int j = tempPf.getActions().Count; j < actionList.Count - 1; j++) { tempPf.doAction(actionList[j]); } afterNode = new ChanceNode(p, tempPf, actionList[actionList.Count - 1], p.depth, pf.moveTrigger.newHandcardList.Count); } else { afterNode = new Node(p, pf, null, p.depth); } if (memberSize > 1) { pf.printActions(); } //pf.printActions(); } else if (ht == HeuristicType.LethalCheck) { if (pf.getLethalScore() == 1.0) { afterNode = new Node(p, pf, null, p.depth + 1); } continue; } else { if ((pf.isOwnTurn && pf.homeDeck.Count > 0) || (!pf.isOwnTurn && pf.awayDeck.Count > 0)) { afterNode = new ChanceNode(p, pf, null, p.depth + 1, 1); } else { pf.drawTurnStartCard(); afterNode = new Node(p, pf, null, p.depth + 1); } } p.children.Add(afterNode); } return(p.children.Count); }