To solve this optimization problem, we first need to define the symbolic representation of the variables and the objective function, along with the constraints.

Let's denote:
- \(x_1\) as the number of ducks shot,
- \(x_2\) as the number of geese shot.

The objective is to maximize points. Given that each duck shot is 5 points and each goose shot is 6 points, the objective function can be represented algebraically as:
\[ \text{Maximize} \quad 5x_1 + 6x_2 \]

The constraints based on the problem description are:
1. Shoot at least 5 ducks: \( x_1 \geq 5 \)
2. Shoot at least 3 geese: \( x_2 \geq 3 \)
3. Shoot at most 12 ducks: \( x_1 \leq 12 \)
4. Shoot at most 7 geese: \( x_2 \leq 7 \)
5. Total animals shot cannot exceed 15: \( x_1 + x_2 \leq 15 \)

All variables are non-negative since you cannot shoot a negative number of animals.

Thus, the symbolic representation of the problem in JSON format is:
```json
{
    'sym_variables': [('x1', 'ducks'), ('x2', 'geese')],
    'objective_function': '5*x1 + 6*x2',
    'constraints': [
        'x1 >= 5',
        'x2 >= 3',
        'x1 <= 12',
        'x2 <= 7',
        'x1 + x2 <= 15'
    ]
}
```

To solve this problem using Gurobi in Python, we can use the following code:
```python
from gurobipy import *

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

# Define variables
x1 = m.addVar(lb=5, ub=12, vtype=GRB.INTEGER, name="ducks")
x2 = m.addVar(lb=3, ub=7, vtype=GRB.INTEGER, name="geese")

# Set the objective function
m.setObjective(5*x1 + 6*x2, GRB.MAXIMIZE)

# Add constraints
m.addConstr(x1 + x2 <= 15, "total_animals")

# Optimize model
m.optimize()

# Print solution
if m.status == GRB.OPTIMAL:
    print(f"Optimal solution: {x1.varName} = {int(x1.x)}, {x2.varName} = {int(x2.x)}")
    print(f"Maximum points: {m.objVal}")
else:
    print("No optimal solution found")
```