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); }
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)); }