## Problem Description and Formulation

The problem is a linear programming optimization problem. The goal is to maximize the points earned by shooting ducks and geese in an arcade shooter game, subject to certain constraints.

### Decision Variables

Let $D$ be the number of ducks shot and $G$ be the number of geese shot.

### Objective Function

The objective function to maximize is the total points earned, which is $5D + 6G$.

### Constraints

1. **Minimum Shooting Requirements**: $D \geq 5$ and $G \geq 3$.
2. **Maximum Shooting Limits**: $D \leq 12$ and $G \leq 7$.
3. **Total Bullets Constraint**: $D + G \leq 15$.

### Non-Negativity Constraints

Since the number of ducks and geese shot cannot be negative, we have $D \geq 0$ and $G \geq 0$. However, these are already implied by the minimum shooting requirements.

## Gurobi Code

```python
import gurobi

def solve_arcade_shooter_problem():
    # Create a new Gurobi model
    model = gurobi.Model()

    # Define the decision variables
    D = model.addVar(lb=5, ub=12, name="Ducks")
    G = model.addVar(lb=3, ub=7, name="Geese")

    # Objective function: Maximize 5D + 6G
    model.setObjective(5 * D + 6 * G, gurobi.GRB.MAXIMIZE)

    # Additional constraint: D + G <= 15
    model.addConstr(D + G <= 15, name="Total_Bullets")

    # Solve the model
    model.optimize()

    # Check if the model is optimized
    if model.status == gurobi.GRB.OPTIMAL:
        print(f"Optimal Solution: Ducks = {D.varValue}, Geese = {G.varValue}")
        print(f"Maximum Points: {5 * D.varValue + 6 * G.varValue}")
    else:
        print("The model is infeasible.")

solve_arcade_shooter_problem()
```

However, to adhere strictly to the requirements and best practices, let's adjust the code slightly for clarity and to ensure it can be directly executed:

```python
import gurobi

def solve_arcade_shooter_problem():
    # Create a new Gurobi model
    model = gurobi.Model()

    # Define the decision variables
    D = model.addVar(lb=5, ub=12, name="Ducks")
    G = model.addVar(lb=3, ub=7, name="Geese")

    # Objective function: Maximize 5D + 6G
    model.setObjective(5 * D + 6 * G, gurobi.GRB.MAXIMIZE)

    # Additional constraint: D + G <= 15
    model.addConstr(D + G <= 15, name="Total_Bullets")

    # Solve the model
    model.optimize()

    # Check if the model is optimized
    if model.status == gurobi.GRB.OPTIMAL:
        print(f"Optimal Solution: Ducks = {D.X}, Geese = {G.X}")
        print(f"Maximum Points: {5 * D.X + 6 * G.X}")
    else:
        print("The model is infeasible.")

if __name__ == "__main__":
    solve_arcade_shooter_problem()
```