void guess_and_move()
    {
        /*==========================Guess and move===========================
         * According to the player's move, the robot will guess
         * which evador the player is targeting, and also move towards
         * that evador.
         * Right now I suggest players are targeting the Evador _e when:
         * - they keep shortening the manhattan distance between _e and themselves;
         * - if there are multiple, choose the closest one.
         * - I suppose evador are always running to exit,from the robot's propose.
         * =========================Guess and move==============================*/

        if (player_target.Count == 0)
        {
            create_target_list();
        }
        refresh_target_list();
        evador_behave target_evador = Find_target(player_target);
        grid_node     exit_node     = sg.nodes.Find(x => x.state == SquareGrid.grid_stat.exit);
        grid_node     target_grid   = next_closest_to_target(target_evador.current_node, exit_node);

        target_grid.SendMessage("flash_me");
        grid_node candidate = next_closest_to_target(current_node, target_grid);

        if (candidate != null)
        {
            move_to_grid(sg, candidate);
        }
    }
 void create_target_list()
 {
     player_target.Clear();
     GameObject[] target_evadors = GameObject.FindGameObjectsWithTag("evador");
     foreach (GameObject _e in target_evadors)
     {
         evador_behave eb = _e.GetComponent <evador_behave>();
         player_target.Add(eb);
         previous_step[eb] = 0;
         current_step[eb]  = 0;
         rf_factor[eb]     = 1;
     }
 }
예제 #3
0
    // Update is called once per frame



    //========================simple state machine=======================================
    void corner_target(evador_behave target)
    {
        if (target == null)
        {
            Debug.LogWarning("No target to be corner.");
            block_exit();
            return;
        }
        else
        {
            deploy_my_bots(target.current_node);
        }
    }
 bool cornered(evador_behave eb)
 {
     /*=========================================================
     * 1st: all neighbours are occupied;
     * 2nd: they are occupied either by a player or a robot;
     *       =========================================================*/
     foreach (grid_node n in GridsGenerator.instance.g.my_neighbours(eb.current_node))
     {
         if (n.occupied == false)
         {
             Debug.LogWarning("some of my nbs is empty."); return(false);
         }
         else if (n.gameObject.transform.GetChild(0).tag == "evador")
         {
             return(false);
         }
     }
     return(true);
 }
예제 #5
0
    public void update_state(robot_state r, evador_behave target = null)
    {
        //robots current positions

        switch (r)
        {
        case robot_state.defeat:
            corner_target(target);
            return;

        case robot_state.cooperate:
            if (player_target.Count == 0)
            {
                create_target_list();
            }
            refresh_target_list();
            evador_behave target_evador = Find_target(player_target);
            corner_target(target_evador);
            return;
        }
        //target
    }
    evador_behave Find_target(List <evador_behave> t)
    {
        int min_reward = 0;
        int reward;

        evador_behave target_now = null;

        foreach (evador_behave eb in t)
        {
            reward = 0;
            if ((int)previous_step[eb] >= current_step[eb])
            {
                reward         = -30 * rf_factor[eb];
                rf_factor[eb] += 1;
            }
            else
            {
                rf_factor[eb] = 1;
            }                                 //clear target threat;
            reward += Manhattan(current_node.grid_position, eb.current_node.grid_position);
            if (target_now == null)
            {
                target_now = eb;
                min_reward = reward;
            }
            else
            {
                target_now = reward < min_reward?eb:target_now;
            }
        }
        if (target_now)
        {
            target_now.SendMessage("flash_me");
        }
        return(target_now);
    }
    void Update()
    {
        //manually update the stages.
        if (Input.GetKeyDown(KeyCode.Space))
        {
            Stage_switch();
        }

        switch (current_stage)
        {
        case stage.Player_moving:
            GameObject[] ev_instance = GameObject.FindGameObjectsWithTag("evador");
            if (ev_instance.Length == 0)
            {
                //NNprocessor.instance.update_weights(NNprocessor.instance.current_index,(float)score_evador);
                NNprocessor.instance.print_results();
                Application.LoadLevel(0);
            }
            GridsGenerator.instance.player_instance.SendMessage("move");
            return;

        case stage.Robot_moving:

            //this will be controlled all together
            //so I will change this one to a robot-controller.
            if (!stage_processed)
            {
                stage_processed = true;

                /*
                 * GameObject[] robot_instance=GameObject.FindGameObjectsWithTag("robot");
                 * foreach(GameObject rb in robot_instance)
                 * rb.SendMessage("guess_and_move");
                 *
                 * StartCoroutine("stage_yield");*/
                GameObject[]  evador_instance = GameObject.FindGameObjectsWithTag("evador");
                evador_behave target          = target_list[NNprocessor.instance.order_index[NNprocessor.instance.current_index][index_in_list]];
                if (!target)
                {
                    index_in_list++;
                }
                Robots_controller.instance.update_state(Robots_controller.robot_state.defeat, target);
                // Robots_controller.instance.update_state(Robots_controller.robot_state.cooperate);
                if (target)
                {
                    target.SendMessage("flash_me");
                }
            }
            return;

        case stage.Evador_moving:

            //Add more protection method for time-consumption for computing
            if (!stage_processed)
            {
                stage_processed = true;
                GameObject[] evador_instance = GameObject.FindGameObjectsWithTag("evador");
                foreach (GameObject ev in evador_instance)
                {
                    evador_behave eb = ev.GetComponent <evador_behave>();
                    if (cornered(eb))
                    {
                        Debug.Log("I am cornerd");
                        eb.SendMessage("explode", Color.red);
                        eb.current_node.occupied = false;
                        DestroyImmediate(eb.gameObject);
                    }
                }


                foreach (GameObject ev in evador_instance)
                {
                    if (ev)
                    {
                        ev.SendMessage("IQ2_move");
                    }
                }
                //modify this to change method

                StartCoroutine("stage_yield");
            }
            return;

        default:
            return;
        }
    }