definit_game(game_settings): state ={'player_turn_idx':0,'board': [-1] * (15*15)}return statedefplace_piece(state,index):if index <0or index >224:raiseInvalidActionError("index out of bound")if state['board'][index] !=-1:raiseInvalidActionError("someone already placed a piece here") player_idx = state['player_turn_idx'] state['player_turn_idx']= (player_idx +1) %2 state['board'][index] = player_idxreturn statedefget_game_result(state):if__has_line(state, 0):return{"game_result":"Winner","winner_idx":0}if__has_line(state, 1):return{"game_result":"Winner","winner_idx":1}for item in state['board']:if item ==-1:return{"game_result":"NoWinnerYet"}return{"game_result":"Draw"}def__has_line(state,value):for i inrange(0,15):for j inrange(0, 11):#horizontal 5, i rows, j colsfor k inrange(0, 5):if state['board'][i*15+j+k] != value:breakif k ==4:returnTrue#vertical 5, i columns, j rowsfor m inrange(0, 5):if state['board'][i+(j+m)*15] != value:breakif m ==4:returnTrue#down to left diagonal#4- 13if__diagnal_side(4, 14, state, 14, 0, value):returnTrue#down to left bottom#14-164if__diagnal_bottom(14, 179, 15, state, 14, value):returnTrue#down to right diagonal#1-10if__diagnal_side(1, 11, state, 16, 14, value):returnTrue#down to right bottom#0-150if__diagnal_bottom(0, 165, 15, state, 16, value):returnTruereturnFalsedef__diagnal_side(s,e,state,interval,remainder,value):for i inrange(s, e): k =0whileTrue:for j inrange(k, k+5):if state['board'][i + interval*j] != value:breakif j-k ==4:returnTrueif (i+(k+4)*interval) %15== remainder:break k = k+1def__diagnal_bottom(s,e,stp,state,interval,value):for i inrange(s, e, stp): k =0whileTrue:for j inrange(k, k+5):if state['board'][i + interval*j] != value:breakif j-k ==4:returnTrueif224- (i+(k+4)*interval) <15:break k = k+1
Game state schema
message State{// Required field to indicate the player who should be making the next move// Values = 0 or 1int32 player_turn_idx =1;/* Array of size 225 initialized to -1, representing an empty 15 by 15 board. The values of board can be -1, 0, or 1. Placing a piece in index x will set the value of board[x] to the player's index. Array is row major order: index 0 is top left, index 14 is top right, index 210 is bottom left, and index 224 is bottom right.*/repeatedint32 board =2;}