1

このボグルゲームのPythonチャレンジを学校で終わらせようとしています。そして、16個のランダムな文字でボードを作成するドローボード関数を作成しました。def関数を使用して、単語の長さに応じて、単語を入力してスコアを付けるようにユーザーに求めるにはどうすればよいですか?それが完了すると、ゲームは正しく動作するはずです。どんな助けでも大歓迎です:)

import random

def loadwords ():
    print "Loading word list from file.. "
    wordList = []
    inFile = open ('words.txt','r')
    for line in inFile:
        wordList.append(line.strip().lower())
    #inFile : locates file in the folder, opens it
    #wordlist: list of the words (strings)
    print " " , len(wordList), "words loaded"
    inFile.close()
    return wordList

def spellCheck (word, wordList):
    if (word in wordList) == True:
        return True
    else:
        return False

def drawBoard (randomLetters):

    '''Takes a randomList of 16 characters
    Prints out a 4 x 4 grid'''

    print " %s %s %s %s " %(randomLetters [0], randomLetters [1], randomLetters [2], randomLetters [3])
    print " %s %s %s %s " %(randomLetters [4], randomLetters [5], randomLetters [6], randomLetters [7])
    print " %s %s %s %s " %(randomLetters [8], randomLetters [9], randomLetters [10], randomLetters [11])
    print " %s %s %s %s " %(randomLetters [12], randomLetters [13], randomLetters [14], randomLetters [15])

def wordinput ():
    #asks user to input the longest word they can from grid
    wordinput = raw_input ("Enter a word made up of the letters in the 4x4 table")
    for letters in wordinput:
        letters == randomLetters

def randomLetters ():
    letters = []
    alphabet = ['a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','v','w','x','y','z']
    for i in range (0,16,1):
        letters.append(random.choice(alphabet))
    return letters

dictionary = loadwords()
letterList = randomLetters()
drawBoard(letterList)
wordinput(randomLetters)
4

3 に答える 3

2

raw_input(Python 2 の場合) またはinput(Python 3 の場合) 文字列を読み取ることができます。

次に、すべての文字がアルファベットに含まれているかどうかを確認する必要があります...

def wordInLetter(word, letters):
    for i in range(word):
        if word[i] not in letters:
             return False
    return True

または短い:

def wordInLetter(word, letters):
    return all(letter in letters for letter in word)

しかし、待ってください。1 つの文字を複数回使用できるようにする必要はありません。

Counterを使用して、すべての文字がレター バッグに入っている回数を追跡し、そこから作業を進めてみましょう。

from collections import Counter
def wordInLetter(word, letters):
    available = Counter(letters)
    for letter in word:
        if available[letter] == 0:
             return False
        available[letter] -= 1
    return True

これはうまくいくようです。これがあなたが必要とするものであることを願っています。

In [3]: wordInLetter('kos','akos')
Out[3]: True

In [4]: wordInLetter('kos','ako')
Out[4]: False

In [5]: wordInLetter('koss','akos')
Out[5]: False

編集

で結合できるかどうかだけでなく、隣接する文字を一致さwordせることで結合できるかどうかlettersも知りたいのです。だから別の試み:

import math
def wordInLetterSearch(word, letters, startX, startY):
    # Assume: letters is a list of X letters, where X is a k*k square
    k = int(len(letters) ** 0.5)

    if len(word) == 0:
        return True

    def letter(x, y):
        return letters[x + y*k]

    def adjacent(x, y):
        if x > 0:
           yield x-1, y
        if x < k-1:
           yield x+1, y
        if y > 0:
           yield x, y-1
        if y < k-1:
           yield x, y+1

    # try to move in all 4 directions
    return any(letter(x2, y2) == word[0] and wordInLetterSearch(word[1:], letters, x2, y2)
               for x2, y2 in adjacent(startX, startY))

def wordInLetter(word, letters):
    k = int(len(letters) ** 0.5)

    def coords(i):
        return i%k, i/k

    # look for a starting point
    return any(letter == word[0]
                    and wordInLetterSearch(word[1:], letters,
                                           coords(i)[0], coords(i)[1])
               for i, letter in enumerate(letters)) coords(i)[1])
                   for i, letter in enumerate(letters))

これは少し複雑です。基本的には 2 段階の検索です。最初に開始点 (letters文字が単語の最初の文字と一致する内部の位置) を探し、次に蛇のように可能な場合は隣接するフィールドに再帰的に移動します。

Boggle のルールに正確に一致させるには、少し変更する必要があります。

  • adjacent対角線も許可するように変更します (簡単)。
  • 同じ場所を 2 回訪れるのを防ぎます (medium; ヒント: パラメータを に追加しwordInLetterSearch、 を使用しますset)。

これらは演習として残しておきます。

于 2012-11-20T14:50:07.553 に答える
1

これが別の変種です。読みやすいはずですが、考え方は同じです。単純なバックトラックです。場合によっては、呼び出し側(次のステップを実行しない)で反復を中止する方が簡単な場合もあります(反復ごとに、前提条件を確認し、無効な場合は中止する)場合もあります。

def wordInBoardIter(letters, word, x, y):
    n = int(len(letters)**0.5)
    if word == "": return True # empty - all letters are found
    if x<0 or y<0 or x>=n or y>= n: return False #outside of board
    if letters[x+y*n] != word[0]: return False # we are looking at the wrong position
    # one step further:
    return any(wordInBoardIter(letters, word[1:], x+dx,y+dy) for dx,dy in [(1,0), (0,1), (-1,0), (0,-1)])


def wordInBoard(letters, word):
    n = int(len(letters)**0.5)
    return any(any(wordInBoardIter(letters, word, x,y) for x in range(n)) for y in range(n))

if __name__ == '__main__':
    letters = ['a', 'h', 'e', 'l',
               'x', 'd', 'l', 'l',
               'y', 'v', 'r', 'o',
               'z', 'w', 'o', 'w']
    print "hello     : %s" % ("found" if wordInBoard(letters, "hello") else "not found")
    print "helloworld: %s" % ("found" if wordInBoard(letters, "helloworld") else "not found")
    print "foobar    : %s" % ("found" if wordInBoard(letters, "foobar") else "not found")

このバージョンにも同じ演習があります(対角線のタイルと同じ文字の2回の再利用を禁止します)。

于 2012-11-20T17:01:44.677 に答える
0

私は myslef をあまりプレイしていませんが、これを行うために使用できる解決策は、ユーザーが入力した単語を取得し、len()コマンドを使用して単語の長さを返すことです。次に、その長さを取り、スコアを付けます。以下は基本的な例です (ゲームのルールに合わせて変更してください)。

def wordinput ():
    #asks user to input the longest word they can from grid
    wordinput = raw_input ("Enter a word made up of the letters in the 4x4 table")
    for letters in wordinput:
        letters == randomLetters
    scoreWord(wordInput)

def scoreWord(word)
    #finds the amount of characters in the word
    wordLength = len(word)
    #multiplies the maunt of letters in the word by two to get the score
    #(not sure how boggle scoring works)
    score = wordLength * 2
于 2012-11-20T14:49:33.150 に答える