game.py 4.4 KB

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