123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139 |
- #!/usr/bin/python3
- def drawChequerboard(status,players=[],space="░",toprow="1234567"):
- bstr = ""
- bstr += toprow+"\n"
- for row in status:
- for cell in row:
- if cell == 0:
- bstr += space
- else:
- try:
- bstr += players[cell-1]
- except IndexError:
- bstr += str(cell)
-
- bstr += "\n"
- return bstr
-
- def initChequerboard(cols=7,rows=6):
- board = list()
- for row in range(rows):
- board.append([0]*7)
- return board
- def dropChip(board,move_str,player):
- failure = (False,0)
- try:
- move = int(move_str)-1
- except ValueError:
- return failure
- if move < 0 or move >= len(board[0]):
- return failure
- free_space = -1
- for row in board:
- if row[move] != 0:
- break
- else:
- free_space += 1
- if free_space == -1:
- return failure
- board[free_space][move] = player
- return board, checkFour(board,free_space,move)
- def checkFour(board,row,col):
- sumOr = lambda a,b : (a[0]+b[0], a[1]+b[1])
- orients = { "N":(1,0),"S":(-1,0),"E":(0,1),"W":(0,-1) }
- player = board[row][col]
- points = 0
- count = 0
- count += countTokens(board,orients["N"],row,col)
- count += countTokens(board,orients["S"],row,col)
- if count >= 3:
- points +=1
- count = 0
- count += countTokens(board,orients["E"],row,col)
- count += countTokens(board,orients["W"],row,col)
- if count >= 3:
- points +=1
- count = 0
- count += countTokens(board,sumOr( orients["N"],orients["E"] ),row,col )
- count += countTokens(board,sumOr( orients["S"],orients["W"] ),row,col )
- if count >= 3:
- points +=1
- count = 0
- count += countTokens(board,sumOr( orients["N"],orients["W"] ),row,col )
- count += countTokens(board,sumOr( orients["S"],orients["E"] ),row,col )
- if count >= 3:
- points +=1
-
- return points
- def countTokens(board,check,row,col):
- player = board[row][col]
- offX = check[0]
- offY = check[1]
- count = 0
- while True:
- if row+offY < 0 or row+offY >= len(board[row])-1 or col+offX < 0 or col+offX > len(board) or (board[row+offY][col+offX] != player) :
- break
- else:
- count += 1
- offX += check[0]
- offY += check[1]
- return count
- def checkPly(board,row,col,player):
- if row < 0 or col < 0:
- return False
- try:
- if board[row][col] == player:
- return True
- else:
- return False
- except IndexError:
- return False
- if __name__ == "__main__":
- board = initChequerboard()
- match = True
- player = 1
- points_1 = 0
- points_2 = 0
- while match:
- print( drawChequerboard(board) )
-
- print("Player 1:"+str(points_1))
- print("Player 2:"+str(points_2))
- move = input("Player "+str(player)+" turn:")
- if move == "q":
- print("quitting")
- quit()
- valid, point = dropChip(board,move,player)
- if not(valid):
- print("Invalid move")
- else:
- board = valid
- if player == 2:
- points_2 += point
- player = 1
- else:
- points_1 += point
- player = 2
- match = False
- for row in board:
- for cell in row:
- if cell == 0:
- match = True
- print("Match over")
- print( drawChequerboard(board) )
- print("Player 1 scored "+str(points_1)+" points")
- print("Player 2 scored "+str(points_2)+" points")
- if points_1 > points_2:
- print("Player 1 won!")
- elif points_2 > points_1:
- print("Player 2 won!")
- else:
- print("Draw!")
|