2017-01-22 1 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部分は、ファイルを閉じていないと、プログラムが停止したときに、ファイルがOSレベルで閉じられていません。そのようなハンガーをシステムに持たないようにするには、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() 

実行例以下

は、私がやったテスト実行の1例です。私は、テストを実行する前に、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

関連する問題