Forum » Programiranje » Python 2D array problem
Python 2D array problem
DOOM_er ::
Pozdravljeni,
imam preveč časa in si programiram minolovca. Naletel sem na meni relativno zanimiv problem in sicer mi na indeksih kjer je ali ena ali druga dimenzija skrajna ne šteje pravilno bomb. Da boste bolje razumeli sem prilepil kodo. Kaj naredi upam da je jasno
main.py
ter modul za kreiranje polja bombCheck.py
Hvala za pomoč, ampak me res zanima kaj se dogaja, razumel bi da bi python preskočil indeks in prišel spet na prvotno lokacijo, ker večina polja je dejansko pravilno označena, težave so samo "desno spodaj" ampak nevem, to da se indeks obrne in preide iz 10 na 1 mi ne gre v glavo, ali pač?
imam preveč časa in si programiram minolovca. Naletel sem na meni relativno zanimiv problem in sicer mi na indeksih kjer je ali ena ali druga dimenzija skrajna ne šteje pravilno bomb. Da boste bolje razumeli sem prilepil kodo. Kaj naredi upam da je jasno
main.py
#Imports import bombCheck as bC import numpy as np global Field #Vars #Field size i = 0 j = 9 bombNum = 15 w, h = 10, 10 bC.generateField(w, h, bombNum) print(np.matrix(bC.Field))
ter modul za kreiranje polja bombCheck.py
#Module for checking bomb number import random Field = [[0, 1], [0, 1]] def generateField(w, h, bombNum): #Create play field global Field Field = [[0 for x in range(w)] for y in range(h)] #Populate with bombs for i in range(0, bombNum, 1): bombx = random.randint(0, w - 1) bomby = random.randint(0, h - 1) if Field[bombx][bomby] == 0: Field[bombx][bomby] = 'X' else: i -= 1 setFieldsNum() def setFieldsNum(): global Field for i in range(len(Field)): for j in range(len(Field[i])): if Field[i][j] == 'X': updateFields(i, j) def updateFields(x, y): global Field # x - 1, y - 1 try: if Field[x - 1][y - 1] != 'X': Field[x - 1][y - 1] += 1 except: pass # x - 1, y try: if Field[x - 1][y] != 'X': Field[x - 1][y] += 1 except: pass # x - 1, y + 1 try: if Field[x - 1][y + 1] != 'X': Field[x - 1][y + 1] += 1 except: pass # x, y -1 try: if Field[x][y - 1] != 'X': Field[x][y - 1] += 1 except: pass # x, y + 1 try: if Field[x][y + 1] != 'X': Field[x][y + 1] += 1 except: pass # x + 1, y - 1 try: if Field[x + 1][y - 1] != 'X': Field[x + 1][y - 1] += 1 except: pass # x + 1, y try: if Field[x + 1][y] != 'X': Field[x + 1][y] += 1 except: pass # x + 1, y + 1 try: if Field[x + 1][y + 1] != 'X': Field[x + 1][y + 1] += 1 except: pass
Hvala za pomoč, ampak me res zanima kaj se dogaja, razumel bi da bi python preskočil indeks in prišel spet na prvotno lokacijo, ker večina polja je dejansko pravilno označena, težave so samo "desno spodaj" ampak nevem, to da se indeks obrne in preide iz 10 na 1 mi ne gre v glavo, ali pač?
Robots will steal your job. But that's OK
- spremenil: DOOM_er ()
Spura ::
Sicer ne poznam pythona, ampak maš pa češke prijeme za reševanje stvari, zaradi katerih imaš potem probleme.
1. generateField
Če v for i -> 0..n loopu zmanjšuješ index, potem verjetno počneš nekaj neumnega. Lahko bi imel funkcijo, ki zgenerira hashset N random 2-tupletov (parov koordinat). Ali pa da bi vsaj v while zanki postavljal mine na random lokacije, in štel koliko ti jih rata postavit.
Tako pa imaš neko kjut i-=1 resitev, ki niti ne dela. Delala bi v Cju, v pythonu pa ne bo, ker spreminjanje i variable ne spreminja katero število bo naslednjič vrnil range generator. Očitno ti ni jasen koncept generator/iterator objektov.
To da funkcija namesto, da bi vrnila field, nastavi globalno variablo in še pred koncem pokliče drugo funkcijo, ki to globalno variablo uporablja, namesto, da bi le-ta polje dobila kot argument, je pa češnja na vrhu torte.
2. updateFields
Namesto, da bi omejil indekse, raje pustiš da se mečejo napake in jih loviš. Tega se ne počne. In ravno zaradi tega imaš probleme. Ker v pythonu array[-1] ne vrze napake, ampak vrne zadnjega. Ce bi omejil indexe tega problema ne bi imel.
1. generateField
Če v for i -> 0..n loopu zmanjšuješ index, potem verjetno počneš nekaj neumnega. Lahko bi imel funkcijo, ki zgenerira hashset N random 2-tupletov (parov koordinat). Ali pa da bi vsaj v while zanki postavljal mine na random lokacije, in štel koliko ti jih rata postavit.
Tako pa imaš neko kjut i-=1 resitev, ki niti ne dela. Delala bi v Cju, v pythonu pa ne bo, ker spreminjanje i variable ne spreminja katero število bo naslednjič vrnil range generator. Očitno ti ni jasen koncept generator/iterator objektov.
To da funkcija namesto, da bi vrnila field, nastavi globalno variablo in še pred koncem pokliče drugo funkcijo, ki to globalno variablo uporablja, namesto, da bi le-ta polje dobila kot argument, je pa češnja na vrhu torte.
2. updateFields
Namesto, da bi omejil indekse, raje pustiš da se mečejo napake in jih loviš. Tega se ne počne. In ravno zaradi tega imaš probleme. Ker v pythonu array[-1] ne vrze napake, ampak vrne zadnjega. Ce bi omejil indexe tega problema ne bi imel.
DOOM_er ::
# -*- coding: utf-8 -*- """ Module for generating playing """ import random # Variables #Matrix for playing field Field = [[0, 1], [0, 1]] #Height and width of field h = 8 w = 8 mindX = h - 1 mindY = w - 1 #Number of bombs bombNum = 10 def generateField(w, h, bombNum): #Create play field global Field Field = [[0 for x in range(w)] for y in range(h)] #Populate with bombs for i in range(0, bombNum, 1): bombx = random.randint(0, w - 1) bomby = random.randint(0, h - 1) if Field[bombx][bomby] == 0: Field[bombx][bomby] = 'X' else: i -= 1 setFieldsNum() def setFieldsNum(): global Field for i in range(len(Field)): for j in range(len(Field[i])): if Field[i][j] == 'X': updateFields(i, j) def updateFields(x, y): global Field # x - 1, y - 1 if (x > 0) and (y > 0): if Field[x - 1][y - 1] != 'X': Field[x - 1][y - 1] += 1 # x - 1, y if (x > 0): if Field[x - 1][y] != 'X': Field[x - 1][y] += 1 # x - 1, y + 1 if (x > 0) and (y < mindY): if Field[x - 1][y + 1] != 'X': Field[x - 1][y + 1] += 1 # x, y -1 if (y > 0): if Field[x][y - 1] != 'X': Field[x][y - 1] += 1 # x, y + 1 if (y < mindY): if Field[x][y + 1] != 'X': Field[x][y + 1] += 1 # x + 1, y - 1 if (x < mindX) and (y > 0): if Field[x + 1][y - 1] != 'X': Field[x + 1][y - 1] += 1 # x + 1, y if (x < mindX): if Field[x + 1][y] != 'X': Field[x + 1][y] += 1 # x + 1, y + 1 if (x < mindX) and (y < mindY): if Field[x + 1][y + 1] != 'X': Field[x + 1][y + 1] += 1
# -*- coding: utf-8 -*- #Imports import bombCheck as bC import numpy as np #Vars #Field size bC.generateField(bC.w, bC.h, bC.bombNum) print(np.matrix(bC.Field))
sem popravil. Sicer nevem zakaj bi moral komplicirati, meni je logika za postavljanje min popolnoma všeč in deluje ter je tudi logična. Iterator i se povečuje ali zmanjšuje vsakič ko gre v zanko. For zanka ni nič drugega kot malce lepše zapisan while kjer povečujemo indeks i.
Robots will steal your job. But that's OK
Spura ::
Sicer nevem zakaj bi moral komplicirati, meni je logika za postavljanje min popolnoma všeč in deluje ter je tudi logična.Ne deluje. Klici generateField(10, 10, 100) parkrat. Vsa polja bi morala biti mine, pa niso.
A ti stekas kaj je to generator? range(0,10) bo vrnil 0,1,2,3,4,5,6,7,8,9 ne glede na to kaj ti delas.
Iterator i se povečuje ali zmanjšuje vsakič ko gre v zanko.
In for i in range(0,10) bo nastavil i na zacetku vsake ponovitve zanke na 0,1,2,3,4,5,6,7,8,9. Kaj ti v zanki pocnes z i se ne pozna nic pri naslednjem obhodu zanke.
Poleg tega ta tvoja stvar ne dela za asimetricna polja. generateField(5, 10, 50) mi vrze exception skoraj vsakic.
Pa se to:
For zanka ni nič drugega kot malce lepše zapisan while kjer povečujemo indeks i.To niti priblizno ne drzi v pythonu.
For zanka v pythonu je tako kot foreach zanka v C# ali Javi. To sploh ne dela z indexi ampak odpre iterator/generator in vraca njegove elemente. for i in range(0,10) simulira klasicen for s tem, da imas generator ki vraca zaporedne stevilke.
Zgodovina sprememb…
- spremenil: Spura ()
Vredno ogleda ...
Tema | Ogledi | Zadnje sporočilo | |
---|---|---|---|
Tema | Ogledi | Zadnje sporočilo | |
» | Izdelava algoritmaOddelek: Znanost in tehnologija | 1556 (936) | Klemen86 |
» | Recursive FunctionsOddelek: Šola | 1562 (1022) | lebdim |
» | Matlab pomočOddelek: Programiranje | 2128 (1432) | Jan23 |
» | [Python] učenjeOddelek: Programiranje | 2678 (1975) | Isotropic |
» | Šah [Pacsal]Oddelek: Programiranje | 2237 (1840) | NeOman |