Maximize probability of hitting a square in a board game. I was trying to create a board game for Christmas where we all try and steal each others presents, I ran into a problem however where I want to maximize the amount of presents in circulation and stealing of presents that occurs.
Imagine a board game with 7 players.
The game is played on a rotating wheel with squares along the edges. Every player has 2 arrows pointing at the circle. One with his own color, one with the color of another player.
Every turn A dice is rolled and and the circle is rotated according to the dice trow. For all the players:
If the arrow with his own color is pointing at an unclaimed square, he can claim it with his color.
If the arrow with his own color is pointing at a square which was previously claimed by him, he gets a point (a present) and the square becomes blank again.
If the arrow with the other players color is pointing at a square with that color, he can steal a point from that player (if he has any) and the square becomes blank again.
How do you maximize the amount of point moving around on the board when you can vary the amount of squares, dices, maximum number of claims, etc?
Not looking for an ultimate solution but what would be a range in which I would have to place these variables?
 A: I used python with jupyter notebook. You can install that and copy the following code into a notebook in case you want to try other combinations.
import numpy as np
from scipy import stats, special, misc
import matplotlib.pyplot as plt
%matplotlib notebook

# number of players and presents, range of squares and dice
n_pl = 7
n_pr = n_pl*2
n_sq_range = np.arange(2*n_pl,4*n_pl+1,4)
n_d_range = np.arange(1,3)
# max points
n_mp_range = np.arange(2,5)
# number of games played
n_game = 1000

print('\\begin{array} {|c|c|c|c|c|c|}')
print('\hline')
print('n_{sq} & n_d & n_{mp} & rolls & xfer & std pts \\\ \hline')

for n_mp in n_mp_range:
    for n_d in n_d_range:
        for n_sq in n_sq_range:
            roll_result=[]
            xfer_result=[]
            stdev_result=[]
            for i_game in range(n_game):

                # points transferred
                xfer = 0
                # colour for player i = i, other colour is (i+1)%n_pl
                # assign players arrow positions. other colour position is pos+1
                positions = np.arange(0,n_sq,2)
                np.random.shuffle(positions)
                pos=[]
                for i_pl in range(n_pl):
                    pos.append(positions[i_pl])
                pts=n_pl*[0]
                active = n_pl*[1]

                board=n_sq*[-1]
                n_roll = 0; bpt = 0
                while np.sum(active)>1 and np.sum(pts)<n_pr and n_roll<1000:
                    #if (i_game==0):
                    #    print(board)
                    n_roll += 1
                    bpt += np.sum(np.random.randint(1, 6+1, n_d))
                    for i_pl in range(n_pl):
                        if board[(pos[i_pl]+bpt)%n_sq] == -1:
                            board[(pos[i_pl]+bpt)%n_sq] = i_pl
                        elif board[(pos[i_pl]+bpt)%n_sq] == i_pl:
                            pts[i_pl]+=1
                            board[(pos[i_pl]+bpt)%n_sq] = -1
                        if board[(pos[i_pl]+1+bpt)%n_sq] == (i_pl+1)%n_pl:
                            if pts[(i_pl+1)%n_pl]>0:
                                pts[(i_pl+1)%n_pl] -= 1
                                pts[i_pl]+=1
                                xfer += 1
                        if pts[i_pl]>=n_mp:
                            active[i_pl]=0
                            for i in range(n_sq):
                                if board[i]==i_pl:
                                    board[i]=-1
                roll_result.append(n_roll)
                xfer_result.append(xfer)
                stdev_result.append(np.std(pts))

#            print('n_sq',n_sq,'n_d',n_d,'n_mp',n_mp,'rolls= %4.1f +/-%4.1f, xfer= %4.1f +/-%4.1f, std= %4.2f'
#                  %(np.average(roll_result),np.std(roll_result),
#                    np.average(xfer_result),np.std(xfer_result),
#                    np.average(stdev_result)))

            print('%d & %d & %d & %4.1f \pm%4.1f & %4.1f \pm%4.1f & %4.2f \\\ \hline'
                  %(n_sq,n_d,n_mp,np.average(roll_result),np.std(roll_result),
                    np.average(xfer_result),np.std(xfer_result),
                    np.average(stdev_result)))

print('\end{array}')

