Ejemplo n.º 1
0
        void FixedUpdate()
        {
            var ball = PongGame.BoundsFromTransform(transform);
            var p    = transform.position + _velocity * Time.fixedDeltaTime;

            p.x -= ball.size.x / 2;
            p.y -= ball.size.y / 2;

            //Check vs game borders
            if (ball.max.y > _game.Border.max.y)          //Top
            {
                _velocity = Vector3.Reflect(_velocity, Vector3.down);
                SetTransformY(_game.Border.max.y - ball.size.y / 2);
            }
            else if (ball.min.y < _game.Border.min.y)     //Bot
            {
                _velocity = Vector3.Reflect(_velocity, Vector3.up);
                SetTransformY(_game.Border.min.y + ball.size.y / 2);
            }

            var p1 = PongGame.BoundsFromTransform(Player1.transform);
            var p2 = PongGame.BoundsFromTransform(Player2.transform);

            if (ball.Intersects(p1))   //Player 1 controller
            {
                _velocity = Vector3.Reflect(_velocity, Vector3.right).normalized * ++_speed;
                SetTransformX(p1.max.x + ball.size.x / 2);
                Player1.Hits++;
                Debug.Log(Player1.Hits);
            }
            else if (ball.min.x < _game.Border.min.x)    //Player 1 Goal
            {
                _game.Score(Player.Player2);
                //Reset(1);
            }

            if (ball.Intersects(p2))   //Player 2 controller
            {
                _velocity = Vector3.Reflect(_velocity, Vector3.left).normalized * ++_speed;
                SetTransformX(p2.min.x - ball.size.x / 2);
                Player2.Hits++;
            }
            else if (ball.max.x > _game.Border.max.x)    //Player 2 Goal
            {
                _game.Score(Player.Player1);
                //Reset(-1);
            }

            //Update position
            transform.position += _velocity * Time.fixedDeltaTime;
            PongGame.DebugDrawBounds(PongGame.BoundsFromTransform(transform), Color.red);
        }
Ejemplo n.º 2
0
        public QState GetState()
        {
            var   winner = _ball.IsTerminal();
            float reward;
            bool  terminal;
            //var terminal = winner.HasValue;
            //var reward = terminal ? (winner.Value == Side ? 1 : 0) : 0;
            var b          = PongGame.BoundsFromTransform(_ball.transform);
            var controller = PongGame.BoundsFromTransform(transform);

            controller.size += new Vector3(0.2f, 0, 0);
            PongGame.DebugDrawBounds(controller, Color.blue);
            if (b.Intersects(controller))
            {
                reward   = 1;
                terminal = true;
                if (PongBenchmark.Running)
                {
                    terminal = winner.HasValue;
                }
            }
            else
            {
                terminal = winner.HasValue;
                reward   = terminal ? (winner.Value == Side ? 1 : 0) : 0;
            }

            var bp  = _ball.transform.position;
            var rbp = bp - transform.position;

            var gbp = _grid.Locate(bp);
            var bpy = gbp.HasValue ? gbp.Value.y : -1;

            _grid.Populate((bo, c) => {
                //var x = bo.center.x;
                //var v = bo.Contains(new Vector3(x, _game.Border.min.y)) || bo.Contains(new Vector3(x, _game.Border.max.y)) ? 0.3f : 0; // walls
                var ham = gbp.HasValue ? HammingDistance(gbp.Value, c) : int.MaxValue; // Hamming distance
                var v   = ham <= 0 ? 1f : ham <= 1 ? 0.5f : 0;                         // ball
                //v = bo.Contains(bp + _ball.Velocity.normalized * 2) ? 150f : v;
                //v = bo.Intersects(controller) ? 100 : v;
                return(v);
            });

            var state = _grid.Matrix;

            return(new QState(new[] { state }, _vect.Clone(), reward, terminal));
        }