Example #1
0
 public State(int numCanibaisLeft, int numBoysLeft, int numCanibaisRight, int numBoysRight, BoatPosition boatPosition)
 {
     this.numCanibaisLeft  = numCanibaisLeft;
     this.numBoysLeft      = numBoysLeft;
     this.numCanibaisRight = numCanibaisRight;
     this.numBoysRight     = numBoysRight;
     this.boatPosition     = boatPosition;
 }
Example #2
0
 public CaptainScreen(String Username, String Password)
 {
     LogicController = controller.GetLogicController();
     LogicController.NewSession(Username, Password);
     boat = BoatPosition.GetBoatPosition();
     controller.generateMap();
     InitializeComponent();
 }
        /// <summary>
        /// Check if any boat are on positions between start X to end x and start y and end y
        /// </summary>
        /// <param name="playerId">Player id which boats are checked</param>
        /// <param name="startX">Start x position</param>
        /// <param name="endX">End x position</param>
        /// <param name="startY">Start y position</param>
        /// <param name="endY">End y position</param>
        /// <returns>Result</returns>
        public static bool IsAnyBoatHere(int playerId, int startX, int endX, int startY, int endY)
        {
            BoatPosition boatPosition = _context.BoatPositions
                                        .Include(bp => bp.Position)
                                        .Include(bp => bp.Boat)
                                        .Where(bp => bp.Position.X >= startX && bp.Position.X <= endX && bp.Position.Y >= startY && bp.Position.Y <= endY)
                                        .FirstOrDefault();

            return(boatPosition != null);
        }
        /// <summary>
        /// Deep copy newBoatPosition object
        /// </summary>
        /// <returns>Deep copy</returns>
        public BoatPosition DeepCopy()
        {
            BoatPosition newBoatPosition = (BoatPosition)this.MemberwiseClone();

            if (newBoatPosition.Boat != null && newBoatPosition.Boat.Player != null && newBoatPosition.Boat.Player.Account != null)
            {
                newBoatPosition.Boat.Player.Account.Password = null;
            }

            return(newBoatPosition);
        }
Example #5
0
        public State(int[] distribution, BoatPosition boat, State parent, int distance)
        {
            MissionariesEast = distribution[0];
            CannibalsEast    = distribution[1];

            MissionariesWest = distribution[2];
            CannibalsWest    = distribution[3];

            Boat     = boat;
            Distance = distance;
            Parent   = parent;
        }
Example #6
0
        BoatPosition initialLocationMode = BoatPosition.Offset; // sets boat to offset state initially

        // changes the boats state based on position of it
        public virtual void UpdateBoat()
        {
            //Debug.Log("1 - Made it to UpdateBoat");
            float valueX = this.gameObject.transform.position.x; // obatins ship x, y, z coordinates
            float valueY = this.gameObject.transform.position.y;
            float valueZ = this.gameObject.transform.position.z;

            switch (initialLocationMode)
            {
            // indicates boat is still offset and keeps state that way
            case BoatPosition.Offset:
                if (valueX > 2 || valueY > 6.5 || valueZ > 2 || valueX < -2 ||
                    valueY < 3 || valueZ < -2)
                {
                    //Debug.Log("1 - Made it to case BoatPosition.Offset first if");
                    initialLocationMode = BoatPosition.Offset;
                }

                // indicates boat is now standard position and switches state from offset to standard
                else if (valueX <= 2 && valueY <= 6.5 && valueZ <= 2 && valueX >= -2 &&
                         valueY >= 3 && valueZ >= -2)
                {
                    //Debug.Log("1 - Made it to case BoatPosition.Offset else if");
                    initialLocationMode = BoatPosition.Standard;
                }

                break;

            // indicates boat is still in standard position and maintains state
            case BoatPosition.Standard:
                if (valueX <= 2 && valueY <= 6.5 && valueZ <= 2 && valueX >= -2 &&
                    valueY >= 3 && valueZ >= -2)
                {
                    //Debug.Log("1 - Made it to case BoatPosition.Standard if");
                    initialLocationMode = BoatPosition.Standard;
                }

                // indiactes boat is offset and switches state from standard to offset
                else if (valueX > 2 || valueY > 6.5 || valueZ > 2 || valueX < -2 ||
                         valueY < 3 || valueZ < -2)
                {
                    //Debug.Log("1 - Made it to case BoatPosition.Offset first if");
                    initialLocationMode = BoatPosition.Offset;
                }

                break;
            }

            // performs action based off of internal state
            DoAction(initialLocationMode);
        }
Example #7
0
        // will perform action based on state
        protected void DoAction(BoatPosition location)
        {
            //Debug.Log("2 - Made it to DoAction");
            switch (location)
            {
            // if standard do nothing
            case BoatPosition.Standard:
                //Debug.Log("2 - Made it to case BoatPosition.Standard:");
                // do nothing
                break;

            // if offset, move boat properly to standard
            case BoatPosition.Offset:
                // move ship back to original
                //Debug.Log("2 - Made it to case BoatPosition.offset: ");
                transform.position = new Vector3(0f, 5.5f, 0f);
                break;
            }
        }
        private static void SetBoatPositions(List <Position> positions, Boat boat)
        {
            boat.Positions = new List <BoatPosition>();

            foreach (Position position in positions)
            {
                BoatPosition boatPosition = new BoatPosition
                {
                    BoatId     = boat.Id,
                    PositionId = position.Id
                };

                _context.BoatPositions.Add(boatPosition);
                _context.SaveChanges();

                boat.Positions.Add(boatPosition);
            }

            _context.Boats.Update(boat);
            _context.SaveChanges();
        }
