2016-11-06 23 views
1
def move(list, wins_1, wins_2): 
    global turn 
    if turn % 2 == 0: 
     sign = "| x " 
    else: 
     sign = "| o " 
y_1 = int(input("Type the value of y: ")) 
x_1 = int(input("Type the value of x: ")) 

if list[y_1 - 1][x_1 - 1] == "| x " or list[y_1 - 1][x_1 - 1] == "| o ": 
    print("The place is already filled by %s |" % list[y_1 - 1][x_1 - 1]) 
    move(list, wins_1, wins_2) 
else: 
    list[y_1 - 1][x_1 - 1] = sign 

print_board(list) # 

wins_1, wins_2 = check_winner(sign, wins_1, wins_2) 

turn += 1 
return wins_1, wins_2 

ユーザーがリストの[x] [y]を入力し、すでにaxまたはo(それはティックタックトーゲーム)であれば、既に埋め込まれている ")、ユーザがxとyの別のセットを入力してx/oを入れるようにします。中に関数を呼び出す

私は、おそらく単に関数を呼び出してそれを繰り返してもいいと思っていました。それは正常に動作し、エラーは発生しませんでした。 何らかの理由で、何とか私のボード2を印刷しました(何度も、すでに塗りつぶされた場所に "x"と "y"を何回押したか)。

あなたが関数にいるときに関数を呼び出すと、何が起こるか説明できますか?そして、私のコードではどういうことが起こったのですか?

注:私のコードは非常に長く、これはほんの少しです。より多くのコードが必要な場合は、教えてください。

出力の例を次に示します。x/oをすでに塗りつぶした場所にボードを2回印刷したことに注意してください。

Type the name of player 1: 1 
type the name of player 2: 1 
____________________________________________________________ 
player_1: 1  X  wins: 0 
player_2: 1  O  wins: 0 
____________________________________________________________ 
Type the value of y: 1 
Type the value of x: 1 
------------- 
| x | | | 
------------- 
| | | | 
------------- 
| | | | 
------------- 
____________________________________________________________ 
player_1: 1  X  wins: 0 
player_2: 1  O  wins: 0 
____________________________________________________________ 
Type the value of y: 1 
Type the value of x: 1 
The place is already filled by | x | 
Type the value of y: 1 
Type the value of x: 2 
------------- 
| x | o | | 
------------- 
| | | | 
------------- 
| | | | 
------------- 
------------- 
| x | o | | 
------------- 
| | | | 
------------- 
| | | | 
------------- 
____________________________________________________________ 
player_1: 1  X  wins: 0 
player_2: 1  O  wins: 0 
____________________________________________________________ 
Type the value of y: 

全体コード:

wins_1 = 0 
wins_2 = 0 
turn = 0 
board = [ 
     ['| ', '| ', '| ', '| '], 
     ['| ', '| ', '| ', '| '], 
     ['| ', '| ', '| ', '| '] 
    ] 
def print_board(board_list): 

    for i in range(len(board_list)): 
     print(" -------------\n %s" % "".join(board_list[i])) # .join binder 2 items sammen. 
    print(" -------------") 

player_1 = input("Type the name of player 1: ") 
player_2 = input("type the name of player 2: ") 
def game_info(player_1, player_2, wins_1, wins_2): # prints layout 
    print("_" * 60) 
    print("player_1: %s  X  wins: %s" 
      "\nplayer_2: %s  O  wins: %s" 
      % (str(player_1), str(wins_1), str(player_2), str(wins_2))) 
    print("_" * 60) 
# ovenstående viser output af wins og navn 



def print_winner(sign, wins_1, wins_2): 

    if sign == "| x ": 
     print("%s got 3 in a row, %s wins!" % (player_1, player_1)) 
     wins_1 += 1 
    else: 
     print("%s got 3 in a row, %s wins!" % (player_2, player_2)) 
     wins_2 += 1 
    return wins_1, wins_2 


def check_winner(sign, wins_1, wins_2): 

    # check vertical: | 
    for x in range(0,3): 
     if board[0][x] == sign and board[1][x] == sign and board[2][x] == sign: 
      wins_1, wins_2 = print_winner(sign, wins_1, wins_2) 

    # check horizontal: - 
    for x in range(0, 3): 
     if board[x][0] == sign and board[x][1] == sign and board[x][2] == sign: 
      wins_1, wins_2 = print_winner(sign, wins_1, wins_2) 

    # check diagonal: \ 
    if board[0][0] == sign and board[1][1] == sign and board[2][2] == sign: 
     wins_1, wins_2 = print_winner(sign, wins_1, wins_2) 
    elif board[0][2] == sign and board[1][1] == sign and board[2][0] == sign: 
     wins_1, wins_2 = print_winner(sign, wins_1, wins_2) 

    return wins_1, wins_2 


