2013-10-06 20 views
9

Benim kodum bir Tic Tac Toe oyunu için ve bir çekiş durumunu kontrol ediyor ama bence bu soru daha yararlı olabilir. Genel anlamda.python herhangi bir() ve all() kullanarak bir listenin bir değer kümesini veya başka bir değeri içerip içermediğini kontrol etmek için

oyuncu onların işaretleyici ile değiştirilir geçti int bir hamle yapar
board = [1,2,3,4,5,6,7,8,9] 

('x' ya da 'o'):

Ben şöyle, tahta temsil eden bir liste var Zaten kazanan bir devlet aramak için yerinde kontrollerim var, yapamayacağım şey, liste değerlerinin hiçbiri ints değil, ancak kazanan bir devletin ayarlanmadığı bir çekiş durumunu kontrol etmektir.

kod var bugüne kadar:

if any(board) != playerOne or any(board) != playerTwo: 
    print 'continue' 
elif all(board) == playerOne or playerTwo: 
    print 'Draw' 

if deyimi eserler ise, elif, ben sorun ben kontrol etmek istediğini benim 'veya' operatör olduğunu düşünmüyor: her eğer gemide madde playerOne işaretleyici veya playertwo işaretleyici ya, ben kodu yapmak nerede ise: Ben gemide her yerde playerOne veya playertwo olan gemide her yerde olup olmadığını görmek için kontrol olacaktır

elif all(board) == playerOne or all(board) == playerTwo: 

, olmayacak.

Oyuncunun playerOne belirteçleri ve playerTwo belirteçleri tarafından kurulup kaldırılmadığını nasıl kontrol ederim?

+3

nasıl [ 'herhangi()'] (http://docs.python.org/3/library/functions.html#any) ve [:

Ayrıca bakınız ] (http://docs.python.org/3/library/functions.html#all) work: _ "Yinelenen True" (eğer herhangi biri/tümü) öğesi true ise döndürür. False. "_ –

cevap

20

all ve any bir iterable almak işlevleri ve belirlenmesi: ya all() durumunda

  • : eğer tüm değerleri iterable False olmayan olup; any() durumunda
  • : ,'un yinelenebilir değerdeki değerlerinin False.

Bu işlevlerin nasıl çalıştığını biraz yanlış anladınız.

if any(foobars) == big_foobar: 

... any(foobars) ilk boolean değeri big_foobar kıyasla olacağını daha sonra True veya False birine değerlendirilir ve olurdu çünkü: Dolayısıyla

aşağıdaki sen öyle düşündüğüm tamamen birşey yapmaz Temel olarak her zaman size False verir, foobar'lar booller değildir.

Not: yinelenebilir bir liste olabilir, ancak aynı zamanda bir jeneratör/jeneratör ifadesi (≈ tembel olarak değerlendirilen/oluşturulan liste) veya başka bir yineleyici de olabilir.

Bunun yerine ne istiyor geçerli: temelde ilk dizisi verir bir iterable oluşturur

if any(x == big_foobar for x in foobars): 

Boolean-için foobars her öğe, bu big_foobar öğeyi karşılaştırır ve elde edilen boole yayar Elde edilen dizi: o zaman

tmp = (x == big_foobar for x in foobars) 

anytmp tüm öğelerin yürür vedöndürürilk True öğeyi bulduktan hemen sonra. Aşağıdaki vermedi sanki:

foobars = ['big', 'small', 'medium', 'nice', 'ugly'] 
big_foobar = 'big' 
any(['big' == big_foobar, 'small' == big_foobar, 'medium' == big_foobar, ...]) 

Not: DSM işaret gibi basitçe y in xs yazmak ve çok daha hızlı, daha kolay okunur -bu gibi any(x == y for x in xs) vaka daha iyi ifade edilir.

Bazı örnekler:

any(x > 5 for x in range(4)) # => False 
all(isinstance(x, int) for x in range(10)) # => True 
any(x == 'Erik' for x in ['Erik', 'John', 'Jane', 'Jim']) # => True 
all([True, True, True, False, True]) # => False 

şiddetle basitçe IPython kabuk üzerindeki, daha iyisi any ve Python kabuğunda veya çeşitli girişler ile all ile oynarken öneririz nasıl bu eserlerin bir fikir edinmesini gerçek kod yazmaya devam etmeden önce. `) (` Gerçekten değil http://docs.python.org/2/library/functions.html#all

+2

Bence" (foobarlarda x için x == big_foobar ") yerine' foobar'larda big_foobar 'yazmak daha akılcı olur. – DSM

+0

Tamam, yani satırımı değiştirmek için: eğer varsa (board)! = PlayerOne veya herhangi bir (board)! = PlayerTwo: Bu: (x! = PlayerOne veya x! = PlayerTwo in board) :? – DasSnipez

+0

@DSM: Evet, elbette, ama örneklerimi onun kullanım durumlarına dayandırmak zorunda kaldım :) –

İlgili konular