Example #9
0
        private State CreateState(int[] distribution, BoatPosition boat)
        {
            var east = new int[]
            {
                MissionariesEast + distribution[0],
                CannibalsEast + distribution[1]
            };

            var west = new int[]
            {
                MissionariesWest + distribution[2],
                CannibalsWest + distribution[3]
            };

            var newState = new State(new int[] { east[0], east[1], west[0], west[1] }, boat, this, Distance + 1);

            if (!newState.IsValidState())
            {
                return(null);
            }

            return(newState);
        }
Example #10
0
    public int Part1()
    {
        foreach (var instruction in Input)
        {
            char direction = instruction[0];
            int  values    = Convert.ToInt32(instruction.Substring(1));
            Directions.Add(direction);
            Values.Add(values);
        }
        BoatPosition.Add('S', 0);
        BoatPosition.Add('N', 0);
        BoatPosition.Add('W', 0);
        BoatPosition.Add('E', 0);
        char[] boatDirections = new char[4] {
            'N', 'E', 'S', 'W'
        };
        char lastBoatDirection = 'E';

        for (int i = 0; i < Directions.Count; i++)
        {
            if (BoatPosition.ContainsKey(Directions[i]))
            {
                BoatPosition[Directions[i]] += Values[i];
            }
            if (Directions[i] == 'F')
            {
                BoatPosition[lastBoatDirection] += Values[i];
            }
            if (Directions[i] == 'L' || Directions[i] == 'R')
            {
                if (Directions[i] == 'R')
                {
                    int index = Array.IndexOf(boatDirections, lastBoatDirection);
                    while (Values[i] != 0)
                    {
                        index++;
                        if (index == 4)
                        {
                            index = 0;
                        }
                        lastBoatDirection = boatDirections[index];
                        Values[i]        -= 90;
                    }
                }
                if (Directions[i] == 'L')
                {
                    int index = Array.IndexOf(boatDirections, lastBoatDirection);
                    index -= 1;
                    while (Values[i] != 0)
                    {
                        if (index < 0)
                        {
                            index = 3;
                        }
                        lastBoatDirection = boatDirections[index];
                        index--;
                        Values[i] -= 90;
                    }
                }
            }
        }
        var ManhattanDistance = Math.Abs(BoatPosition['N'] - BoatPosition['S']) + Math.Abs(BoatPosition['W'] - BoatPosition['E']);

        return(ManhattanDistance);
    }
