2017-12-12 3 views
0

現時点では、ゲームのようなマスターマインドタイプのコードを作成しようとしています。 私は現在、ユーザーの推測が正しいかどうかを確認しようとしているところに固執しています。私は、出力は何それは実際に私を与えることはマスターマインドのチェック結果python

3 white pegs 
0 black pegs 

白ペグある

1 white pegs 
1 black pegs 

になりたい

colours = ["R","O","Y","G","B","I","V"] 

n = 1 
ans = random.choices(colours, k = 4) 
print(*ans) 
guess = input("what is your guess? ") 

[guess[i:i+n] for i in range(0, len(guess), n)] 

guess = (guess.upper()) 

def check(): 
    correct = False 
    right = 0 
    wrong = 0 
    if guess == ans: 
     correct = True 
    elif guess != ans: 
     correct = False 
     for i in range(0,(len(guess))): 
      for x in range(0,(len(ans))): 
       if guess[i] in ans: 
        wrong += 1 

        break 


    print(right,"black pegs") 
    print(wrong,"white pegs") 
    return 
check() 

ans = "R O Y Y"た場合、およびguess = "R G O O" は黒、右の色、間違った場所を意味し、ペグは右の色を意味する、右の場所

黒いペグのコーディングをどうすればできますか?

+0

は 'ここだけの記事で間違いなく、そのない私のコードで – matt6297

+0

コードは、あなたがそれがないと述べてきたように動作しません、それは' ANS =「ROYY」のために6本の白いペグを出力申し訳ありません@khelwoodと '推測=" RGOOは " –

+0

@ニッカ、ちょうどダブルチェックし、私が言ったものを出力しません(私の悪い、修正されます)しかし、あなたも言った。出力するものは '3白いペグ' – matt6297

答えて

1

が、私はそれが簡単に理解することになりますこと、あなたの問題の一部は、あなたが関数にロジックを分離しないたことと思われるもの私は仕事をcount_whitecount_blackcheckに分けました。

あなたが気づく最初の事はRが白として分類されている(それは黒でなければなりませんが)とBOTH O sが故にansOに対してカウントされているので、それはだ、["R","O","Y","Y"]["R","G","O","O"]は3本の白いペグを与えたことです図3に示すように、白いペグは実際には黒いペグよりも計算するのがずっと難しい。

黒ペグが

black = 0 
for i in range(len(guess)): 
    if guess[i] == ans[i]: 
     black += 1 

または、より多くのニシキヘビを使用して計算することができ、機能に:白人

def count_black(ans, guess): 
    return sum([ans[i] == guess[i] for i in range(len(ans))]) 

、あなただけの色が両方のリストに発生したかどうかを確認する必要がありますそれがある場合は、ansから削除してください。もう一度チェックしないでください。

def count_white(ans, guess): 
    temp_ans = ans[:] 
    white = 0 
    for i in guess: 
     if i in temp_ans: 
      temp_ans.remove(i) 
      white += 1 
    return white 

上記のは、ペグが正しい位置にある場合は、を無視します。これは、黒の数から正しい位置に何人がいるかわかっているので、大丈夫です。これらの関数に移動したことを今

あなたcheckは単純になります返さFalseはそれが正しかったかどうかであることを

>>> check(["R","O","Y","Y"],["R","G","O","O"]) 
1 black pegs 
1 white pegs 
False 

注:

def check(ans, guess): 
    white = count_white(ans, guess) 
    black = count_black(ans, guess) 
    white -= black 

    print(black,"black pegs") 
    print(white,"white pegs") 

    return black == 4 

に結果として得られます。私は完全にあなたは文字が多く表示された場合、何が起こるかのようなものを指定しなかったので、あなたのコードを達成しようとしているのかを理解していない

import random 
colours = ["R","O","Y","G","B","I","V"] 
ans = [random.choice(colours) for i in range(4)] 
print(''.join(ans)) 

def count_white(ans, guess): 
    temp_ans = ans[:] 
    pegs = 0 
    for i in guess: 
     if i in temp_ans: 
      temp_ans.remove(i) 
      pegs += 1 
    return pegs 

def count_black(ans, guess): 
    return sum([ans[i] == guess[i] for i in range(len(ans))]) 

def check(ans, guess): 
    white = count_white(ans, guess) 
    black = count_black(ans, guess) 
    white -= black 

    print(black,"black pegs") 
    print(white,"white pegs") 

    return black == 4 

guess = [] 
while guess != ans: 
    guess = list(input("what is your guess?").upper()) 
    check(ans, guess) 
+0

私たちのチャットで、私はあなたに私に与えたコードに関する質問をしました。 @NickA – matt6297

+0

@ matt6297いいえ、申し訳ありませんが、時間がありません。関数、リスト/リストの補完と 'for'ループのトピックを学ぶことをお勧めします –

0

guess[i] == ans[x] 

あなたは、文字列全体の文字ではない文字、:)

を比較し、あなたがカウントされ、どのされていない色を追跡するために持っているので、私は、これは実際にあなたの問題を解決するかどうかわからないのでまだ今から

0

実際には、あなたの現在の紋章が繰り返し色を正しく処理しないため、黒色の釘では些細ですが、白い釘ではやや複雑です。だから、あなたは推測の各要素を正しい場所で正しい色に2回、間違った場所に2番目に正しい色で調べることができました見つけた要素を削除してを複数回数えないようにしました。簡単な方法は、ループの前に変更可能なコピーを取ることです。

ansと仮定するとguessの両方が反復可能です、あなたはコードがなる可能性:

def check(ans, guess): 
    correct = False 
    right = 0 
    wrong = 0 
    if guess == ans: 
     correct = True 
     right = len(guess) 
    else: 
     correct = False 
     test = list(ans)  # take a modifiable copy 
     for i, colour in enumerate(guess): 
      if ans[i] == colour:  # is it at the correct place? 
       right += 1 
      elif colour in test:  # if not is it present? 
       test.remove(colour) # count it only one 
       wrong += 1 
    print(right,"black pegs") 
    print(wrong,"white pegs") 
    return correct 
0

このように、すべてのコードは、のように記述することができます一度は推測ではなく、ansに一度だけ出現する。とにかく、これはあなたが探している出力を与えるはずです。

def check(): 
    ans = "ROYY" 
    guess = "RGOO" 
    correct = False 
    right = 0 
    wrong = 0 
    if guess == ans: 
     correct = True 

    for i in ans: 
     j = 0 
     while(j < len(guess)): 
      if i in guess and i == guess[j]: 
       right += 1 
       break 
      elif i in guess and i != guess[j]: 
       wrong += 1 
       break 
      elif i not in guess: 
       break; 
     j += 1 

    print(right,"black pegs") 
    print(wrong,"white pegs") 
    return 
check()