很难找到不知道如何玩 Scrabble 。如果有人不熟悉这个游戏,这里有一个简短的解释:

拼字游戏由 2 到 4 名玩家在一块方形棋盘上进行,棋盘上有 15×15 个格子,每个格子可容纳一个字母牌。棋盘上标有“高级”格子,这些格子可乘以所获得的分数;每个字母牌都有自己指定的数字分数。在拼字游戏开始时,每个玩家选择 7 个字母牌。

在本文中,我将尝试提供一些简单的例子,说明 Python 编程语言如何帮助您玩(并赢得)游戏。

当然,这些示例不会给熟悉并有编程经验的人留下深刻的印象,但它们绝对足够简单,可以鼓励那些经验较少的人学习更多。

当您开始玩拼字游戏时,您可以用现有的字母创造出什么单词?

显然,有很多方法可以快速获得一些答案。我们可以尝试在 SQL 中做到这一点:

创建一个包含数据库中的单词的表和一个包含排列字符串的表,或者我们可以尝试其他更智能的方法。

但是,与从其他编程语言派生的解决方案相比,SQL 中的每个解决方案都变得更加复杂。因此,我们不要使用 SQL,而是尝试使用 Python:

假设我们有一个架子,上面有字母 ['f', 'g', 'f', 'i', 'r', 'a', 'e'],我们想把所有字母都放在拼字游戏板上。

是否存在一个由 7 个字母组成的单词,是架子上这些字母的排列?

在包含字典文件的类别中,运行 Python 控制台。


>>> import itertools

>>> with open('sowpods.txt') as f:

>>> words = set(word.strip().lower() for word in f)

>>> perms = set(''.join(letters) for letters in 
itertools.permutations(['f', 'g', 'f', 'i', 'r', 'a', 'e']))

>>> res = [word for word in perms if word in words]


然而,这还不够。可以检查所有组合并为每个正确的单词得分。让我们尝试用两种方式来实现:1)连接到数据库和 2)仅使用 Python。

要连接到数据库,请使用 Psycopg2 ,它是 PostgreSQL PostgreSQL

我们将在数据库中存储一个单词列表。 

以下 perl 单行代码将负责转换为
INSERT INTO dict VALUES ('word');


perl -pe "s/'/''/g;s/.*/INSERT INTO dict VALUES ('$&');/" words.txt > words.sql


将在 Python 端创建单词组合以及每个单词的分数。

您可以通过键入以下内容在 shell 中运行以下代码: python scrabble.py your_letters .


import sys
import itertools
import psycopg2
 
rack = sys.argv[1]

scores = {"A": 1, "C": 3, "B": 3, "E": 1, "D": 2, "G": 2,
          "F": 4, "I": 1, "H": 4, "K": 5, "J": 8, "M": 3,
          "L": 1, "O": 1, "N": 1, "Q": 10, "P": 3, "S": 1,
          "R": 1, "U": 1, "T": 1, "W": 4, "V": 4, "Y": 4,
          "X": 8, "Z": 10}

def compute_score(word):
    return sum([scores[letter.upper()] for letter in word])
 
candidates = set()

for i in range(1, len(rack) + 1):
    for combination in itertools.combinations(rack, i):
        candidates |= {''.join(perm) for perm in itertools.permutations(combination)}

conn = psycopg2.connect("dbname=scrabble user=patrycja")
cur = conn.cursor()

correct_words = []

for word in candidates:
    cur.execute("select count(*) from words where word='{}'".format(word))

    if cur.fetchone()[0] == 1:
        correct_words.append((word, compute_score(word)))

for word, score in correct_words:
    print(str(score) + " " + word)

cur.close()
conn.close()


使用仅限 Python 的解决方案,将从文件中读取字典中的单词。


import sys
import itertools
 
rack = sys.argv[1]

scores = {"A": 1, "C": 3, "B": 3, "E": 1, "D": 2, "G": 2,
          "F": 4, "I": 1, "H": 4, "K": 5, "J": 8, "M": 3,
          "L": 1, "O": 1, "N": 1, "Q": 10, "P": 3, "S": 1,
          "R": 1, "U": 1, "T": 1, "W": 4, "V": 4, "Y": 4,
          "X": 8, "Z": 10}

def compute_score(word):
    return sum([scores[letter.upper()] for letter in word])
 
candidates = set()

for i in range(1, len(rack) + 1):
    for combination in itertools.combinations(rack, i):
        candidates |= {''.join(perm) for perm in itertools.permutations(combination)}

with open('sowpods.txt') as f:
    dictionary = {word.strip().lower() for word in f}

correct_words = dictionary & candidates
correct_words = [(word, compute_score(word)) for word in correct_words]

correct_words.sort(key=lambda word: word[1], reverse=True)

for word, score in correct_words:
    print(str(score) + " " + word)


乍一看,仅使用 Python 的解决方案看起来更好。在第一种方法中,您需要管理数据库。另一方面,当我们拥有大量无法本地存储的数据时,数据库可能会有所帮助。也可以通过 Web 服务来实现,但这是另一篇文章的主题。

了解了这些可能性后,您就可以开始编写自己的更高级的拼字游戏作弊器了。

对于 Python 新手,我推荐这个循序渐进的教程,它提供了开发此类程序所需的基本 Python 结构

点赞(0) 打赏

评论列表 共有 0 条评论

暂无评论

微信小程序

微信扫一扫体验

立即
投稿

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部