Example #1
0
    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
Example #2
0
    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, '')
Example #3
0
    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
Example #4
0
    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')
Example #5
0
    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)
Example #6
0
    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')
Example #7
0
    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)