1

我正在做一个爱好项目。我正在尝试用 Python 制作一个刽子手游戏。到目前为止,一切都很好。只有一个问题。如果我键入一个出现在单词中的字母两次,我无法让第二个字母出现。我一直在玩弄 string.find 和 string.count 方法,但无济于事。有谁知道我会怎么做?我难住了。

#!bin/bash/python

import os
import time

word = 'megalopolis'
l = len(word)
list = []
n=0
while n!=l:
    list.append('-')
    n+=1
os.system('cls' if os.name=='nt' else 'clear')
print list

i=3

while i!=0:
    x = raw_input('Enter a letter: ')
    if x in word and x!='':
        print 'Good choice!'
        count=word.count(x)
        loc=word.find(x)
        print count 
        print loc 
        list[loc]=x
        os.system('cls' if os.name=='nt' else 'clear')
        if '-' not in list:
            break
        print list
    else:
        print 'Sorry...'
        i-=1
        if i==2:
            print 'You have '+`i`+' more chances.'
        if i==1:
            print 'You have '+`i`+' more chance!'
        time.sleep(1)
        os.system('cls' if os.name=='nt' else 'clear')
        print list

if '-' not in list:
    print 'YOU WIN!!'
else:
    print 'GAME OVER!!'

x = raw_input('press enter')
4

3 回答 3

2

如果您只需要每个字符出现的索引:

indexes = [idx for idx, ch in enumerate(word) if ch == x]

也许您应该使用Unidecode将重音保留在单词中,这可能会根据语言(如果不是英语)有用。此外,您可以使用str.lower()orstr.upper()方法来确保每个单词和试验都在相同的情况下。

string 模块有对你有用的常量(例如ascii_uppercase)。

但是,在这个游戏中,您无需担心任何索引。我为你制作了另一个版本:

#!/usr/bin/env python
from string import ascii_uppercase

word = "megalopolis".upper() # Top-secret!
trial = 3 # Total trials available (number of mistakes to lose the game)
typed = set() # Typed characters
word_letters = set(word)

while trial:
    print
    print "".join(ch if ch in typed else "-" for ch in word)

    # Winning condition
    if typed.issuperset(word_letters):
        break

    # Data input
    x = raw_input("Enter a letter: ").upper()

    # Error cases
    if len(x) != 1:
        print "Invalid input."
        continue
    if x in typed:
        print "Already typed."
        continue
    if x not in ascii_uppercase:
        print "What you typed isn't a letter."
        continue

    # Valid data cases
    typed.add(x)
    if x in word:
        print "Good choice!"
    else:
        print "{} not found!".format(x),
        trial -= 1
        if trial == 1:
            print "You have one more chance!"
        elif trial > 1:
            print "You have {} more chances.".format(trial)
        else:
            print 'Sorry...'

# Ending message
print
if trial:
    print "YOU WIN!!"
else:
    print "GAME OVER!!"
  1. Hashbang:你的 shebang 通常应该以“#!/”开头。您可能使用的是 Windows,因此您没有使用“bin”作为相对目录。
  2. l应避免将“l” /作为变量名!它可能被视为一个或更低的“L”(PEP8),甚至是一个管道“|”。PS:在这个项目的开头,我在这里输入了两次相同的字母。
  3. 这里没有必要使用“list”作为变量名,也不应该这样做,因为这是一个内置名称。
  4. 像 "txt" * 3 这样的乘法返回字符串和列表的 "txttxttxt"(它重复数据)
  5. “cls”和“clear”都没有在这里工作,显示

    “未设置 TERM 环境变量。”

    而不是清除控制台屏幕。我用一个空的“打印”替换了这些,并删除了睡眠时间。如果您想从控制台调用某些内容,请查找子进程(尽管如果需要进行一些 CLI 可视化,我也会查找curses )。

  6. 假设x是一个字符串。当x == ""bool(x)False,否则bool(x)True
  7. 假设x是一个整数。当x == 0bool(x)False,否则bool(x)True
  8. 避免使用反引号 (`)。今天没有人在 Python 中使用它们,它们在 Python 3 中不存在,您可以使用repr内置的代替。但是,您可能想要类似str(trial),"%d" % trial"{}".format(trial).
  9. 最后一次“按回车”可能与操作系统“完成后自动关闭”行为有关,但您 [至少] 不需要将其存储在x.
  10. 我使用了生成器表达式。如果一行中间的“for”让您感到困惑,您应该在此处阅读有关列表推导的内容。Python 开发人员一直在使用生成器表达式和列表推导式,你不应该避免学习它们。
  11. 我将最初的获胜评估替换为单词最初具有的字符集和键入的字符集(均为大写)之间的比较。

如果这里有什么你不明白的地方,请提出一个新问题。

于 2013-08-16T14:58:46.380 回答
1

这个 SO 问题应该为您解决:

在Python中查找字符串中多次出现的字符串

考虑到从第一个到第二个是多么容易,它应该对单个字符和字符串一样有效。

于 2013-08-16T14:50:48.920 回答
0

所以最后,我最终这样做了:

    if x in word and x!='':

        count=word.count(x)
        loc=0
        while count==1 or count>1:
            loc=word.find(x,loc)
            list[loc]=x
            loc+=1
            count-=1  
        print 'Good choice!'

谢谢大家的帮助。我确实学到了一些东西。

于 2013-08-17T12:31:43.623 回答