コード例 #1
0
    /*
     * Handles interactions with game FSM and player input.
     */
    void Update()
    {
        Player currentTurnPlayer = gamestate.GetCurrentTurnPlayer();

        UpdateHumanCardCounts();

        long   elapsedTicksSinceLastAIAction = DateTime.Now.Ticks - lastAIActionTime.Ticks;
        double secondsSinceLastAIAction      = new TimeSpan(elapsedTicksSinceLastAIAction).TotalSeconds;


        //AI Interaction
        if (currentTurnPlayer.isAI)
        {
            if (secondsSinceLastAIAction >= FORCED_TIME_BETWEEN_AI_ACTIONS)
            {
                System.Random rand = new System.Random();

                //Initial settlement placement
                if (curState == GameState.State.placeSettlement)
                {
                    List <Node> locationOptions = AIEngine.GetFavorableStartingLocations(board);

                    //Attempt to place elements in decreasing score order
                    for (int i = 0; i < locationOptions.Count; i++)
                    {
                        if (board.CanBuildSettlementHere(locationOptions[i].visual.transform, currentTurnPlayer, true))
                        {
                            lastStructurePlaced = board.PlaceSettlement(locationOptions[i].visual.transform, currentTurnPlayer, false);
                            break;
                        }
                    }
                    IncrementState();
                    UpdateTurnInfo("Placing Initial Road", currentTurnPlayer.id);
                }
                //Initial road placement
                else if (curState == GameState.State.placeRoad)
                {
                    List <Edge> favorableRoads = AIEngine.GetFavorableRoadExpansions(currentTurnPlayer, board, lastStructurePlaced);

                    foreach (Edge road in favorableRoads)
                    {
                        if (board.CanBuildRoadHere(road.visual.transform, currentTurnPlayer))
                        {
                            lastRoadPlaced = board.PlaceRoad(road.visual.transform, currentTurnPlayer, false);
                            break;
                        }
                    }

                    IncrementState();
                }
                //Roll dice
                else if (curState == GameState.State.roll)
                {
                    if (rollForAI)
                    {
                        if (Input.GetMouseButtonDown(0))
                        {
                            Ray        ray = Camera.main.ScreenPointToRay(Input.mousePosition);
                            RaycastHit hit;
                            if (interactDebug)
                            {
                                print("mouse press");
                            }
                            if (Physics.Raycast(ray, out hit))
                            {
                                if (hit.transform == dice.transform)
                                {
                                    IncrementState();
                                    updateDice();
                                }
                            }
                        }
                    }
                    else
                    {
                        IncrementState();
                        updateDice();
                    }
                }
                //Trade with players
                else if (curState == GameState.State.trade)
                {
                    proposedObjective = null;

                    if (debugMessages)
                    {
                        print("~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~");
                    }

                    //TODO
                    List <AIEngine.Objective> objectives = AIEngine.GetObjectives(currentTurnPlayer, board, gamestate);

                    // Trade With Other Players
                    int  tradeOffersThisTurn     = 0;
                    bool hasAnyOfferBeenAccepted = false;
                    foreach (AIEngine.Objective objective in objectives)
                    {
                        if (objective.Score() > 0 && objective.TotalCardsNeeded() > 0 && tradeOffersThisTurn < 3 && !hasAnyOfferBeenAccepted)
                        {
                            TradeOffer offer = currentTurnPlayer.generateAITradeRequest(gamestate.getTurnCounter(), objective);

                            if (null != offer)
                            {
                                if (debugMessages)
                                {
                                    print("TRADENUM: " + tradeOffersThisTurn + " | " + gamestate.GetCurrentTurnPlayer() + "\nATTEMPTING TO TRADE WITH OTHER PLAYERS TO ACHIEVE OBJECT: " + objective.GetObjectiveScore());
                                }

                                tradeOffersThisTurn++;
                                hasAnyOfferBeenAccepted = tradeManager.ExecuteTradeOfferNotification(offer);
                                proposedObjective       = objective;
                            }
                        }
                    }

                    // Trade With Bank
                    foreach (AIEngine.Objective objective in objectives)
                    {
                        if (objective.Score() > 0 && objective.TotalCardsNeeded() > 0 && !hasAnyOfferBeenAccepted)
                        {
                            if (debugMessages)
                            {
                                print(gamestate.GetCurrentTurnPlayer() + " ATTEMPTING TO TRADE WITH BANK");
                            }

                            TradeOffer offer = currentTurnPlayer.generateAITradeWithBank(objective);

                            if (null != offer)
                            {
                                tradeManager.ExecuteTradeWithBank(offer, gamestate.GetCurrentTurnPlayer());
                                hasAnyOfferBeenAccepted = true;
                            }
                        }
                    }

                    if (!hasAnyOfferBeenAccepted && debugMessages)
                    {
                        print(gamestate.GetCurrentTurnPlayer() + " MADE NO TRADES THIS TURN");
                    }

                    IncrementState();
                    FORCED_TIME_BETWEEN_AI_ACTIONS = 0f;                     //TODO Remove
                }
                //Building phase
                else if (curState == GameState.State.place)
                {
                    FORCED_TIME_BETWEEN_AI_ACTIONS = 0f;                     //TODO Remove

                    //TODO
                    List <AIEngine.Objective> objectives = AIEngine.GetObjectives(currentTurnPlayer, board, gamestate);
                    foreach (AIEngine.Objective objective in objectives)
                    {
                        print(objective);
                    }

                    foreach (AIEngine.Objective objective in objectives)
                    {
                        if (objective.TotalCardsNeeded() == 0)
                        {
                            AIEngine.PerformObjective(objective, board);
                            break;
                        }
                    }

                    /*//Attempt main objective that we traded for
                     * if (proposedObjective != null) {
                     *      AIEngine.PerformObjective(proposedObjective, board);
                     * }
                     * //Attempt to get -any- objective to work
                     * else {
                     *      List<AIEngine.Objective> objectives = AIEngine.GetObjectives(currentTurnPlayer, board, gamestate);
                     *      foreach (AIEngine.Objective objective in objectives) {
                     *              if (AIEngine.PerformObjective(objective, board)) {
                     *                      break;
                     *              }
                     *      }
                     * }*/

                    IncrementState();
                }
                //Place robber
                else if (curState == GameState.State.robber)
                {
                    Player      competitorPlayer   = gamestate.BiggestCompetitorToPlayer(currentTurnPlayer);
                    List <Tile> possiblePlacements = AIEngine.GetListOfRobberPlacements(currentTurnPlayer, competitorPlayer, board);

                    bool robberPlaced = false;

                    //Attempt to place robber on recommended tiles
                    foreach (Tile tile in possiblePlacements)
                    {
                        int index = board.tiles.IndexOf(tile);
                        if (board.PlaceRobber(board.tileHitboxes[index].transform))
                        {
                            robberPlaced = true;
                            break;
                        }
                    }

                    //If for some reason we're out of recommendations...
                    while (!robberPlaced)
                    {
                        print("ERROR: ATTEMPTING TO RANDOMLY PLACE ROBBER!");
                        int tileIndex = rand.Next(board.tiles.Count);
                        robberPlaced = board.PlaceRobber(board.tileHitboxes[tileIndex].transform);
                    }

                    IncrementState();
                }

                lastAIActionTime = DateTime.Now;                 //Prevent AI from acting too quickly
            }
        }
        //Human Interaction
        else
        {
            if (Input.GetMouseButtonDown(0))
            {
                Ray        ray = Camera.main.ScreenPointToRay(Input.mousePosition);
                RaycastHit hit;
                if (interactDebug)
                {
                    print("mouse press");
                }
                if (Physics.Raycast(ray, out hit))
                {
                    //Need to place something
                    if (curState == GameState.State.placeSettlement || curState == GameState.State.placeRoad || curState == GameState.State.place)
                    {
                        bool isSetup = (curState == GameState.State.placeSettlement || curState == GameState.State.placeRoad);

                        //Choose what to build or use preselected
                        if (curState == GameState.State.place)
                        {
                            if (hit.transform == roadSelector.transform && currentTurnPlayer.CanBuildRoad())
                            {
                                objectToBuild = hit.transform;
                                if (interactDebug)
                                {
                                    print("on a building");
                                }
                            }
                            else if (hit.transform == citySelector.transform && currentTurnPlayer.CanBuildCity())
                            {
                                objectToBuild = hit.transform;
                                if (interactDebug)
                                {
                                    print("on a building");
                                }
                            }
                            else if (hit.transform == settlementSelector.transform && currentTurnPlayer.CanBuildSettlement())
                            {
                                objectToBuild = hit.transform;
                                if (interactDebug)
                                {
                                    print("on a building");
                                }
                            }
                            else if (hit.transform == endTurnButton.transform)
                            {
                                IncrementState();
                            }
                        }
                        else if (curState == GameState.State.placeSettlement)
                        {
                            objectToBuild = settlementSelector.transform;
                        }
                        else if (curState == GameState.State.placeRoad)
                        {
                            objectToBuild = roadSelector.transform;
                        }

                        if (objectToBuild != null)
                        {
                            if (objectToBuild == roadSelector.transform && board.roadHitboxes.ContainsKey(hit.transform))
                            {
                                Node structureToBuildNear = (curState == GameState.State.placeRoad) ? lastStructurePlaced : null;

                                if (board.CanBuildRoadHere(hit.transform, currentTurnPlayer, structureToBuildNear, true))
                                {
                                    lastRoadPlaced = board.PlaceRoad(hit.transform, currentTurnPlayer, !isSetup);
                                    objectToBuild  = null;
                                    if (interactDebug)
                                    {
                                        print("road built!");
                                    }
                                    if (curState == GameState.State.placeRoad)
                                    {
                                        IncrementState();
                                    }
                                }
                            }
                            else if (objectToBuild == settlementSelector.transform && board.settlementHitboxes.ContainsKey(hit.transform))
                            {
                                if (board.CanBuildSettlementHere(hit.transform, currentTurnPlayer, isSetup, true))
                                {
                                    lastStructurePlaced = board.PlaceSettlement(hit.transform, currentTurnPlayer, !isSetup);
                                    objectToBuild       = null;
                                    if (interactDebug)
                                    {
                                        print("settlement built!");
                                    }
                                    if (curState == GameState.State.placeSettlement)
                                    {
                                        IncrementState();
                                    }
                                }
                            }
                            else if (objectToBuild == citySelector.transform && board.settlements.ContainsKey(hit.transform))
                            {
                                if (board.CanBuildCityHere(hit.transform, currentTurnPlayer, true))
                                {
                                    lastStructurePlaced = board.PlaceCity(hit.transform, currentTurnPlayer);
                                    objectToBuild       = null;
                                    if (interactDebug)
                                    {
                                        print("city built!");
                                    }
                                }
                            }
                        }
                    }
                    //Place robber on a chit
                    else if (curState == GameState.State.robber)
                    {
                        if (board.PlaceRobber(hit.transform))
                        {
                            IncrementState();                              //increment if successfully placed
                        }
                    }
                    //Request trades with other players or bank
                    else if (curState == GameState.State.trade)
                    {
                        UpdateTradePanel(hit.transform);
                        if (hit.transform == endTradeButton.transform)
                        {
                            IncrementState();
                        }
                        else if (hit.transform == offerTradeButton.transform)
                        {
                            OfferTrade();
                        }
                        else if (hit.transform == endTurnButton.transform)
                        {
                            IncrementState();
                            IncrementState();
                        }


                        //tradeManager.ExecuteTradeWithBank(offer, gamestate.GetCurrentTurnPlayer());
                    }
                    //listen for click on dice
                    else if (curState == GameState.State.roll)
                    {
                        if (interactDebug)
                        {
                            print(hit.transform == dice.transform);
                        }
                        if (hit.transform == dice.transform)
                        {
                            IncrementState();
                            updateDice();
                        }
                    }
                    else
                    {
                        if (interactDebug)
                        {
                            print("should not be here");
                        }
                    }
                }
            }
        }
    }
