2016-11-08 9 views
0

私はPythonでチック・タック・トゥ・ゲームを作るのに苦労しており、チートしたくないので、ここでは非常に具体的な質問をしています。私のボードがリストである:関数内の入力を使ってリスト内の要素を変更する

私はそれがグリッドのように見えるようにするには、以下の機能と別れる
lst = [1,2,3,4,5,6,7,8,9] 

def board(): 
    print (lst[:3]) 
    print (lst[3:6]) 
    print (lst[6:]) 

機能プリントを呼び出すように:

[1, 2, 3] 
[4, 5, 6] 
[7, 8, 9] 

私は入力を受け取り、リスト内の数字を文字列 'x'で置き換えようとしました:

def move(): 
    move1=(input('Player 1: Type a number!')) 
    for x in lst: 
     if move1 == x: 
      lst[x-1] = 'x' 
      board() 

これは、文字列を出力し、入力ボックスを提供しますが、リスト内の数字を「x」に置き換えません。私は機能に何か間違いがなければならないことを認識しています。誰かがそれを説明するために忍耐を持っているなら、私は非常に感謝します。

これで、ボードの数字を文字列に変換すると、よりよく見えます: ['1'、 '2'、 '3'] ['4'、 '5'、 '6' ] ['7'、 '8'、 '9']

そして、私はforループが 'x'のような文字列を見つけてそれを有効にしようとしていることに気付いたので、 (=「X」、などを場合のx!)それは「X年代をマークしたが、エラーが表示され、第2、PLのための時間だったときに、余分な条件になる前に

def move2(): 
    move2=int(input('Player 2: Type a number!')) 
    for x in lst: 
     if x != 'x' and x != 'o' and move2 == int(x): 
      lst[move2-1] = 'o' 
      board() 
      move() 
     elif x != 'x' and x != 'o' and move1 != int(x): 
       print('Not that number!') 
       board() 
       move2() 

:整数には、エラーが表示される場合がありますayerは数値を入力しますが(intは呼び出し可能ではありません)、今は何もしません。何か案は?

+0

あなたの関数では 'lst'がどこに定義されていますか? –

+0

ループ全体を 'lst [int(move1)-1)= 'x''で置き換えることができます –

+0

入力を整数' move1 = int(input(' Player 1:Numberを入力! ')にキャストする必要があります) '。 @ 1 '==' 1 ': 'が偽ならば' move1 == x: 'は作動可能です。 –

答えて

1
def move(): 
    move1=(input('Player 1: Type a number!')) 
    if move1.isdigit(): #check if the input is numeric 
     move1 = int(move1) 
     for x in lst: 
      if move1 == x: #now compares two ints, not str & int 
       lst[x-1] = 'x' 
       board() 

/試みることができる:

def move(): 
    move1=(input('Player 1: Type a number!')) 
    if move1.isdigit() and int(move1) < 10: 
       lst[int(move1)-1] = 'x' 
       board() 
1

あなたのリスト内の項目は文字列ではなく、ユーザー入力は文字列であるため、これは信じています。だから、何ができる:

try: 
    move1=int(input('Player 1: Type a number!')) 
catch ValueError: 
    print("Error input is not a number!") 

EDIT:オプションでmove1.isDigit(と場合に使用)の代わりに、あなたはクリーンアップができたキャッチ

+2

'try' /' catch'は一般にもっとPythonicと考えられます。とにかく 'int'変換が必要です(それを行うだけで、それがうまくいくかどうかはわかります)。そして、Pythonは一般的に[EAFP'パターン](https://docs.python.org/3/glossary)を奨励しています。html#term-eafp);失敗の処理に使用される例外を使用して、テストでのすべての操作の前に実行するのではなく、成功のケースが想定されます。 '' 123 '.isdigit() '(先頭と末尾のスペースを含む)は' False'ですが、 'int'の実際のコンストラクタは先頭と末尾の空白をうれしく無視します。 – ShadowRanger

+0

良いコール、私は.isDigit()関数について知りませんでした。 – Boris

+0

ありがとうShadowRanger、私はそれを知らなかった – TimTheEnchanter

関連する問題