Tic Tac Toe készítés Python 3-ban?
Szisztok!
Nemrég kezdtem el Python-ba programozni, és szeretném megérteni, hogyan működik ez a program:
def tic_tac_toe():
board = [1, 2, 3, 4, 5, 6, 7, 8, 9]
end = False
win_commbinations = ((0, 1, 2), (3, 4, 5), (6, 7, 8), (0, 3, 6), (1, 4, 7), (2, 5, 8), (0, 4, 8), (2, 4, 6))
def draw():
print(board[0], board[1], board[2])
print(board[3], board[4], board[5])
print(board[6], board[7], board[8])
print()
def p1():
n = choose_number()
if board[n] == "X" or board[n] == "O":
print("\nYou can't go there. Try again")
p1()
else:
board[n] = "X"
def p2():
n = choose_number()
if board[n] == "X" or board[n] == "O":
print("\nYou can't go there. Try again")
p2()
else:
board[n] = "O"
def choose_number():
while True:
while True:
a = input()
try:
a = int(a)
a -= 1
if a in range(0, 9):
return a
else:
print("\nThat's not on the board. Try again")
continue
except ValueError:
print("\nThat's not a number. Try again")
continue
def check_board():
count = 0
for a in win_commbinations:
if board[a[0]] == board[a[1]] == board[a[2]] == "X":
print("Player 1 Wins!\n")
print("Congratulations!\n")
return True
if board[a[0]] == board[a[1]] == board[a[2]] == "O":
print("Player 2 Wins!\n")
print("Congratulations!\n")
return True
for a in range(9):
if board[a] == "X" or board[a] == "O":
count += 1
if count == 9:
print("The game ends in a Tie\n")
return True
while not end:
draw()
end = check_board()
if end == True:
break
print("Player 1 choose where to place a cross")
p1()
print()
draw()
end = check_board()
if end == True:
break
print("Player 2 choose where to place a nought")
p2()
print()
if input("Play again (y/n)\n") == "y":
print()
tic_tac_toe()
tic_tac_toe()
1. Kérdés: a boardba 1-9 ig írta a számokat, viszont a win_commbinations-ba 0-8 ig írja őket
A "Def_board-nál is 0-8-ig írja a számokat. Ez miért így van?
2. Kérdés: miért kellett betenni egy end = False-ot? Ezzel mit akar elérni?
3. Kérdés: print("\nYou can't go there. Try again")
p1()
A p1()-et miért írja le utána?
4. Kérdés: def choose_number():
while True:
while True:
Miért kell 2 While True? Egy nem elég?
5. Kérdés: try:
a = int(a)
a -= 1
if a in range(0, 9):
return a
a = int(a)-val mit akar csinálni
a -= 1-et miért kell oda írni?
"return a" mit csinálni?
6. Kérdés: def check_board():
count = 0
for a in win_commbinations:
if board[a[0]] == board[a[1]] == board[a[2]] == "X":
Ez az egész mit csinál?
7. Kérdés:
for a in range(9):
if board[a] == "X" or board[a] == "O":
count += 1
if count == 9:
print("The game ends in a Tie\n")
return True
Szintúgy nem értem, hogy mit csinál.
8. Kérdés: while not end:
draw() ->Ezt miért kellett odaírni
end = check_board()
if end == True: -> Ha már itt van hogy break akkor utána miért írja ki újra, hogy hova akar rakni az 1. es játékos.
break
print("Player 1 choose where to place a cross")
p1() -> Szintén, miért van itt
print()
draw() -> Ez is miért pont itt van?
end = check_board()
if end == True:
break
print("Player 2 choose where to place a nought")
p2()
print()
1. Pythonban a listák számozása 0-ról indul. Ez azt jelenti, hogy ha listában tárolod a 9 mező értékét, akkor 0-8 sorszámmal hivatkozhatóak. Az adatbekérés azonban a kényelmesebb emberi intuíciót használja, ami szerint a lista első eleme nem a nulladik, hanem az első elem. Szóval például ha az egyes mezőt választod, akkor az egyes számot adod meg, a program kivon belőle egyet, és így jut el a nulladik listaelemhez, ahol az első mező értéke ténylegesen tárolva van.
2. Annak ott semmi értelme. Egyébként az egész kód borzalmas, bár a legtöbb dolognak legalább van értelme. Ennek nincs. Véletlenül maradhatott benne.
3. Talán ezen a szinten még felesleges magad olyan dolgokkal összezavarni, mint a rekurzív függvények. Itt ez történik. Röviden: egy függvény meghívhatja saját magát, és esetenként ez jó dolog. Itt mondjuk pont nem, mert célszerűbb lenne egy while ciklus e helyett a megoldás helyett. Lényegében ugyanis azt akarja elérni, hogy miután nem megengedett értéket adsz meg, akkor az értékbekérő kódrész fusson le még egyszer a hibaüzenet után. Ezt a függvény újbóli, rekurzív meghívásával éri el. Végül is nem azt mondom, hogy nem működik így is, bár egy bizonyos mélység után hibát fog dobni, mert a rekurzió nem mehet a végtelenségig (a python nem engedi), a while ciklus meg igen.
4. Behúzások nélkül nem egyszerű értelmezni a python kódot, főleg egymásba ágyazott ciklusok esetén, mint ez is itt most. Legközelebb kódmegosztó oldalt használj, mert a Gyakori automatikusan kiszedi a behúzást, és így értelmezhetetlenné válik a kód.
Miért van két while ciklus? Több okból. Egyrészt, mert ez egy borzalmasan megírt kód. Másrészt azért, mert két tesztelés történik a megadott értékre, és mindkét teszt kudarca után újraindul a ciklus, hogy bekérje az adatot még egyszer. A külső ciklus arra tesztel, hogy az érték szám legyen. A belső ciklus meg arra, hogy a szám, már ha túljutott a teszten, és tényleg szám, akkor 1 és 9 közé esik-e. De mivel behúzások nélkül lehetetlen eldönteni, melyik sor melyik kódtömbhöz tartozik, ezért én sem tudom pontosan kibogarászni. Az kapásból baromság, hogy continue van a ciklus végén, mert ez elkezdi a következő ciklust, ami enélkül is újraindulna, mikor a végére ér, szóval felesleges.
5. Az input() függvény, ami bekéri az adatot, mindig string típusú lesz. Ahhoz, hogy a megadott számot ténylegesen számként használhasd, először integer típusúvá kell alakítani. Ezt csinálja az int() függvénnyel.
6. A win_combinations változóban meg van adva azoknak a mező kombinációknak a sorszáma, amelyeknek ha azonos az értéke (mind X vagy mind O), akkor az illető nyert. 3 sor, 3 oszlop, két átló. Itt ezt ellenőrzi. Végigmegy a nyerő kombinációkon egyenként, és megnézi az adott három sorszám értékét, hogy egyforma-e.
7. Végigmegy az összes mezőn, és ha az érték X vagy O, akkor növeli egy változó értékét eggyel. Ha a végén a változó értéke 9 lesz, az azt jelenti, hogy tele van a mező, de nincs győztes, úgyhogy döntetlen.
8. Most az end változó jól jönne, de rossz helyen van, így semmi értelme nincs (lásd 2. kérdés). A while ciklus megpróbálja tesztelni, de nem fogja megtalálni, mert a függvényben létrehozott változók csak a függvény belsejéből elérhetőek, akárhonnan nem. Aztán a cikluson belül megint létrehozná az end változót, de addig el se fog jutni ez a szerencsétlen a program.
A draw() kirajzolja a táblát, azért van ott.
"if end == True: -> Ha már itt van hogy break akkor utána miért írja ki újra, hogy hova akar rakni az 1. es játékos."
Az a break csak akkor szakítja meg a ciklust, ha vége a játéknak, mert az end elnyeri a True értéket. Egyébként meg folytatódik a játék. Erre való az if.
p1() ott van fentebb, hogy mit csinál. Ezzel választ mezőt player 1. Miután választ, megváltozik a tábla, úgyhogy újra ki kell rajzolni, ezért van ott még egy draw.
Három tanács:
1. Amíg kezdő vagy, használj értelmes tutorialokat, ismerkedj az alapfogalmakkal, és ne bonyolultabb kódokat próbálj megfejteni.
2. Ha kódok fejtésével akarsz fejlődni, akkor lehetőleg ne ilyen csapnivaló fércmunkákból tanulj. Ezt rossz nézni.
3. Sok kérdésre magadtól is rájöhettél volna pár perc gondolkodással. Ha már mindenképp így akarsz tanulni, akkor fejleszd azt a képességet is, hogy magadtól jössz rá, nézel utána dolgoknak. A programozásban ez elengedhetetlen.
Köszönöm szépen a segítséget!
Mostmár érthetőbb :)
Esetleg tudnál mondani olyan oldalakat, ahol Python-t tanulhatok? (Ami nem annyira elavult)
Most a SoloLearn alkalmazást használom.
Erről mi a véleményed?
Kapcsolódó kérdések:
Minden jog fenntartva © 2024, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!