def move(list, wins_1, wins_2): 
    global turn 
    if turn % 2 == 0: 
     sign = "| x " 
    else: 
     sign = "| o " 

    y_1 = int(input("Type the value of y: ")) 
    x_1 = int(input("Type the value of x: ")) 

    if list[y_1 - 1][x_1 - 1] == "| x " or list[y_1 - 1][x_1 - 1] == "| o ": 
     print("The place is already filled by %s |" % list[y_1 - 1][x_1 - 1]) 
     move(list, wins_1, wins_2) 
    else: 
     list[y_1 - 1][x_1 - 1] = sign 

    print_board(list) # 

    wins_1, wins_2 = check_winner(sign, wins_1, wins_2) 

    turn += 1 
    return wins_1, wins_2 





while True: 
    game_info(player_1, player_2, wins_1, wins_2) 
    wins_1, wins_2 = move(board, wins_1, wins_2) # move() sætter et 'tegn' og returner win1/win2 

    if wins_1 or wins_2 == 1: 
     break 
print("*****************************************************\nGame Over. \n IT WORKED!") 
+1

intendationは疑わしいです

希望を印刷していない場合、プログラムがのみ印刷することができます

一度printedので、それだけプリントと呼ばれる変数を追加しました。これは最後の 'move'メソッドですか?またはいくつかの他の方法?メソッドは、入力の問題があるときにそれ自身を呼び出すべきではありません。 –

+0

こんにちはSebastian、コード全体を含めてください。あなたがコピーして貼り付けることができればそれをあなたのためのコードフォーマットに変更します。そして、私はコード全体を見て、正しく実行することができます。 –

+0

https://gist.github.com/sebastian3495/6c856c6d7f93f629f91496893c2b5cfb コード全体を見てください。 –

答えて

0

ここでは、答えは:

def move(list, wins_1, wins_2): 
    printed = False 
    global turn 
    if turn % 2 == 0: 
     sign = "| x " 
    else: 
     sign = "| o " 

    y_1 = int(input("Type the value of y: ")) 
    x_1 = int(input("Type the value of x: ")) 

    if list[y_1 - 1][x_1 - 1] == "| x " or list[y_1 - 1][x_1 - 1] == "| o ": 
     print("The place is already filled by %s |" % list[y_1 - 1][x_1 - 1]) 
     move(list, wins_1, wins_2) 
     printed = True 
    else: 
     list[y_1 - 1][x_1 - 1] = sign 

    if printed == False: 
     print_board(list) 

    wins_1, wins_2 = check_winner(sign, wins_1, wins_2) 

    turn += 1 
    return wins_1, wins_2 

私は持っていますこれは、それはすでに、これが支援してきました:)

+0

編集:nvm、私は何か見落とされた私のコードで変更されました。助けてくれてありがとう。 –

+0

それは大丈夫です!お役に立てて嬉しいです。私の答えを+1するチャンスがあれば、本当に助けになるでしょう! –

+0

残念ながら私はそうすることができません。私は新しいユーザーだからです。 –

0

あなたが無限ループを入力しています。はじめてmoveを実行しています。その後、もう一度moveを開始します。 2番目のmoveが終了したと仮定すると、プログラムは、最初にmoveを呼び出したところで中断した部分を取り上げます。 if listがtrueである限り、別のインスタンスmoveをインスタンス化します。

あなたが達成したいのは、recursionという簡単な例です。

あなたが関数は、以前の関数定義に2つの印刷()関数を追加することによって、どのように機能するかを追跡することができ
def factorial(n): 
    if n == 1: 
     return 1 
    else: 
     return n * factorial(n-1) 

def factorial(n): 
    print("factorial has been called with n = " + str(n)) 
    if n == 1: 
     return 1 
    else: 
     res = n * factorial(n-1) 
     print("intermediate result for ", n, " * factorial(" ,n-1, "): ",res) 
     return res 

print(factorial(5)) 

出力:

factorial has been called with n = 5 
factorial has been called with n = 4 
factorial has been called with n = 3 
factorial has been called with n = 2 
factorial has been called with n = 1 
intermediate result for 2 * factorial(1): 2 
intermediate result for 3 * factorial(2): 6 
intermediate result for 4 * factorial(3): 24 
intermediate result for 5 * factorial(4): 120 
120 
+0

申し訳ありませんが、私はそれをかなり得ていませんでした。私はそれを私のコードでどのように実装するのですか? –

+0

最初に私の「移動」機能の呼び出しが開始され、次に「移動」機能が再び呼び出されたとき。 最初の「移動」機能がフィンランド語になってから、2番目の機能が開始されました。それとも、私の2番目の機能が最初に実行されたのですか? これはちょっと狡猾です。 –

+0

編集:あなたはこの問題を解決するための代替案を考えることができますか? 場所がすでに取得されている場合は、新しい入力を求める必要があることを忘れないでください。それが私の目標です。 –

関連する問題