• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Python warunek w ifie

Aruba Cloud VPS - 50% taniej przez 3 miesiące!
0 głosów
428 wizyt
pytanie zadane 27 lutego 2023 w Python przez niezalogowany

Nie wiem dlaczego warunek w podanym kodzie jest prawdziwy co skutkuje wykonaniem instrukcji break.

Przecież X lub O nie równa się 0.

 

import random as r

game = [[0,0,0],
		[0,0,0],
		[0,0,0]]

def table():
	print(game[0])
	print(game[1])
	print(game[2])


def computer(result,p_c = "X",n = 0,num = 0):
	if n:
		num = int(input("Podaj pozycje z zakresu 1-9"))

	if num-n <= 2:
		if game[0][num-n] == 0:
			game[0][num-n] = p_c
			result = False
			

	elif num-n <= 5:
		if num-n == 3:
			if game[1][0] == 0:
				game[1][0] = p_c
				result = False

		elif num-n == 4:
			if game[1][1] == 0:
				game[1][1] = p_c
				result = False
		else:
			if game[1][2] == 0:
				game[1][2] = p_c
				result = False
	
	elif num-n <= 8:
		if num-n == 6:
			if game[2][6] == 0:
				game[2][6] = p_c
				result = False
		elif num-n == 7:
			if game[2][7] == 0:
				game[2][7] = p_c
				result = False
		else:
			if game[2][8] == 0:
				game[2][8] = p_c
				result = False
			
		



print("Witaj w grze O i X")
while True:
	if (game[0][0] and game[0][1] and game[0][2] == "X" or "O") or (game[1][0] and game[1][1] and game[1][2] == "X" or "O") or (game[2][0] and game[2][1] and game[2][2] == "X" or "O") or (game[0][0] and game[1][0] and game[2][0] == "X" or "O") or(game[0][1] and game[1][1] and game[2][1] == "X" or "O") or (game[0][2] and game[1][2] and game[2][2] == "X" or "O") or (game[0][0] and game[1][1] and game[2][2] == "X" or "O") or (game[0][2] and game[1][1] and game[2][0] == "X" or "O"):
		break
	a = True
	b =True
	c = True
	table()
	while a == True:
		computer(a,"O",1)
	
	table()
	while b == True:
		computer(b,r.randint(range(9),1))
	table()
	while c == True:
		computer(c,"O",1)
	table()
	
print("Koniec Gry")
table()

 

2 odpowiedzi

0 głosów
odpowiedź 27 lutego 2023 przez tangarr Mędrzec (155,140 p.)

o.O

game[0][0] and game[0][1] and game[0][2] == "X" or "O"

Ten warunek oznacza

Wartość game[0][0] jest różny od zero/null
oraz (Wartość game[0][1] jest różna od zero/null
      oraz (
          Wartość game[0][2] jest równa "X"
          lub
          "O" jest różne od zero/null
          )
     )

Jeżeli zmienne game[0][0] i game[0][1] mają ustawione niezerowe wartości to dwa pierwsze warunki są spełnione. Wartość zmiennej game[0][2] nie ma znaczenia ponieważ łańcuch "O" ma "niezerową" wartość.

komentarz 27 lutego 2023 przez niezalogowany
Więc jaki warunek powinienem napisać?
komentarz 27 lutego 2023 przez tangarr Mędrzec (155,140 p.)
A jaki efekt chcesz uzyskać?
komentarz 27 lutego 2023 przez niezalogowany
Chcę aby warunek się spełniał jak w liście game pod danymi indeksami będzie wartość X lub O.
1
komentarz 27 lutego 2023 przez tangarr Mędrzec (155,140 p.)

Jesteś bardzo nieprecyzyjny. Musisz nad tym popracować.
Biorąc twoje słowa dosłownie: chcesz sprawdzić czy wybrane pola nie są puste.
Aby sprawdzić czy wszystkie pola w pierwszym wierszu są wypełnione użyj warunku

(game[0][0] == "X" or game[0][0] == "O")
and 
(game[0][1] == "X" or game[0][1] == "O")
and 
(game[0][2] == "X" or game[0][2] == "O")

Jednak podejrzewam, że chciałeś sprawdzić czy któryś z graczy wygrał. Wtedy warunek powinien wyglądać

(game[0][0] == "X" or game[0][0] == "O")
and
game[0][0] == game[0][1] 
and 
game[0][0] == game[0][2]

 

0 głosów
odpowiedź 28 lutego 2023 przez VBService Ekspert (255,840 p.)
edycja 28 lutego 2023 przez VBService

Za pomocą np. any można warunek dla wierszy zapisać np. tak

if  any(r == ['O']*3 or r == ['X']*3 for r in game):

a połączenie any i all pozwala na sprawdzenie kolumn

if any(all(game[r][c] == s for r in range(3)) for s in ['O','X'] for c in range(3)):

 

razem wiersze i kolumny (przykład pomija "po przekątnych")

[ on-line ]

if  any(r == ['O']*3 or r == ['X']*3 for r in game) or \
    any(all(game[r][c] == s for r in range(3)) for s in ['O','X'] for c in range(3)):

 

Podobne pytania

0 głosów
1 odpowiedź 789 wizyt
0 głosów
1 odpowiedź 285 wizyt
pytanie zadane 16 kwietnia 2022 w Python przez niezalogowany
0 głosów
5 odpowiedzi 932 wizyt
pytanie zadane 19 marca 2016 w C i C++ przez luparuwka Początkujący (400 p.)

93,103 zapytań

142,076 odpowiedzi

321,560 komentarzy

62,444 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

Wprowadzenie do ITsec, tom 1 Wprowadzenie do ITsec, tom 2

Można już zamawiać dwa tomy książek o ITsec pt. "Wprowadzenie do bezpieczeństwa IT" - mamy dla Was kod: pasja (użyjcie go w koszyku), dzięki któremu uzyskamy aż 15% zniżki! Dziękujemy ekipie Sekuraka za fajny rabat dla naszej Społeczności!

...