很难找到不知道如何玩 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 结构
发表评论 取消回复