2017-01-22 3 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

6.이 포함되어 있습니다. –

+0

"하지만 계속 임의의 오류가 발생합니다."좀 더 구체적으로 할 수 있습니까? – Tagc

+1

@WillemVanOnsem 작성한 모든 의견은 0.5 초 후에 작성합니다. :) – Tagc

답변

0

이 질문에 대한 대답은 다시 사용하기 전에 파일을 닫습니다해야한다는 것입니다 :

여기에 내가 오류의 추적이다. 파이썬에서 쉽게 할 수있는 방법은 with 구문을 사용하는 것입니다.

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

# File is automatically closed now. 
print(content) 

문제는 당신이 연속적으로 프로그램을 여러 번 실행하는 것이 대부분이지만, elif 부분은 파일을 닫지 않고 프로그램이 정지 할 때 파일은 OS 수준에서 닫히지 않았습니다. 당신은 항상 파이썬에서 파일을 닫아서 시스템에 그런 행거를 가지지 않도록해야한다.

+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)를 포함하고 실행 후 오류가 당신이 얻을, ** ** 미리 역 추적을 제공하십시오 무엇

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 그는 그것을 모두 타이핑하고 배울 필요가 없습니다. +1 답변 테스트 ... 나는 게으 름이었습니다. :) – makaveli

+0

@makaveli 저항 할 수 없었습니다. 내가 그것을 고쳤던 이유의 90 %는 내가 지루했고, 이것들과 같은 간단한 추측 게임이 나를 즐겁게 해주기 때문이었다. :) – Tagc

관련 문제