To solve this optimization problem, we need to define variables and constraints based on the given conditions. Let's denote:

- $d$ as the number of ducks shot,
- $g$ as the number of geese shot.

The objective is to maximize the total points earned from shooting ducks and geese. Each duck shot gives 5 points, and each goose shot gives 6 points. Therefore, the objective function can be written as:

Maximize: $5d + 6g$

Subject to the constraints:

1. Shoot at least 5 ducks: $d \geq 5$
2. Shoot at least 3 geese: $g \geq 3$
3. Shoot at most 12 ducks: $d \leq 12$
4. Shoot at most 7 geese: $g \leq 7$
5. Total animals shot do not exceed 15: $d + g \leq 15$

Since we cannot shoot a negative number of animals, we also have:

- $d \geq 0$
- $g \geq 0$

All variables are integers because you cannot shoot a fraction of an animal.

Given these constraints and the objective function, we can now write the Gurobi code to solve this problem.

```python
from gurobipy import *

# Create a new model
m = Model("Arcade_Shooter")

# Define variables
d = m.addVar(vtype=GRB.INTEGER, name="ducks", lb=0)
g = m.addVar(vtype=GRB.INTEGER, name="geese", lb=0)

# Set objective function
m.setObjective(5*d + 6*g, GRB.MAXIMIZE)

# Add constraints
m.addConstr(d >= 5, "min_ducks")
m.addConstr(g >= 3, "min_geese")
m.addConstr(d <= 12, "max_ducks")
m.addConstr(g <= 7, "max_geese")
m.addConstr(d + g <= 15, "total_animals")

# Optimize model
m.optimize()

# Print solution
if m.status == GRB.OPTIMAL:
    print("Optimal solution found:")
    print(f"Shoot {d.x} ducks and {g.x} geese to maximize points.")
else:
    print("No optimal solution found. The problem might be infeasible.")
```