four_engine.py 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139
  1. #!/usr/bin/python3
  2. def drawChequerboard(status,players=[],space="░",toprow="1234567"):
  3. bstr = ""
  4. bstr += toprow+"\n"
  5. for row in status:
  6. for cell in row:
  7. if cell == 0:
  8. bstr += space
  9. else:
  10. try:
  11. bstr += players[cell-1]
  12. except IndexError:
  13. bstr += str(cell)
  14. bstr += "\n"
  15. return bstr
  16. def initChequerboard(cols=7,rows=6):
  17. board = list()
  18. for row in range(rows):
  19. board.append([0]*7)
  20. return board
  21. def dropChip(board,move_str,player):
  22. failure = (False,0)
  23. try:
  24. move = int(move_str)-1
  25. except ValueError:
  26. return failure
  27. if move < 0 or move >= len(board[0]):
  28. return failure
  29. free_space = -1
  30. for row in board:
  31. if row[move] != 0:
  32. break
  33. else:
  34. free_space += 1
  35. if free_space == -1:
  36. return failure
  37. board[free_space][move] = player
  38. return board, checkFour(board,free_space,move)
  39. def checkFour(board,row,col):
  40. sumOr = lambda a,b : (a[0]+b[0], a[1]+b[1])
  41. orients = { "N":(1,0),"S":(-1,0),"E":(0,1),"W":(0,-1) }
  42. player = board[row][col]
  43. points = 0
  44. count = 0
  45. count += countTokens(board,orients["N"],row,col)
  46. count += countTokens(board,orients["S"],row,col)
  47. if count >= 3:
  48. points +=1
  49. count = 0
  50. count += countTokens(board,orients["E"],row,col)
  51. count += countTokens(board,orients["W"],row,col)
  52. if count >= 3:
  53. points +=1
  54. count = 0
  55. count += countTokens(board,sumOr( orients["N"],orients["E"] ),row,col )
  56. count += countTokens(board,sumOr( orients["S"],orients["W"] ),row,col )
  57. if count >= 3:
  58. points +=1
  59. count = 0
  60. count += countTokens(board,sumOr( orients["N"],orients["W"] ),row,col )
  61. count += countTokens(board,sumOr( orients["S"],orients["E"] ),row,col )
  62. if count >= 3:
  63. points +=1
  64. return points
  65. def countTokens(board,check,row,col):
  66. player = board[row][col]
  67. offX = check[0]
  68. offY = check[1]
  69. count = 0
  70. while True:
  71. 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) :
  72. break
  73. else:
  74. count += 1
  75. offX += check[0]
  76. offY += check[1]
  77. return count
  78. def checkPly(board,row,col,player):
  79. if row < 0 or col < 0:
  80. return False
  81. try:
  82. if board[row][col] == player:
  83. return True
  84. else:
  85. return False
  86. except IndexError:
  87. return False
  88. if __name__ == "__main__":
  89. board = initChequerboard()
  90. match = True
  91. player = 1
  92. points_1 = 0
  93. points_2 = 0
  94. while match:
  95. print( drawChequerboard(board) )
  96. print("Player 1:"+str(points_1))
  97. print("Player 2:"+str(points_2))
  98. move = input("Player "+str(player)+" turn:")
  99. if move == "q":
  100. print("quitting")
  101. quit()
  102. valid, point = dropChip(board,move,player)
  103. if not(valid):
  104. print("Invalid move")
  105. else:
  106. board = valid
  107. if player == 2:
  108. points_2 += point
  109. player = 1
  110. else:
  111. points_1 += point
  112. player = 2
  113. match = False
  114. for row in board:
  115. for cell in row:
  116. if cell == 0:
  117. match = True
  118. print("Match over")
  119. print( drawChequerboard(board) )
  120. print("Player 1 scored "+str(points_1)+" points")
  121. print("Player 2 scored "+str(points_2)+" points")
  122. if points_1 > points_2:
  123. print("Player 1 won!")
  124. elif points_2 > points_1:
  125. print("Player 2 won!")
  126. else:
  127. print("Draw!")