2017-01-22 71 views
0

我正在尝试编写一个猜数字游戏,但我不断收到随机错误,似乎无法找到我做错了什么。这里的脚本:权限错误。怎么了?

import random 
import sys 
import os 

def guess_number(): 
    file = open('highscores.txt', 'r+')#opens file 
    highscore = file.read() 
    highscore = int(highscore) 
    name = input('Enter your name: ') 

    answer = random.randint(1,100) 
    print('Hi ' + name + '! I\'m thinking of a number between 1 and 100!') 
    guesses = 0 
    while guesses < 100: 
     print('Take a Guess! ') 
     guess = input() 
     guess = int(guess) 

     if guess < answer: 
      print('Your guess was too low!') 
      guesses = guesses + 1 
     if guess > answer: 
      print('Your guess was too High!') 
      guesses = guesses + 1 
     if guess == answer: 
      guesses = guesses + 1 
      break 

    if guess == answer: 
     answer = str(answer) 
     guesses = str(guesses) 



     print('Good Job ' + name + '! You guessed ' + answer + ' in ' +  guesses + ' guesses!') 
     guesses = int(guesses) 
    if highscore > guesses: 
     file.close() 
     os.remove('highscores.txt') 
     file = open('highscores.txt', "w") 
     print('Congratulations! You beat the highscore!') 
     guesses = str(guesses) 
     file.write(guesses) 
     file.close() 
     guesses = int(guesses) 
    elif highscore < guesses: 
     highscore = str(highscore) 
     print('The highscore is: ' + highscore) 

顺便说一句,我有一个名为highscores.txt一个单独的文件;当程序第一次运行时,我在文件中输入“100”并保存。

这里的错误,我得到的回溯:

Traceback (most recent call last): 
    File "<pyshell#8>", line 1, in <module> 
    guess_number() 
    File "C:\Users\rhino_000\Desktop\guesses\guesses.py", line 39, in guess_number 
    os.remove('highscores.txt') 
PermissionError: [WinError 32] The process cannot access the file because it  is being used by another process: 'highscores.txt' 
+0

什么错误,你得到的,请提供** **回溯。 –

+0

“但我不断收到随机错误”你能更具体一点吗? – Tagc

+1

@WillemVanOnsem你写的每一条评论,我写0.5秒后。 :) – Tagc

回答

0

回答这个问题,你应该再使用它之前关闭该文件。在Python中执行该操作的简单方法是使用with语法。

with open('qwerty.txt', 'r') as f: 
    content = f.read() 

# File is automatically closed now. 
print(content) 

的问题是最有可能的,你多次运行程序连续,但elif部分不关闭文件和程序停止时,该文件未在操作系统级别关闭。您应该始终使用Python关闭文件,以免系统中出现这种挂钩。

+0

我可以只使用file.close()吗? –

+1

@ RianO'Hanlon是的,你可以,但是你必须把它添加到程序可以去的每个可能的路径。你也必须考虑到,当代码退出并且没有达到你的close()时,你仍然会在系统中挂起你的下一个代码。所以建议使用'with'语法。 – makaveli

0

这建立在makaveli的回答和我在上面发布的评论。下面的代码似乎解决了所有文件系统访问问题。我已经通过多次运行测试了游戏,并且它看起来工作正常。

import random 


def guess_number(): 
    with open('highscores.txt', 'r+') as f: 
     highscore = int(f.read()) 

    name = input('Enter your name: ') 

    answer = random.randint(1, 100) 
    print('Hi ' + name + '! I\'m thinking of a number between 1 and 100!') 
    guesses = 0 
    while guesses < 100: 
     print('Take a Guess! ') 
     guess = input() 
     guess = int(guess) 

     if guess < answer: 
      print('Your guess was too low!') 
      guesses = guesses + 1 
     if guess > answer: 
      print('Your guess was too High!') 
      guesses = guesses + 1 
     if guess == answer: 
      guesses = guesses + 1 
      break 

    if guess == answer: 
     answer = str(answer) 
     guesses = str(guesses) 

     print('Good Job ' + name + '! You guessed ' + answer + ' in ' + guesses + ' guesses!') 
     guesses = int(guesses) 
    if highscore > guesses: 
     print('Congratulations! You beat the highscore!') 
     with open('highscores.txt', "w") as f: 
      guesses = str(guesses) 
      f.write(guesses) 
    elif highscore < guesses: 
     highscore = str(highscore) 
     print('The highscore is: ' + highscore) 


guess_number() 

示例执行

下面是测试运行我做的一个的例子。在我跑的测试,highscores.txt包含9(从以前的运行),并运行后,包含6

Enter your name: tagc 
Hi tagc! I'm thinking of a number between 1 and 100! 
Take a Guess! 
50 
Your guess was too High! 
Take a Guess! 
25 
Your guess was too low! 
Take a Guess! 
37 
Your guess was too low! 
Take a Guess! 
44 
Your guess was too High! 
Take a Guess! 
40 
Your guess was too High! 
Take a Guess! 
38 
Good Job tagc! You guessed 38 in 6 guesses! 
Congratulations! You beat the highscore! 
+0

-1为他做了这一切,所以他不必输入并学习它。 +1测试答案...我很懒。 :) – makaveli

+0

@makaveli无法抗拒。我固定它的原因有90%是因为我很无聊,而且像这样简单的猜谜游戏让我感到无比愉快。 :) – Tagc