Example #11
0
 // Update is called once per frame
 void Update()
 {
     if (state == GameState.fail || state == GameState.win)
     {
         return;
     }
     if (Input.GetMouseButtonDown(0) && !BoatMove)
     {
         Ray        ray = Camera.main.ScreenPointToRay(Input.mousePosition);
         RaycastHit hit;
         if (Physics.Raycast(ray, out hit))
         {
             if (hit.collider.gameObject.tag == "devil" || hit.collider.gameObject.tag == "priest")
             {
                 PlayerMove = hit.collider.gameObject;
             }
         }
     }
     if (PlayerMove != null && PlayerMove.transform.parent == null)
     {
         if (((boatPosition == BoatPosition.left && Left.Contains(PlayerMove)) ||
              (boatPosition == BoatPosition.right && Right.Contains(PlayerMove))) &&
             OnTheBoat.Count < 2)
         {
             if (pos1 == null)
             {
                 PlayerMove.transform.position = boat.transform.position +
                                                 new Vector3(-0.5f, 1, 0);
                 pos1 = PlayerMove;
             }
             else
             {
                 PlayerMove.transform.position = boat.transform.position +
                                                 new Vector3(0.5f, 1, 0);
                 pos2 = PlayerMove;
             }
             PlayerMove.transform.parent = boat.transform;
             if (boatPosition == BoatPosition.left)
             {
                 Left.Remove(PlayerMove);
             }
             else if (boatPosition == BoatPosition.right)
             {
                 Right.Remove(PlayerMove);
             }
             OnTheBoat.Add(PlayerMove);
         }
         PlayerMove = null;
     }
     if (PlayerMove != null && PlayerMove.transform.parent != null)
     {
         if (boatPosition == BoatPosition.right)
         {
             PlayerMove.transform.position = new Vector3(5.5f + Convert.ToInt32(PlayerMove.name), 0, 0);
             PlayerMove.transform.parent   = null;
             Right.Add(PlayerMove);
             if (Right.Count == 6)
             {
                 state = GameState.win;
             }
         }
         else if (boatPosition == BoatPosition.left)
         {
             PlayerMove.transform.position = new Vector3(-11 + Convert.ToInt32(PlayerMove.name), 0, 0);
             PlayerMove.transform.parent   = null;
             Left.Add(PlayerMove);
         }
         if (pos1 == PlayerMove)
         {
             pos1 = null;
         }
         else
         {
             pos2 = null;
         }
         OnTheBoat.Remove(PlayerMove);
         PlayerMove = null;
     }
     if (BoatMove)
     {
         if (boatPosition == BoatPosition.right)
         {
             CheckState1(Right);
             boat.transform.Translate(Vector3.left * Time.deltaTime * 3);
             if (boat.transform.position.x <= -4)
             {
                 BoatMove     = false;
                 boatPosition = BoatPosition.left;
                 CheckState2(Left);
             }
         }
         if (boatPosition == BoatPosition.left)
         {
             CheckState1(Left);
             boat.transform.Translate(Vector3.right * Time.deltaTime * 3);
             if (boat.transform.position.x >= 4)
             {
                 BoatMove     = false;
                 boatPosition = BoatPosition.right;
                 CheckState2(Right);
             }
         }
     }
 }
 // Update is called once per frame
 void Update()
 {
     if (state == GameState.fail || state == GameState.win)
     {
         return;                                                             //如果游戏胜利或者失败就不再更新
     }
     if (Input.GetMouseButtonDown(0) && !BoatMove)                           //如果船不在移动,判断是否点击鼠标左键
     {
         Ray        ray = Camera.main.ScreenPointToRay(Input.mousePosition); //从相机处发出射线
         RaycastHit hit;
         if (Physics.Raycast(ray, out hit))
         {
             if (hit.collider.gameObject.tag == "devil" || hit.collider.gameObject.tag == "priest") //判断射线击中点是否是恶魔或者牧师
             {
                 PlayerMove = hit.collider.gameObject;                                              //记录下被点击的人物
             }
         }
     }
     if (PlayerMove != null && PlayerMove.transform.parent == null)//被点击人物不为空且其父对象为空,说明被点击人物在岸上
     {
         if (((boatPosition == BoatPosition.left && Left.Contains(PlayerMove)) ||
              (boatPosition == BoatPosition.right && Right.Contains(PlayerMove))) &&
             OnTheBoat.Count < 2) //判断船和被点击人物是否在同一岸边且船未坐满
         {
             if (pos1 == null)    //如果船的第一个位置不为空则把人物移动到第一个位置
             {
                 PlayerMove.transform.position = boat.transform.position +
                                                 new Vector3(-0.5f, 1, 0);
                 pos1 = PlayerMove;
             }
             else//否则把人物移动到第二个位置
             {
                 PlayerMove.transform.position = boat.transform.position +
                                                 new Vector3(0.5f, 1, 0);
                 pos2 = PlayerMove;
             }
             PlayerMove.transform.parent = boat.transform; //将船设为人物的父对象
             if (boatPosition == BoatPosition.left)        //从对应的岸中移除人物
             {
                 Left.Remove(PlayerMove);
             }
             else if (boatPosition == BoatPosition.right)
             {
                 Right.Remove(PlayerMove);
             }
             OnTheBoat.Add(PlayerMove);                             //将人物添加到船上
         }
         PlayerMove = null;                                         //将点击的人物清空
     }
     if (PlayerMove != null && PlayerMove.transform.parent != null) //被点击的人物不为空且其父对象不为空,说明人物在船上
     {
         if (boatPosition == BoatPosition.right)                    //判断船的位置
         {
             PlayerMove.transform.position = new Vector3(5.5f + Convert.ToInt32(PlayerMove.name), 0, 0);
             PlayerMove.transform.parent   = null;
             Right.Add(PlayerMove);
             if (Right.Count == 6)
             {
                 state = GameState.win;                  //如果右岸人数为6,则游戏胜利
             }
         }
         else if (boatPosition == BoatPosition.left)
         {
             PlayerMove.transform.position = new Vector3(-11 + Convert.ToInt32(PlayerMove.name), 0, 0);
             PlayerMove.transform.parent   = null;
             Left.Add(PlayerMove);
         }
         if (pos1 == PlayerMove)
         {
             pos1 = null;
         }
         else
         {
             pos2 = null;
         }
         OnTheBoat.Remove(PlayerMove);
         PlayerMove = null;
     }
     if (BoatMove)                               //判断船是否在移动
     {
         if (boatPosition == BoatPosition.right) //如果船在右边则向左移动
         {
             CheckState1(Right);
             boat.transform.Translate(Vector3.left * Time.deltaTime * 3);
             if (boat.transform.position.x <= -4)
             {
                 BoatMove     = false;
                 boatPosition = BoatPosition.left;
                 CheckState2(Left);
             }
         }
         if (boatPosition == BoatPosition.left)//如果船在左边则向右移动
         {
             CheckState1(Left);
             boat.transform.Translate(Vector3.right * Time.deltaTime * 3);
             if (boat.transform.position.x >= 4)
             {
                 BoatMove     = false;
                 boatPosition = BoatPosition.right;
                 CheckState2(Right);
             }
         }
     }
 }