» »

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
#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" :D 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.

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 ::

DOOM_er je izjavil:

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.

DOOM_er je izjavil:


Iterator i se povečuje ali zmanjšuje vsakič ko gre v zanko.
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.

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 ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

Izdelava algoritma

Oddelek: Znanost in tehnologija
61556 (936) Klemen86
»

Recursive Functions

Oddelek: Šola
141562 (1022) lebdim
»

Matlab pomoč

Oddelek: Programiranje
142128 (1432) Jan23
»

[Python] učenje

Oddelek: Programiranje
372678 (1975) Isotropic
»

Šah [Pacsal]

Oddelek: Programiranje
152237 (1840) NeOman

Več podobnih tem