簡體   English   中英

如何使用星號創建 python 劊子手游戲

[英]How to create a python hangman game using asterisks

我迷失在這個編程任務上。 我應該制作一個劊子手游戲,從文本文件中隨機生成一個單詞(使用 FileIO),並提示用戶一次猜測一個字母,單詞中的每個字母都顯示為星號。 當用戶做出正確的猜測時,就會顯示實際的字母。 然后當用戶完成一個單詞時,它會顯示未命中的數量,並詢問用戶是否繼續玩另一個單詞。

這就是我到目前為止所擁有的。 我不知道下一步該做什么。 請幫忙!

import random 
hiddenWordList = []
words = []

def pick_word(infile):
    with open(infile) as f:
        contents_of_file = f.read()
    lines = contents_of_file.splitlines()
    line_number = random.randrange(0, len(lines))
    return lines[line_number]


def words():

    return(pick_word("vocab.txt"))

這是可能有用的東西的骨架。

def show_word(word, guessed_letters):
    guessed_letters = set(map(str.casefold, guessed_letters))
    # this is required for this minimal example, but will be a performance hit
    # better to do this when you insert the new guess into "guessed_letters"

    sanitized_word = ''.join([ch if ch.casefold() in guessed_letters else '*' for ch in word])
    print(sanitized_word)

你可以把它寫得更迫切:

from typing import Set

def show_word_explained(word: str, guessed_letters: Set[str]):
    # assume for this example that we've already casefolded all the letters in
    # guessed_letters.

    result = ''
    for letter in word:
        if letter.casefold() in guessed_letters:
            result += letter
        else:
            result += '*'
    print(result)

不過,對於有經驗的 Python 程序員來說,這性能較差且難以閱讀。


您還可以通過不每次將整個文件讀入 memory 來改進您的pick_word function。 要么通讀一遍並將其保存在 memory 中以運行您的應用程序(這會花費更多內存),要么根本不將其保存在 memory 中並讀取文件兩次——一次獲取長度,然后再次選擇文件想要(這需要更多時間)

import random
from functools import lru_cache

@lru_cache(maxsize=1)
def word_list_store_in_memory(infile):
    """
    Reads a file into memory, storing it in an least recently used cache
    """
    with open(infile) as f:
        return [word.strip() for word in f.readlines()]

def get_single_word_from_memory(infile):
    word_list = word_list_store_in_memory(infile)
    return random.choice(word_list)

def get_single_word_from_disk(infile):
    with open(infile) as f:
        num_words = len(f)
    needle = random.randrange(num_words)
    with open(infile) as f:
        # skip the lines before the selected word
        for _ in range(needle):
            next(f)
        # return the next one
        return next(f)

一旦你選擇了一個隨機詞(你似乎有一個句柄),你應該在一個單獨的 function 中完成游戲,它返回用戶找到該詞后的失敗嘗試次數。 然后創建一個調用 function 的 while 循環會更容易,打印結果並要求用另一個詞繼續:

示例游戲 function:

def hang(word):
    tried = set()
    while not tried.issuperset(word):
        print("".join(f"*{c}"[c in tried] for c in word))
        c = input("Enter a letter : ")
        if c in tried or len(c)!=1 or c<"a" or c>"z":
            print("invalid letter")
            continue
        if c not in word: print(f"Letter '{c}' not in word")
        tried.add(c)
    return len(tried.difference(word))

主循環示例:

more = "y"
while more == "y":
    word = pickRandomWord()
    missCount = hang(word)
    print(f"{missCount} missed attempts")
    more = input("Try another word ? (y/n) ")

樣品運行:

********
Enter a letter : e
e*e*****
Enter a letter : l
ele*****
Enter a letter : p
elep****
Enter a letter : r
Letter 'r' not in word
elep****
Enter a letter : m
Letter 'm' not in word
elep****
Enter a letter : n
elep**n*
Enter a letter : t
elep**nt
Enter a letter : a
elep*ant
Enter a letter : h
2 missed attempts
Try another word ? (y/n) n

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM