game.py 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162
  1. import random, string, json
  2. from tracemalloc import start
  3. global word_list
  4. global letters_dict
  5. with open("wordlist.txt", "r") as f:
  6. word_list = [i.strip() for i in f.readlines()]
  7. with open("letters.json", "r") as f:
  8. letters_dict = json.load(f)
  9. def randomword(length):
  10. letters = string.ascii_lowercase
  11. return "".join(random.choice(letters) for i in range(length))
  12. class Player:
  13. def __init__(self, name):
  14. self.id = randomword(10)
  15. self.name = name
  16. self.tiles = []
  17. self.score = 0
  18. class Game:
  19. def __init__(self, name, hand_size, match_amount, turns, id=None):
  20. self.id = id or randomword(5)
  21. self.player1 = Player(name)
  22. self.tile_pile = []
  23. self.discard_pile = []
  24. self.current_word = ""
  25. self.hand_size = hand_size
  26. self.match_amount = match_amount
  27. self.turns = turns
  28. for key, value in letters_dict.items():
  29. for i in range(value["occurrence"]):
  30. self.tile_pile.append(key)
  31. def player_join(self, name):
  32. self.player2 = Player(name)
  33. def start_game(self):
  34. for i in range(self.hand_size):
  35. tile = random.choice(self.tile_pile)
  36. self.player1.tiles.append(tile)
  37. self.tile_pile.remove(tile)
  38. tile = random.choice(self.tile_pile)
  39. self.player2.tiles.append(tile)
  40. self.tile_pile.remove(tile)
  41. starting_player = random.choice([self.player1, self.player2])
  42. self.current_player = starting_player
  43. self.starting_player = starting_player
  44. return starting_player
  45. def change_turn(self):
  46. if self.current_player != self.starting_player:
  47. self.turns -= 1
  48. if not self.turns:
  49. return False
  50. self.current_player = (
  51. self.player1
  52. if self.current_player == self.player2
  53. else self.player2
  54. )
  55. while len(self.current_player.tiles) < self.hand_size:
  56. tile = random.choice(self.tile_pile)
  57. self.current_player.tiles.append(tile)
  58. self.tile_pile.remove(tile)
  59. if not self.tile_pile:
  60. self.tile_pile = self.discard_pile
  61. self.discard_pile = []
  62. return True
  63. def check_word(self, word):
  64. final_word = {
  65. "valid": False,
  66. "word": [{"letter": letter, "status": 0} for letter in list(word)],
  67. }
  68. score = 0
  69. for letter in list(word):
  70. score += int(letters_dict[letter]["tile_value"])
  71. final_word["score"] = score
  72. if word not in word_list:
  73. return final_word
  74. temp_player_tiles = self.current_player.tiles.copy()
  75. remaining_letters = []
  76. for item in final_word["word"]:
  77. if item["letter"] in temp_player_tiles:
  78. item["status"] = 1
  79. temp_player_tiles.remove(item["letter"])
  80. else:
  81. remaining_letters.append(item["letter"])
  82. match_count = 0
  83. previous_word = list(self.current_word)
  84. for letter in remaining_letters.copy():
  85. if letter in previous_word:
  86. remaining_letters.remove(letter)
  87. previous_word.remove(letter)
  88. for item in final_word["word"]:
  89. if item["letter"] == letter and not item["status"]:
  90. item["status"] = 2
  91. match_count += 1
  92. # TODO: Somehow remain invalid if there's anything left in the remaining_letters list
  93. if match_count < self.match_amount:
  94. for item in final_word["word"]:
  95. if item["letter"] in previous_word and item["status"] == 1:
  96. item["status"] = 2
  97. match_count += 1
  98. temp_player_tiles.append(item["letter"])
  99. if match_count == self.match_amount:
  100. break
  101. if (
  102. match_count == self.match_amount or not self.current_word
  103. ) and not remaining_letters:
  104. final_word["valid"] = True
  105. if final_word["valid"]:
  106. self.current_player.score += final_word["score"]
  107. self.current_word = word
  108. self.current_player.tiles = temp_player_tiles
  109. return final_word
  110. def discard_letter(self, letter):
  111. if letter not in self.current_player.tiles:
  112. return False
  113. self.current_player.remove(letter)
  114. self.change_turn()
  115. return True
  116. if __name__ == "__main__":
  117. game = Game("testplayer", 7, 2, 2)
  118. game.player_join("testplayer2")
  119. game.start_game()
  120. while True:
  121. print("Turns: " + str(game.turns))
  122. print(game.current_player.tiles)
  123. word = game.check_word(input("Word: "))
  124. print(word)
  125. if word["valid"]:
  126. if not game.change_turn():
  127. break
  128. pass