def get_best_word(self, game): turn = WordsmushTurn(game) try: word_str = next(word for word in self.playable_words[game] if game.is_playable_word(word) and len(word) > 2) self.playable_words[game].remove(word_str) tiles_by_letter = game.tiles_by_letter() for word_char in word_str: turn.add_tile(next(tile for tile in tiles_by_letter[word_char] if tile not in turn.tiles)) except StopIteration: # no more words left to play! turn.resign = True return turn
def test_clear_tiles(self): word = WordsmushTurn(self.game) word.clear_tiles() self.assertEqual(word.word, '') word.add_tile(self.game.get_tile(2,0)) word.add_tile(self.game.get_tile(0,0)) word.add_tile(self.game.get_tile(1,0)) self.assertEqual(word.word, 'cab') word.clear_tiles() self.assertEqual(word.word, '')
def take_turn(self, game): turn = WordsmushTurn(game) move_complete = False move_rx = re.compile('^(help|play|pass|resign|rem|clear|\d,\d)', re.IGNORECASE) tile_rx = re.compile('^(?P<x>\d),(?P<y>\d)( (?P<pos>\d))?', re.IGNORECASE) while not move_complete: move_text = '' print(game) print(turn) while not move_rx.match(move_text): move_text = loop_input("Enter move or 'help'") if move_text == 'play': if game.is_playable(turn): game.play(self, turn) move_complete = True else: print("'%s' is not a playable word." % turn.word.upper()) elif move_text == 'help': self.print_help() elif move_text == 'clear': turn.clear_tiles() elif move_text == 'pass': move_complete = True elif move_text == 'resign': turn.resign = True game.play(self, turn) move_complete = True elif move_text.startswith('rem'): rem_tile = int(move_text[3:]) turn.remove_tile_at_position(rem_tile-1) else: # add tile tile_move = tile_rx.match(move_text) if tile_move: tile_move_dict = tile_move.groupdict() tile_x = int(tile_move_dict.get('x')) tile_y = int(tile_move_dict.get('y')) tile_pos = tile_move_dict.get('pos') tile_pos = int(tile_pos)-1 if tile_pos else None try: game_tile = game.get_tile(tile_x-1, tile_y-1) turn.add_tile(game_tile, tile_pos) except IndexError: print("No such tile.") return turn
def test_add_tile(self): word = WordsmushTurn(self.game) word.add_tile(self.game.get_tile(0,0)) word.add_tile(self.game.get_tile(1,0)) self.assertEqual(word.word, 'ab') word.add_tile(self.game.get_tile(2,0), position=0) self.assertEqual(word.word, 'cab') # test moving a tile from one position to another word.add_tile(self.game.get_tile(1,0), position=0) word.add_tile(self.game.get_tile(2,0), position=2) word.add_tile(self.game.get_tile(0,2), position=3) self.assertEqual(word.word, 'back')
def test_calculate_protected(self): self.game = game_utils.get_board(['f', 'r', 'a', 'b', 'c', 'n', 'a', 'h', 'i', 'j', 't', 'i', 'm', 'n', 'o', 'c', 's', 'g', 'x', 'q', 'u', 'v', 'w', 'y', 'z']) word = WordsmushTurn(self.game) word.add_tile(self.game.get_tile(0,0)) word.add_tile(self.game.get_tile(1,0)) word.add_tile(self.game.get_tile(1,1)) word.add_tile(self.game.get_tile(0,1)) word.add_tile(self.game.get_tile(0,2)) word.add_tile(self.game.get_tile(1,2)) word.add_tile(self.game.get_tile(0,3)) self.assertTrue([tile.letter for tile in word.tiles] == list('frantic')) self.game.play(self.game.player1, word) self.assertTrue(all(tile.owner == self.game.player1 for tile in word.tiles)) protected_tile1 = self.game.get_tile(0,0) protected_tile2 = self.game.get_tile(0,1) self.assertTrue(protected_tile1.status == WordsmushTile.PROTECTED) self.assertTrue(protected_tile2.status == WordsmushTile.PROTECTED) # now test that a second play will not capture a protected tile word2 = WordsmushTurn(self.game) word2.add_tile(self.game.get_tile(0,0)) word2.add_tile(self.game.get_tile(1,1)) word2.add_tile(self.game.get_tile(0,1)) word2.add_tile(self.game.get_tile(2,0)) word2.add_tile(self.game.get_tile(0,2)) word2.add_tile(self.game.get_tile(1,2)) word2.add_tile(self.game.get_tile(0,3)) self.assertTrue([tile.letter for tile in word2.tiles] == list('fanatic')) self.game.play(self.game.player2, word2) self.assertTrue(protected_tile1.owner == self.game.player1) self.assertTrue(protected_tile2.owner == self.game.player1)
def test_remove_tile_at_position(self): word = WordsmushTurn(self.game) word.add_tile(self.game.get_tile(2,0)) word.add_tile(self.game.get_tile(0,0)) word.add_tile(self.game.get_tile(2,3)) word.add_tile(self.game.get_tile(4,3)) word.add_tile(self.game.get_tile(4,2)) word.add_tile(self.game.get_tile(3,2)) self.assertEqual(word.word, 'carton') # remove from beginning word.remove_tile_at_position(0) self.assertEqual(word.word, 'arton') # remove from end word.remove_tile_at_position(4) self.assertEqual(word.word, 'arto') # remove from middle word.remove_tile_at_position(2) self.assertEqual(word.word, 'aro')
def test_get_points(self): word_cat = WordsmushTurn(self.game) word_cat.add_tile(self.game.get_tile(2,0)) word_cat.add_tile(self.game.get_tile(0,0)) word_cat.add_tile(self.game.get_tile(4,3)) self.game.play(self.game.player1, word_cat) self.assertTrue(self.game.get_points(self.game.player1) == 3) self.assertTrue(self.game.get_points(self.game.player2) == 0) word_bat = WordsmushTurn(self.game) word_bat.add_tile(self.game.get_tile(1,0)) word_bat.add_tile(self.game.get_tile(0,0)) word_bat.add_tile(self.game.get_tile(4,3)) self.game.play(self.game.player2, word_bat) self.assertTrue(self.game.get_points(self.game.player1) == 1) self.assertTrue(self.game.get_points(self.game.player2) == 3) word_fabric = WordsmushTurn(self.game) word_fabric.add_tile(self.game.get_tile(0,1)) word_fabric.add_tile(self.game.get_tile(0,0)) word_fabric.add_tile(self.game.get_tile(1,0)) word_fabric.add_tile(self.game.get_tile(2,3)) word_fabric.add_tile(self.game.get_tile(3,1)) word_fabric.add_tile(self.game.get_tile(2,0)) self.game.play(self.game.player1, word_fabric) # tile in 0,0 (a) is now protected self.assertTrue(self.game.get_points(self.game.player1) == 6) self.assertTrue(self.game.get_points(self.game.player2) == 1) word_cab = WordsmushTurn(self.game) word_cab.add_tile(self.game.get_tile(2,0)) word_cab.add_tile(self.game.get_tile(0,0)) word_cab.add_tile(self.game.get_tile(1,0)) self.game.play(self.game.player2, word_cab) self.assertTrue(self.game.get_points(self.game.player1) == 4) self.assertTrue(self.game.get_points(self.game.player2) == 3)