第1关:字符串、列表随机取值
任务描述
本关任务:编写一个能处理本地文件的小程序。
相关知识
为了完成本关任务,你需要掌握:
1.字符串的处理
2.random 函数
3.列表的处理。
字符串常见的处理
1.去除空格 str.strip():删除字符串两边的指定字符,括号的写入指定字符,默认为空格。 str.lstrip():删除字符串左边的指定字符,括号的写入指定字符,默认空格。 str.rstrip():删除字符串右边的指定字符,括号的写入指定字符,默认空格。
>>> a=' hello '
>>> b=a.strip()
>>> print(b)
hello
>>> a=' hello '
>>> b=a.lstrip()
>>> print(b)
hello #右边空格可能看的不是很明显
>>> a=' hello '
>>> b=a.rstrip()
>>> b
' hello'
2.替换 str.replace() :方法把字符串中的 old(旧字符串) 替换成 new(新字符串),如果指定第三个参数 max ,则替换不超过 max 次。
>>> s= "Hallo World!"
>>> ret= s.replace("!"," ")
>>> print(ret)
Hallo World
3.按输入字符切割 str.split():通过指定分隔符对字符串进行切片,如果第二个参数 num 有指定值,则分割为 num+1 个子字符串。
>>> str = "this is string example....wow!!!"
>>> print(str.split( )) # 以空格为分隔符
['this', 'is', 'string', 'example....wow!!!']
>>> print(str.split('i',1)) # 以 i 为分隔符
['th', 's is string example....wow!!!']
>>> print(str.split('w')) # 以 w 为分隔符
['this is string example....', 'o', '!!!']
列表随机取值
random.choice() 方法返回一个列表,元组或字符串的随机项。
import random
>>> ls = [1, 2, 3, 5, 9]
>>> print(random.choice(ls))
2
>>> print(random.choice(ls))
9
我们调用 random.random() 生成随机数时,每一次生成的数都是随机的。但是,当我们预先使用 random.seed(x) 设定好种子之后,其中的 x 可以是任意数字,如 10 ,这个时候,先调用它的情况下,使用 random() 生成的随机数将会是同一个。
import random
>>> ls = [1, 2, 3, 5, 9]
>>> random.seed( 10 )
>>> print(random.choice(ls))
9
>>> random.seed( 10 )
>>> print(random.choice(ls))
9
编程要求
根据提示,在右侧编辑器补充代码。
本项目文件下载:gone with the wind.txt
输入一个整数,作为随机数种子
实现 read_file(file)函数,参数为要读取的文件名,功能是读取文件内容为字符串,用空格替换掉字符串中全部标点、符号,再根据空格切分为一个列表,返回这个列表。
实现secret_word(ls)函数,参数为从文件中读取的单词列表,返回值为随机得到的一个单词。
测试说明
平台会对你编写的代码进行测试:
测试输入1:
2021
预期输出1:
正在从文件加载单词列表...
成功加载424122个单词
trash
测试输入2:
9999
预期输出2:
正在从文件加载单词列表...
成功加载424122个单词
know
import random
def read_file(file):
"""接收一个文件名为参数,读取文件中的内容为字符串类型,
替换字符串中的标点和符号为空格,根据空格将字符串切分为单词为元素的列表,
返回这个列表。
@参数 file:文件名,字符串类型
读取文件前先输出'正在从文件加载单词列表...'
转为列表后输出输出'成功加载了多少个单词' """
print('正在从文件加载单词列表...')
with open(file, 'r', encoding='utf-8') as novel:
txt = novel.read()
symbols = '!"#$%&()*+,-.:;[\'][\"]<=>?@[\\]^_‘{|}~/' #标点、符号 字符串
# 补充你的代码,将所有符号替换为空格
translation_table = str.maketrans(symbols, ' ' * len(symbols))
txt = txt.translate(translation_table)
word_list = txt.split()
print(f'成功加载{len(txt.split())}个单词')
return txt.split() # 切分为列表,返回列表
def secret_word(ls):
"""参数为从文件中读取的单词列表,返回值为随机得到的一个单词。
@参数 ls:单词列表,列表类型
在测试程序时,可以先预设一个有少数单词的列表,例如随机数种子为19730516时:
# >>> ls = ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday']
# >>> secret_word(ls)
# 'Monday'
"""
# 补充你的代码
return random.choice(ls)
if __name__ == '__main__':
test_seed = int(input())
random.seed(test_seed)
filename = 'data/gone with the wind.txt' # 文件名
wordlist = read_file(filename)
secretword = secret_word(wordlist)
print(secretword)
第2关:猜测目标单词
任务描述
本关任务:编写一个能根据输入的字母推测目标单词的小程序。
相关知识
为了完成本关任务,你需要掌握:
1.如何获取字符串的长度。
2.如何遍历字符串。
3.字符串的切片。
4.字符串的拼接。
字符串的处理
1.字符串长度
>>> a = 'abc'
>>> print(len(a))
3
2.遍历字符串
data = 'abc'
>>> for i in range(len(data)):
>>> print(data[i])
a
b
c
3.连接字符串
>>> a='hello '
>>> b='world'
>>> print(a+b)
hello world
4.字符串切片
字符串[开始索引:结束索引:步长]
切取字符串为开始索引到结束索引 -1 内的字符串
步长不指定时步长为 1 字符串[开始索引:结束索引]
>>> a = 'abce'
>>> b = a[:3]+'d'+a[3]
>>> print(b)
abcde
编程要求
根据提示,在右侧编辑器补充代码,实现 get_guessed_word 函数,它接受三个参数: cover_word , secretWord 和 letter 。每次猜测后产生一个由猜中字母和下划线与空格组成的字符串,该字符串基于猜出的字母在 secret_word 中的位置。
测试说明
平台会对你编写的代码进行测试:
测试输入1:
felling
预期输出1:
单词长度为7
_ _ _ _ _ _ _
当前是第1次猜测,你还有13次机会
请输入你猜测的字母:a
当前猜测结果为:_ _ _ _ _ _ _
当前是第2次猜测,你还有12次机会
请输入你猜测的字母:e
当前猜测结果为:_ e _ _ _ _ _
当前是第3次猜测,你还有11次机会
请输入你猜测的字母:l
当前猜测结果为:_ e l l _ _ _
当前是第4次猜测,你还有10次机会
请输入你猜测的字母:g
当前猜测结果为:_ e l l _ _ g
当前是第5次猜测,你还有9次机会
请输入你猜测的字母:i
当前猜测结果为:_ e l l i _ g
当前是第6次猜测,你还有8次机会
请输入你猜测的字母:n
当前猜测结果为:_ e l l i n g
当前是第7次猜测,你还有7次机会
请输入你猜测的字母:f
当前猜测结果为:f e l l i n g
你太厉害了,居然只用了7次就猜中了单词
秘密单词是:felling
测试输入2:
abc
预期输出2:
单词长度为3
_ _ _
当前是第1次猜测,你还有5次机会
请输入你猜测的字母:c
当前猜测结果为:_ _ c
当前是第2次猜测,你还有4次机会
请输入你猜测的字母:b
当前猜测结果为:_ b c
当前是第3次猜测,你还有3次机会
请输入你猜测的字母:d
当前猜测结果为:_ b c
当前是第4次猜测,你还有2次机会
请输入你猜测的字母:a
当前猜测结果为:a b c
你太厉害了,居然只用了4次就猜中了单词
秘密单词是:abc
def get_guessed_word(cover_word, word, letter):
"""接受三个字符串为参数:分别表示正在猜测的遮盖了字母的单词、随机抽取的单词和正在猜测的字母。
每次猜测后产生一个由猜中字母和下划线与空格组成的字符串,猜中的字母显示出来,未知字母用"_"
表示,字母间留一个空格。返回每次猜测后由字母和下划线组成的字符串。
@参数 cover_word:遮盖了字母的单词,字符串类型
@参数 word:随机抽取的单词,字符串类型
@参数 letter:正在猜测的字母,字符串类型
"""
# 补充你的代码
cover_word_list = cover_word.split(' ')
for i, char in enumerate(word):
if char == letter:
cover_word_list[i] = letter
cover_word = ' '.join(cover_word_list)
print(f'当前猜测结果为:{cover_word}')
return cover_word
if __name__ == '__main__':
word = input()
print(f'单词长度为{len(word)}') # 先提示用户单词长度
cover_word = '_ ' * len(word) # 产生一个由下划线与空格构成的字符串,每组下划线与空格代表一个字母
print(cover_word)
for i in range(1, 2 * len(word) + 1): # 最多猜测2倍字母数次
print(f'当前是第{i}次猜测,你还有{2 * len(word) - i}次机会')
letter = input('请输入你猜测的字母:') # 输入猜测的字母
cover_word = get_guessed_word(cover_word, word, letter)
guess_word = cover_word.replace(' ', '')
if guess_word == word: # 替换字符串中的空格,查看是否猜中
print(f'你太厉害了,居然只用了{i}次就猜中了单词')
print(f'秘密单词是:{guess_word}') # 猜中后输出时去掉单词中的空格
break
第3关:单词猎手游戏
任务描述
本关任务:编写一个程序,从一篇文章里随机取出一个单词,要求用户在有限次数内逐个字母猜测,直到猜到单词中的全部字母或超出次数限制结束游戏。
相关知识
为了完成本关任务,你需要掌握:
读取文件中的内容为字符串类型
如何操作字符串
单词猎手
计算机必须从文本文件中随机选择一个单词并命名为 secretWord (本题要求用 choice() 方法实现),单词可能包含大写和小写字母,为降低猜测难度,你需要将单词转为全部小写字母。
在开始游戏时,用户会得到单词长度为几个字符的提示和有多少次猜测机会的提示。产生一个由下划线与空格构成的字符串 cover_word ,每组下划线与空格代表一个字母。
游戏是交互式的,用户在每次输入猜测的字母 letter 时,要先给出提示性的信息再接受输入( input('请输入你猜测的字母:\n'))。计算机也会给出相应的响应,如果字母在单词中存在,则在单词的相应位置显示猜中的字母,否则更新猜测次数。
当用户猜到了单词中全部字母,或用完所有次数还没猜测出来,游戏结束。
编程要求
根据提示,在右侧编辑器补充代码
输入一个“选词”、“模板”、“开始填词”三个字符串之一,根据字符串完成函数调用和输出。输入其他字符串时,无论输入的随机数种子是什么,都先输出加载单词信息再输出“输入错误 ”。
输入一个整数,作为随机数种子
实现 read_file(file) 函数,参数为要读取的文件名,功能是读取文件内容为字符串,用空格替换掉字符串中全部标点、符号,再根据空格切分为一个列表,返回这个列表。
实现 secret_word(ls) 函数,参数为从文件中读取的单词列表,返回值为随机得到的一个单词。
实现 get_guessed_word 函数,它接受三个参数:cover_word , word 和 letter 。每次猜测后产生一个由猜中字母和下划线与空格组成的字符串,该字符串基于猜出的字母在 secret_word 中的位置,返回每次猜测后由字母和下划线组成的字符串。
实现 word_guess 函数,它接受一个参数:secret_word 。此函数返回删除了空格的猜测结果字符串。函数中限定允许猜测的次数为单词长度的2倍。若在限定次数内猜中所有字母,输出“你太厉害了,居然只用了i次就猜中了单词“,其中i为实际使用的次数。否则输出“太遗憾了,你未能在n次内猜出单词”,其中n为限定的次数。函数最后输出“秘密单词是:猜中的单词 ”,返回这个猜中的单词。
测试说明
平台会对你编写的代码进行测试:
测试输入:
选词
2021
预期输出:
正在从文件加载单词列表...
成功加载424122个单词
trash
测试输入:
模板
2021
预期输出:
正在从文件加载单词列表...
成功加载424122个单词
_ _ _ _ _
测试输入:
开始填词
2021
a
s
t
h
r
预期输出:
正在从文件加载单词列表...
成功加载424122个单词
单词长度为5
_ _ _ _ _
当前是第1次猜测,你还有9次机会
请输入你猜测的字母:a
当前猜测结果为:_ _ a _ _
当前是第2次猜测,你还有8次机会
请输入你猜测的字母:s
当前猜测结果为:_ _ a s _
当前是第3次猜测,你还有7次机会
请输入你猜测的字母:t
当前猜测结果为:t _ a s _
当前是第4次猜测,你还有6次机会
请输入你猜测的字母:h
当前猜测结果为:t _ a s h
当前是第5次猜测,你还有5次机会
请输入你猜测的字母:r
当前猜测结果为:t r a s h
你太厉害了,居然只用了5次就猜中了单词
秘密单词是:trash
import random
def read_file(file):
"""接收一个文件名为参数,读取文件中的内容为字符串类型,
替换字符串中的标点和符号为空格,根据空格将字符串切分为单词为元素的列表,
返回这个列表。
@参数 file:文件名,字符串类型
读取文件前先输出'正在从文件加载单词列表...'
转为列表后输出输出'成功加载了多少个单词' """
print('正在从文件加载单词列表...')
with open(file, 'r', encoding='utf-8') as novel:
txt = novel.read()
symbols = '!"#$%&()*+,-.:;[\'][\"]<=>?@[\\]^_‘{|}~/'
for ch in symbols:
txt = txt.replace(ch, " ") # 所有符号替换为空格
print(f'成功加载{len(txt.split())}个单词')
# print(txt.split())
return txt.split() # 切分为列表,返回列表
def secret_word(ls):
"""参数为从文件中读取的单词列表,返回值为随机得到的一个单词。
@参数 ls:单词列表,列表类型
在测试程序时,可以先预设一个有少数单词的列表,例如随机数种子为19730516时:
# >>> ls = ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday']
# >>> secret_word(ls)
# 'Monday'
"""
# 补充你的代码
return random.choice(ls)
def get_guessed_word(cover_word, word, letter):
"""接受三个字符串为参数:分别表示正在猜测的遮盖了字母的单词、随机抽取的单词和正在猜测的字母。
每次猜测后产生一个由猜中字母和下划线与空格组成的字符串,猜中的字母显示出来,未知字母用"_"
表示,字母间留一个空格。返回每次猜测后由字母和下划线组成的字符串。
@参数 cover_word:遮盖了字母的单词,字符串类型
@参数 word:随机抽取的单词,字符串类型
@参数 letter:正在猜测的字母,字符串类型
"""
# 补充你的代码
cover_word_list = cover_word.split(' ')
for i, char in enumerate(word):
if char == letter:
cover_word_list[i] = letter
cover_word = ' '.join(cover_word_list)
print(f'当前猜测结果为:{cover_word}')
return cover_word
def word_guess(word):
"""以随机抽取的秘密单词为参数,参数类型为字符串。
@参数 word:随机抽取的秘密单词,字符串类型
先输出一个单词长度的提示信息,产生一个由下划线与空格构成的字符串,每组下划线与空格代表一个字母
限制用户最多猜测次数为单词长度的2倍
每次猜测并输入一个字母,调用get_guessed_word()函数对猜测进行处理。
然后回车换行,并按题目要求进行输出。
若去除处理后的单词中的空格后得到的单词与传入参数相同,表示已经猜中了秘密单词。
例如秘密单词为'Tuesday',且用户在6次猜测时猜中了单词中的全部字母,此时输出:
你太厉害了,居然只用了6次就猜中了单词
秘密单词是:Tuesday
'"""
# 补充你的代码
print(f'单词长度为{len(word)}') # 先提示用户单词长度
cover_word = '_ ' * len(word) # 产生一个由下划线与空格构成的字符串,每组下划线与空格代表一个字母
print(cover_word)
for i in range(1, 2 * len(word) + 1): # 最多猜测2倍字母数次
print(f'当前是第{i}次猜测,你还有{2 * len(word) - i}次机会')
letter = input('请输入你猜测的字母:') # 输入猜测的字母
cover_word = get_guessed_word(cover_word, word, letter)
guess_word = cover_word.replace(' ', '')
if guess_word == word: # 替换字符串中的空格,查看是否猜中
print(f'你太厉害了,居然只用了{i}次就猜中了单词')
print(f'秘密单词是:{guess_word}') # 猜中后输出时去掉单词中的空格
break
else:
print(f'很遗憾,猜测次数用完。秘密单词是:{word}')
def judge(txt):
"""接收一个字符串为参数,根据参数值调用不同函数完成任务"""
test_seed = int(input())
random.seed(test_seed)
filename = 'data/gone with the wind.txt' # 文件名
wordlist = read_file(filename)
secretword = secret_word(wordlist)
if txt == '选词': # 输出抽中的单词
# 补充你的代码
print(secretword)
elif txt == '模板': # 输出猜词模板,形如:_ _ _ _ _ _
# 补充你的代码
print('_ ' * len(secretword))
elif txt == '开始填词':
word_guess(secretword)
else:
print('输入错误')
if __name__ == '__main__':
text = input()
judge(text)