コード例 #2
0
ファイル: Player.cs プロジェクト: KRLacey/socAI
    private bool evaluateTradeRequest(GameState gamestate, TradeOffer trade)
    {
        bool acceptTradeRequest = false;

        if (!isAI)
        {
            // Allow player to accept / reject / modify trade
        }
        else
        {
            List <AIEngine.Objective> objectives = AIEngine.GetObjectives(this, gamestate.getGamestateBoard(), gamestate);

            foreach (AIEngine.Objective objective in objectives)
            {
                PlayerHand thisPlayerNeedResources = objective.GetCardDifferential();

                PlayerHand thisPlayerGiveResources = trade.convertGetResourcesToPlayerHand();                   // tradeHost gets the resources that this Player gives
                PlayerHand thisPlayerGetResources  = trade.convertGiveResourcesToPlayerHand();                  // tradeHost gives the resources that this Player gets

                if (debugMessages)
                {
                    GameEngine.print(objective.GetObjectiveScore() + ": OBJECTIVE SCORE");
                    GameEngine.print("PLAYER " + this.id + " GIVES TO TRADEHOST:" +
                                     "GIVE " + trade.getBrick + " BRICK, " +
                                     "GIVE " + trade.getOre + " ORE, " +
                                     "GIVE " + trade.getWood + " WOOD, " +
                                     "GIVE " + trade.getGrain + " GRAIN, " +
                                     "GIVE " + trade.getSheep + " SHEEP");

                    GameEngine.print("FOR " + trade.giveBrick + " BRICK, " +
                                     "FOR " + trade.giveOre + " ORE, " +
                                     "FOR " + trade.giveWood + " WOOD, " +
                                     "FOR " + trade.giveGrain + " GRAIN, " +
                                     "FOR " + trade.giveSheep + " SHEEP");

                    int[] x = thisPlayerNeedResources.ToArray();
                    GameEngine.print("PLAYER " + this.id + " (SELLER) NEEDS:" +
                                     x[0] + " BRICK, " +
                                     x[1] + " ORE, " +
                                     x[2] + " WOOD, " +
                                     x[3] + " GRAIN, " +
                                     x[4] + " SHEEP");
                }

                bool resourcesNeededOverlapsWithResourcesReceived = false;
                // Compare Cards Received with Cards Needed
                for (int i = 0; i < 5; i++)
                {
                    if (thisPlayerNeedResources.GetResourceQuantity(i) < 0 && thisPlayerGetResources.GetResourceQuantity(i) > 0)
                    {
                        resourcesNeededOverlapsWithResourcesReceived = true;
                    }
                }

                bool resourcesNeededOverlapsWithResourcesGiven = false;
                for (int i = 0; i < 5; i++)
                {
                    if (thisPlayerNeedResources.GetResourceQuantity(i) >= 0 && thisPlayerNeedResources.GetResourceQuantity(i) - thisPlayerGiveResources.GetResourceQuantity(i) < 0)
                    {
                        resourcesNeededOverlapsWithResourcesGiven = true;
                    }
                }

                if (debugMessages)
                {
                    // If any resources needed and received overlap && any resources needed and given do not overlap
                    GameEngine.print("NEEDS OVERLAPS WITH GET?: " + resourcesNeededOverlapsWithResourcesReceived + "(-true-), " +
                                     "NEEDS OVERLAPS WITH GIVE?: " + resourcesNeededOverlapsWithResourcesGiven + " (-false-)");
                }

                if (resourcesNeededOverlapsWithResourcesReceived && !resourcesNeededOverlapsWithResourcesGiven)
                {
                    if (debugMessages)
                    {
                        GameEngine.print("@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ GET NEEDED RESOURCES & ONLY TRADE SURPLUS RESOURCES @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@");
                    }

                    if (trade.IsFairTrade() || trade.isGoodTradeForSeller())
                    {
                        acceptTradeRequest = true;
                    }
                    else
                    {
                        System.Random rand = new System.Random();

                        if (rand.Next(100) < 25)                                                // 25% Chance to accept an unfair trade (technically could be better for them, but sometimes worse for them)
                        {
                            acceptTradeRequest = true;
                        }
                    }
                }

                if (acceptTradeRequest)
                {
                    if (debugMessages)
                    {
                        GameEngine.print("# # # # # # # # # # # # # # # # # # # # # # # # # # # ACCEPT TRADE # # # # # # # # # # # # # # # # # # # # # # # # # # #");
                    }

                    break;
                }
            }
        }

        return(acceptTradeRequest);
    }