definit_game(game_settings): state ={'player_turn_idx':0,'board': [-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 ]}return statedef__index(r,c):return r *7+ cdefdrop_piece(state,column):if column <0or column >7:raiseInvalidActionError("column out of bound") row_to_place_disk =Nonefor r inrange(6):if state['board'][__index(r, column)] ==-1: row_to_place_disk = rbreakif row_to_place_disk isNone:raiseInvalidActionError("column is full") state['board'][__index(row_to_place_disk, column)] = state['player_turn_idx'] state["player_turn_idx"]= (state["player_turn_idx"]+1) %2return statedefget_game_result(state):if__has_line_horizontal(state, 0):return{"game_result":"Winner","winner_idx":0}if__has_line_horizontal(state, 1):return{"game_result":"Winner","winner_idx":1}if__has_line_vertical(state, 0):return{"game_result":"Winner","winner_idx":0}if__has_line_vertical(state, 1):return{"game_result":"Winner","winner_idx":1}if__has_line_diagonal(state, 0):return{"game_result":"Winner","winner_idx":0}if__has_line_diagonal(state, 1):return{"game_result":"Winner","winner_idx":1}for value in state['board']:if value ==-1:return{"game_result":"NoWinnerYet"}return{"game_result":"Draw"}def__has_line_horizontal(state,value): board = state['board']#check horizontal locations for winfor c inrange(7-3):for r inrange(6):if board[__index(r, c)]== value and board[__index(r, c +1)]== value and board[__index(r, c +2)]== value and board[__index(r, c +3)]== value:returnTruereturnFalsedef__has_line_vertical(state,value): board = state['board']#check vertical locations for win for c inrange(7):for r inrange(6-3):if board[__index(r, c)]== value and board[__index(1+ r, c)]== value and board[__index(2+ r, c)]== value and board[__index(3+ r, c)]== value:returnTruereturnFalsedef__has_line_diagonal(state,value): board = state['board']#check negatively sloped diagonals for c inrange(7-3):for r inrange (3, 6):if board[__index(r, c)]== value and board[__index(r -1, c +1)]== value and board[__index(r -2, c +2)]== value and board[__index(r -3, c +3)]== value:returnTrue#check positively sloped diagonals for c inrange (7-3):for r inrange(6-3):if board[__index(r, c)]== value and board[__index(r +1, c +1)]== value and board[__index(r +2, c +2)]== value and board[__index(r +3, c +3)]== value:returnTruereturnFalse
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 42 initialized to -1, representing an empty 6 by 7 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 from the bottom up: • index 0 is bottom left • index 6 is bottom right • index 35 is top left • index 41 is top right */repeatedint32 board =2;}