私は最後のカップルの日のためにPythonを学んできました。私の本では、ティックタックトープログラムを作成することが課題でした。私はゲームを行う方法の一般的な考えを持っていると思うが、私は洞察力が参考になるここで問題に遭遇した、Tic Tac Toeゲーム(Python)のローカルスコープの問題
HERESに私のコードの関連部分
board = []
for i in range(0,3):
board.append([" "," "," "]) # Fill the board
def print_board():
for i in range(0,3):
print "| ",
for k in range(0,3):
print board[i][k],
print "|\n"
print "The first player to start will be player one with X\n, the second player will be O\n"
player_one = "X"
player_two = "O"
current_player_name = "Player One"
current_player = player_one
filled_board = False
winner = False
def check_win_col(the_winner):
for i in range(0,3):
for j in range(0,3):
if board[0][i] == board[j][0] and board[0][i] != " ":
the_winner = current_player
return the_winner
while(filled_board == False):
get_row = int(raw_input("Please enter which row you would like to move to " + current_player))
get_col = int(raw_input("Please enter the col you want to move to" + current_player))
board[get_row][get_col] = current_player
print_board()
check_win_col()
if current_player == player_one:
current_player = player_two
else:
current_player = player_one
エラー
まず**UnboundLocalError: local variable 'the_winner' referenced before assignment**
、ラインthe_winner = current_player
は私にエラーを与えた理由を私は理解していなかった、そしてUnbound Local ErrorのようないくつかのSOの質問を読んだ後、私は私の問題を実現。
私自身は2つの解決策を考えました。
私の試み
1.はthe_winner
が世界ください。この方法では、私は現在の選手に優勝欄の勝者を設定することに問題はありません。私がこれをしたくない理由は、このエラーに関する私の研究中に、global
というキーワードを使用することは非常に悪い習慣であると言っている人々を思い出しているからです。
。関数内にthe_winner
のパラメータを追加します。しかし、このアイデアの問題は、私がどのようにしてthe_winner
にアクセスするのかということです。これにより、check_win_col()
ローカルスコープ内にthe_winner
が作成されます。何らかの理由でこの関数の外でこれを操作することはできません。さらに、列の勝者をチェックするための関数にパラメータを追加するというアイデアは奇妙に思えます。それはあなたが望むならば、パラメータなしでなければならないその機能の1つのようです。
もっと良い解決策がありますか?申し訳ありませんが、この質問が簡単な場合。
関数の外で "the_winner"にアクセスする必要がある場合は、関数の最後に関数を返し、関数を呼び出すときに関数を保存することができます。 – Tryph
あなたは 'return'という言葉を知らないように見えます。 – polku
あなたはどこでthe_winnerを使用していますか?あなたの関数は 'check_win_col'と呼ばれますが、他に2つのことがあります。関数の外部で状態を変更し、勝者を出力します。私はこの関数を単純に勝利した 'current_player'を返すように提案し、あなたが関数を呼び出すところでそれを使用してください。 –