Hola a todos:
Esta es mi propuesta para el aumento gradual de velocidad. Las modificaciones solo ocurren en el archivo app.rb (Un atributo en la app que inicializa la velocidad, un método que incrementa la velocidad gradualmente y una modificación en la función init_timer que se asegura de incrementar la velocidad cuando la serpiente come)
require_relative "view/ruby2d"
require_relative "model/state"
require_relative "actions/actions"
class App
def initialize
@state = Model.initial_state
# Atributo inicial de velocidad
@speed = 0.5
end
def start
@view = View::Ruby2dView.new(self)
timer_thread = Thread.new { init_timer }
@view.start(@state)
timer_thread.join
end
def init_timer
# Capturamos la longitud inicial de la serpiente
snake_length = @state.snake.positions.length
loop do
if @state.game_finished
puts "Juego Finalizado"
puts "Puntaje: #{@state.snake.positions.length}"
break
end
@state = Actions::move_snake(@state)
@view.render(@state)
# Se evalúa si la longitud de la serpiente ha cambiado, lo que indica si ha comido
if snake_length < @state.snake.positions.length
# Se actualiza la longitud de la serpiente para estar al día con la próxima iteración
snake_length = @state.snake.positions.length
# Se recalcula la velocidad, restando un %5 de la velocidad actual por cada llamado, resultando en una disminución gradual que nunca llega a cero
calculate_speed_increment
# Este puts es para debugear la velocidad en consola. Pueden retirarlo a gusto
puts "Current speed: #{@speed}"
end
sleep @speed
end
end
def send_action(action, params)
new_state = Actions.send(action, @state, params)
if new_state.hash != @state
@state = new_state
@view.render(@state)
end
end
private
def calculate_speed_increment
if @speed > 0.001
# "Reduce la velocidad de la serpiente en un %5"
@speed = @speed - (@speed * 0.05)
if(@speed < 0.001)
@speed = 0.001
end
end
end
end
app = App.new
app.start```
¿Quieres ver más aportes, preguntas y respuestas de la comunidad?