Programmēšana • 9. nodarbība

Divdimensiju saraksti

Iemācies veidot sarakstu no citiem sarakstiem, piekļūt vērtībām pēc rindas un kolonnas un izmantot šo paņēmienu Tic Tac Toe spēles laukuma attēlošanai.

01 • Uzbūve

Saraksts, kurā ir citi saraksti

Divdimensiju saraksts ir saraksts, kura elementi paši ir saraksti. To var izmantot, lai glabātu datus tabulā: katrs iekšējais saraksts ir viena rinda, bet katra vērtība tajā ir kolonna.

Vienkārša 3 × 3 tabula

skaitli = [
    [1, 2, 3],
    [4, 5, 6],
    [7, 8, 9]
]
print(skaitli)
[[1, 2, 3], [4, 5, 6], [7, 8, 9]]

Ārējā sarakstā ir trīs rindas. Katrā rindā ir trīs elementi.

Tic Tac Toe spēles laukums

Spēles sākumā visas deviņas šūnas ir tukšas. Tukšu šūnu attēlojam ar atstarpi.

laukums = [
    [" ", " ", " "],
    [" ", " ", " "],
    [" ", " ", " "]
]
print(laukums)
[[' ', ' ', ' '], [' ', ' ', ' '], [' ', ' ', ' ']]
02 • Piekļuve vērtībām

Rindas un kolonnas indeksi

Lai iegūtu šūnas vērtību, izmanto divus indeksus: laukums[rinda][kolonna]. Abi indeksu skaitījumi sākas ar 0.

Izlasi un nomaini šūnu

laukums = [
    [" ", " ", " "],
    [" ", " ", " "],
    [" ", " ", " "]
]

print(laukums[0][1])  # pirmā rinda, otrā kolonna
laukums[0][1] = "X"
print(laukums[0][1])
X

Pirmais indekss izvēlas rindu, otrais — elementu šajā rindā. Pēc piešķiršanas šajā šūnā atrodas X.

Atceries: laukums[1][2] nozīmē otrā rinda un trešā kolonna. Abas vērtības ir indeksi, tāpēc tās sākas no 0.
03 • Attēlošana

Izdrukā spēles laukumu

Ar ciklu var iziet cauri rindām un izdrukāt tās lasāmā veidā. Funkcija join() ievieto atdalītāju starp rindas elementiem.

Parādi katru rindu

laukums = [
    ["X", "O", "X"],
    [" ", "X", " "],
    ["O", " ", "O"]
]

for rinda in laukums:
    print(" | ".join(rinda))
X | O | X | X | O | | O

Parādi arī rindu atdalītājus

for indekss in range(3):
    print(" | ".join(laukums[indekss]))
    if indekss < 2:
        print("---------")
X | O | X --------- | X | --------- O | | O

Nosacījums neizdrukā atdalītāju pēc pēdējās rindas.

04 • Praktiskais pielietojums

Tic Tac Toe gājiens un uzvaras rinda

Spēles gājienu var aprakstīt ar rindas un kolonnas indeksu. Pirms gājiena pārbaudām, vai izvēlētā šūna vēl ir tukša.

Ievieto spēlētāja simbolu

laukums = [
    ["X", "O", " "],
    [" ", "X", " "],
    ["O", " ", "O"]
]
rinda = 1
kolonna = 2

if laukums[rinda][kolonna] == " ":
    laukums[rinda][kolonna] = "X"
    print("Gājiens veikts")
else:
    print("Šī šūna jau ir aizņemta")

for rinda in laukums:
    print(" | ".join(rinda))
Gājiens veikts X | O | | X | X O | | O

Pārbaudi vienu uzvaras rindu

Trīs vienādi spēlētāja simboli rindā nozīmē uzvaru. Šis piemērs pārbauda augšējo rindu.

laukums = [
    ["X", "X", "X"],
    ["O", " ", "O"],
    [" ", "O", " "]
]

if laukums[0][0] == laukums[0][1] == laukums[0][2] == "X":
    print("X uzvar!")
X uzvar!

Līdzīgā veidā vari pārbaudīt pārējās rindas, kolonnas un abas diagonāles.

Spēles ideja: divdimensiju saraksts glabā laukuma stāvokli. Indeksi nosaka gājiena vietu, bet if pārbauda, vai gājiens ir atļauts.
05 • Praktizē

Praktiskie uzdevumi

1. Izveido savu laukumu

Izveido 3 × 3 tukšu Tic Tac Toe laukumu un izdrukā to ar print().

2. Piekļūsti šūnām

Izdrukā laukuma vidējo šūnu. Pēc tam nomaini apakšējās rindas pirmo elementu uz O.

3. Izdrukā visu laukumu

Izmanto ciklu, lai katru rindu parādītu atsevišķā rindā, pievienojot | starp šūnām.

4. Veic gājienu

Iestati mainīgos rinda un kolonna. Ar if pārbaudi, vai šūna ir tukša, un tad ievieto spēlētāja simbolu.

5. Atrodi uzvarētāju

Papildini piemēru, lai tas pārbauda arī kādu kolonnu vai diagonāli. Pievieno komentāru, kas paskaidro izvēlētos indeksus.

06 • Atceries

Ko esi apguvis?

  • Divdimensiju saraksts glabā iekšējos sarakstus, kas var attēlot rindas un kolonnas.
  • Elementam piekļūst ar diviem indeksiem: saraksts[rinda][kolonna].
  • Indeksi sākas no 0, un elementa vērtību var mainīt ar piešķiršanu.
  • Cikls var iziet cauri rindām un izdrukāt tabulu lasāmā veidā.
  • Tic Tac Toe laukumu var attēlot kā 3 × 3 sarakstu un ar nosacījumiem pārbaudīt gājienu vai uzvaras rindu.
07 • Pārbaudi zināšanas

Pašpārbaudes tests

Pārbaudi savas zināšanas par divdimensiju sarakstiem un spēles laukuma indeksiem!