public interface IGoombaState
{
    void ChangeDirection();
    void BeStomped();
    void BeFlipped();
    void Update();
    // Draw() might also be included here
}

public class Goomba
{
    public IGoombaState state;
    
    public Goomba()
    {
        state = new LeftMovingGoombaState(this);
    }
    
    public void ChangeDirection()
    {
        state.ChangeDirection();
    }
    
    public void BeStomped()
    {
        state.BeStomped();
    }
    
    public void BeFlipped()
    {
        state.BeFlipped();
    }

    // Draw and other methods omitted
}

public class LeftMovingGoombaState : IGoombaState
{
    private Goomba goomba;
    
    public LeftMovingGoombaState(Goomba goomba)
    {
        this.goomba = goomba;
        // construct goomba's sprite here too
    }
    
    public void ChangeDirection()
    {
        goomba.state = new RightMovingGoombaState(goomba);
    }
    
    public void BeStomped()
    {
        goomba.state = new LeftMovingStompedGoombaState(goomba);	
    }
    
    public void BeFlipped()
    {
        goomba.state = new FlippedGoombaState(goomba);
    }
    
    public void Update()
    {
        // call something like goomba.MoveLeft() or goomba.Move(-x,0);
    }
}

public class LeftMovingStompedGoombaState : IGoombaState
{
    private Goomba goomba;
    
    public LeftMovingStompedGoombaState(Goomba goomba)
    {
        this.goomba = goomba;
        // construct goomba's sprite here too
    }
    
    public void ChangeDirection()
    {
        goomba.state = new RightMovingStompedGoombaState(goomba);
    }
    
    public void BeStomped()
    {
        // NO-OP
        // already stomped, do nothing
    }
    
    public void BeFlipped()
    {
        // NO-OP
        // if stomped, do not respond to being attacked by star mario (assumed but not tested behavior)
    }
    
    public void Update()
    {
        // call something like goomba.MoveLeft() or goomba.Move(-x,0);
    }
}