2016-11-30 7 views
-3

グリッドの3つのスペースがすべて 'x'または 'o'としてマークされているかどうかをチェックするtic-tac-toeプログラムに関数を書き込もうとしています。 lst_1はラインのすべての可能な組み合わせのリストです:ネストされたリスト内の文字列をチェックする

def conc(): 
    global lst 
    lst_1 = [[lst[0],lst[1],lst[2]],[lst[3],lst[4],lst[5]],[lst[6],lst[7],lst[8]],[lst[0],lst[3],lst[6]],[lst[1],lst[4],lst[7]], [lst[2],lst[5],lst[8]],[lst[0],lst[4],lst[8]],[lst[2],lst[4],lst[6]], [lst[0],lst[1],lst[2]],[lst[3],lst[4],lst[5]],[lst[0],lst[3],lst[6]],  [lst[1],lst[4],lst[7]],[lst[2],lst[5],lst[8]],[lst[0],lst[4],lst[8]], [lst[2],lst[4],lst[6]]] 
    triplet = [s for s in lst_1] 
    if all('o' == item for item in triplet): 
     print('Player 2 wins!') 
     reply() 
    elif all('x' == item for item in triplet): 
     print('Player 1 wins!') 
     reply() 
    else: 
     pass 

私は誰かが行の3を得ることができたときに、このゲームを止めるだろうと思ったが、それは行くを続けています。何か案は?

+0

私は 'lst_1'に余計なデータがあると思います。 – TigerhawkT3

+0

あなたの 'all()'呼び出しにも重要な部分がありません。 – TigerhawkT3

+0

インデントがオフです。これはPythonでは重要です。変数 'triplet'は' lst_1'と同じように見えます。あなたは 'reply()'が何であるか、あるいは何をしているのかを教えてくれません。 [最小限で完全で検証可能なサンプルの作成方法](http://stackoverflow.com/help/mcve)を参照してください。 –

答えて

1

あなたの質問に簡単に回答するには、lst_1を繰り返していません。私はあなたがtripletのために使用している声明であると思うと思うが、実際にはlst_1からtripletまでしかコピーされない。

実際にジェネレータをlst_1から外してtripletに割り当てようとしていますが、間違いなくリストの理解を誤って使用していて、ジェネレータの動作を完全に理解していません。発電機の詳細についてはhereをご覧ください。

ジェネレータは特定の状況では間違いありませんが、実際にはここでコードを単純化するとは思われません。とにかくループが必要になり、発電機がいつ終了するかを知るためにはStopIterationの例外をチェックする必要があります。

私の提案はループを使用することです。for

def conc(): 
    global lst 
    lst_1 = [[lst[0],lst[1],lst[2]],[lst[3],lst[4],lst[5]],[lst[6],lst[7],lst[8]],[lst[0],lst[3],lst[6]],[lst[1],lst[4],lst[7]], [lst[2],lst[5],lst[8]],[lst[0],lst[4],lst[8]],[lst[2],lst[4],lst[6]], [lst[0],lst[1],lst[2]],[lst[3],lst[4],lst[5]],[lst[0],lst[3],lst[6]],  [lst[1],lst[4],lst[7]],[lst[2],lst[5],lst[8]],[lst[0],lst[4],lst[8]], [lst[2],lst[4],lst[6]]] 
    for triplet in lst_1: 
     if all('o' == item for item in triplet): 
      print('Player 2 wins!') 
      reply() 
      break 
     elif all('x' == item for item in triplet): 
      print('Player 1 wins!') 
      reply() 
      break 

いくつかの他のシラミ: はあなたif-elif-elseループの最後にelse: passを追加すると、完全に無関係のです。そこにいる必要はありません。

また、グローバル変数を避けてください。 Pythonのスコープについて少しお読みください。シンプルなプログラムではうまくいくかもしれませんが、リモートで複雑なものに遭遇したときにそれらに頼ると、あなたを傷つけるでしょう。

+0

ありがとう@Dodosaur。なぜグローバル関数は望ましくないのですか? – Boris

+0

[This(http://stackoverflow.com/questions/19158339/why-are-global-variables-evil)答えは私ができるよりも雄弁に説明します。 – Dodosaur

+0

申し訳ありませんが、私は入力して提出した。基本的な要点は、関数がグローバル変数を使用する場合、それに影響を与える関数の範囲外のものがあるため、コードを理解しにくくすることです。 – Dodosaur

関連する問題