2016-12-14 21 views
0

こんにちは私は0と1の間の数字を選んでコンピュータがランダムに演奏するティックタックつま先ゲームのコーディングに問題があります。私はコードを試しましたが、ここに表現されているような非現実的な状況になります:Tic Tac Toe WinCheck Def

OOO

XXX

OOO

私はすべての動きで勝者があるかどうかを確認私のコードで何かを載せていきたいと思います。誰かが勝利したら、私はゲームを止めて誰が優勝者か誰に勝ってもらわないようにしたい。また、出力を下の写真のようにしたくありません。私はちょうどボードの1つのディスプレイを望む(可能ならば)。ここで

The output of this programme is that.

私のコードは次のようになります。それは暗黙のうちに関係なく、入力が何であるかFalseを返し、デフォルトでよう

import random 

board = [] 
line= 3 
col = 3 
for i in range (line) : 
    for j in range (col): 
     board.append(" ") 


def show(): 
    print(board[0],'|',board[1],'|',board[2]) 
    print('--------------') 
    print(board[3],'|',board[4],'|',board[5]) 
    print('--------------') 
    print(board[6],'|',board[7],'|',board[8]) 
    print() 

# Verify the possibility of position to take. 
B=1 
C=2 
D=3   
def check(A, B, C, D): 
    if board[B] == A and board[C] == A and board[D] == A : 
     return True    

# Win conditions 
def Winner(G): 
    if check(G, 0, 1, 2): 
      True 
    if check(G, 0, 3, 6): 
      True 
    if check(G, 0, 4, 8): 
      True 
    if check(G, 1, 4, 7): 
      True    
    if check(G, 2, 5, 8): 
      True   
    if check(G, 2, 4, 6): 
      True  
    if check(G, 3, 4, 5): 
      True 
    if check(G, 6, 7, 8): 
      True 


player1 = "O" 
player2 = "X" 
play=random.randint(0,1) 
if play == 1: 
    player1 = "X" 
    player2 = "O" 

while True: 
     random.seed() 
     place=random.randint(0,8) 
     if board[place] != "O" and board[place] != "X" : 
      board[place] = player1 
      if Winner(player1)==True: 
       print("~~~~~~~ the player ",player1," wins~~~~~~~")   
       break; 

      while True: 
       random.seed() 
       place=random.randint(0,8) 

       if board[place] != "O" and board[place] != "X" : 
        board[place] = player2 
        if Winner(player2)==True: 
         print("~~~~~~~ the player ",player2," wins~~~~~~~")   
         break; 

        break; 

     else: 
      print("This position is already taken")   

     show() 
+0

"True"はステートメントとしては絶対に何もしません。実際に勝利を示すには、「Trueを返す」必要があります。 (また、ループ内で '' random.seed() ''を呼び出すのはひどく悪い考えです。プログラムの実行ごとに1回の呼び出しで十分です。これは既にあなたのために行われているので、0です) – jasonharper

答えて

0

コード:

import random 
board = [] 
for x in range(9): 
    board.append(" ") 
def show(): 
    print(board[0],'|',board[1],'|',board[2]) 
    print('--------------') 
    print(board[3],'|',board[4],'|',board[5]) 
    print('--------------') 
    print(board[6],'|',board[7],'|',board[8]) 
def check(A, B, C, D): 
    if board[B] == A and board[C] == A and board[D] == A : 
     return True 
def Winner(G): 
    ret = False 
    if check(G, 0, 1, 2): 
      ret = True 
    if check(G, 0, 3, 6): 
      ret = True 
    if check(G, 0, 4, 8): 
      ret = True 
    if check(G, 1, 4, 7): 
      ret = True    
    if check(G, 2, 5, 8): 
      ret = True   
    if check(G, 2, 4, 6): 
      ret = True  
    if check(G, 3, 4, 5): 
      ret = True 
    if check(G, 6, 7, 8): 
      ret = True 
    return ret 
def filled(): 
    ll = 0 
    for x in board: 
     if x == " ": 
      ll = 11 + 1 
    if ll > 0: 
     return False 
    else: 
     return True 
done = False 
turn = "O" 
tie = False 
while done == False: 
    place = random.randint(0, 8) 
    if board[place] == " ": 
     board[place] = turn 
     if Winner(turn) == True: 
      done = True 
     else: 
      if filled() == True: 
       done = True 
       tie = True 
      else:#change turn 
       if turn == "X": 
        turn = "O" 
       else: 
        turn = "X" 
if tie == True: 
    print ("The game was a tie. No winner.") 
    show() 
else: 
    print("~~~~~~~ the player '",turn,"' wins~~~~~~~") 
    show() 

これは、すべての要件を完了する必要があります。

各有効なターンのあとに、winner()とfilled()をチェックするだけです。ループが成功するたびにループを変更して、重複を防止します。

注:ループが始まる前に、変更変数を 'X'に変更するには、最初に 'O'が表示されます。

+0

ありがとう、それは今素晴らしい作品:) –

0

あなたWinner()関数は、何も返しません。主なポイントは、それがreturn Trueべきである

def Winner(G): 
    if check(G, 0, 1, 2) or check(G, 0, 3, 6) or check(G, 0, 4, 8) or check(G, 1, 4, 7) or check(G, 2, 5, 8) or check(G, 2, 4, 6) or check(G, 3, 4, 5) or check(G, 6, 7, 8): 
     return True 
    else 
     return False 

:それだけでなくTruereturn True(全く何もしないもの)のような、何かを含める必要があります。残りの部分は主にスタイルの好みです - 私はor条件が多い、ifという単一のものが好きです。他の人はifステートメントのすべてをreturn Trueと好むかもしれません。

(技術的には、それが効果的にとにかく、デフォルトでFalseを返しますよう、あなたが、else一部を必要としません。しかし、それはそれをより読みやすくなります。あなたはまた、単にelse行を削除し、逆インデントを可能性がありますreturn Falseその関数全体のためではなく、ifためのキャッチすべて)

+0

はい。しかし、それが抽選であるとき私はどのようにするのですか? –

+0

それは全く別の質問です。しかし、両方のユーザに対して 'winner()'を実行することができます(つまり、2回実行する)ことができ、 '勝者(A)==勝者(B)'が得られれば抽選になります。 –

+0

そして、すべてのポジションを完了する前に、メッセージ(プレイヤーx勝者またはプレーヤーO勝)を表示します。私はすべてのポジションに勝利メッセージの前にOかXを入れておきたい。 –