Four in a row

Run Settings
LanguagePython
Language Version
Run Command
# usage: # width and height # defines the width and height of the board (should only be set when not playing, before init is called) # player # 1 or 2 showing whos turn it is (player id), player 1 starts # board # current board state. used as board[x][y], containing 0 if empty, or player id # winner # 0 if no winner, else player id # state # "NotInitialized" before first init, "Playing" while playing and "Tie", "Player1Won" or "Player2Won" if the game has ended # init() # starts a new game # get_available_cols() # returns a list of all possible values of 'col', used in drop_disc(col) # drop_disc(col) # this drops a disc for current player in column 'col' (index 0) # functions used "behind the scenes" # set_winner() # checks if the grid contains a winner and, if that is the case, sets the "winner" variable to that player # resolve_state() # sets state to a winning state if state is "Playing" and if the game should be considered over width = 7 height = 6 player = 1 board = [] winner = 0 state = "NotInitialized" def init(): global state global player global winner global board player = 1 winner = 0 state = "Playing" board = [[0] * height for _ in range(width)] def get_available_cols(): if state == "Playing": return [x for x in range(len(board)) if sum(1 for v in board[x] if v > 0) < height] else: return [] def drop_disc(col): global player if state != "Playing": return False col_height = sum([1 for x in board[col] if x > 0]) if col >= 0 and col < width and col_height < height: board[col][col_height] = player player ^= 3 resolve_state() return True # behind the scenes def set_winner(): global winner deltas = [1,2,3] for x in range(width): right = x < width - 3 for y in range(height): upper = y < height - 3 lower = y > 2 if board[x][y] > 0 and \ ((upper and 3 == sum(1 for d in deltas if board[x][y] == board[x][y + d])) or \ (right and 3 == sum(1 for d in deltas if board[x][y] == board[x + d][y])) or \ (right and upper and 3 == sum(1 for d in deltas if board[x][y] == board[x + d][y + d])) or \ (right and lower and 3 == sum(1 for d in deltas if board[x][y] == board[x + d][y - d]))): winner = board[x][y] def resolve_state(): global state if state == "Playing": set_winner() if winner > 0: state = "Player" + str(winner) + "Won" elif width == sum(1 for x in board if sum(1 for y in x if y > 0) == height): state = "Tie" # end of file
Editor Settings
Theme
Key bindings
Full width
Lines