Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: Python: Python

Sivun loppuun

janijohannes [14.02.2010 10:05:36]

#

On nyt multa niin miljoona aihetta tääl, että teen nyt uuden aiheen Python-kysymyksille.

Ohjelmani heittää tälläisen errorin:

Traceback (most recent call last):
  File "RoleGame.py", line 138, in <module>
    prog()
  File "RoleGame.py", line 108, in __call__
    self.Piirra()
  File "RoleGame.py", line 97, in Piirra
    t1 = self.EtsiTT(self.map,2)
  File "RoleGame.py", line 76, in EtsiTT
    for i in len(t):
TypeError: 'int' object is not iterable

Noh virheessä näkyikin komento johon kaatui, mutta laitan tähä 'EtsiTT'-funktion.

def EtsiTT(self,t,ets):
    for i in len(t):
        if t[i]==ets:
            return i

ja olen varmistanut, että 'self.map' on taulukko

Chiman [14.02.2010 10:09:56]

#

for i in len(t):
TypeError: 'int' object is not iterable

Tuo tarkoittaa, että yrität iteroida kokonaislukua, mikä ei ole sallittua. Ehkä

for i in range(len(t)):

toimii kuten olit ajatellut.

janijohannes [14.02.2010 10:11:19]

#

Ahaa! Tuo oli unohtunut.

Chiman [14.02.2010 10:15:45]

#

Koko näkyvän koodiosan toiminnan hoitaisi yksinkertainen

t.index(ets)

Se heittää poikkeuksen, jos etsittävää ei löydy, joten sen joudut käsittelemään erikseen.

Metabolix [14.02.2010 10:17:11]

#

Mitä for-silmukassa pitäisi olla in-sanan jälkeen? Voitko kirjoittaa for i in 10? Entä in len(t)? Mitä muuta voisi kokeilla? (Loogiset kokeilut ovat ohjelmoinnissa tehokas tapa selvittää, miten jokin rakenne toimii.)

Vastaus kysymykseesi löytyy monesta eri kohdasta opassarjaa, ainakin for-silmukan kohdalta.

(Edit: myöhässä...)

janijohannes [15.02.2010 17:30:19]

#

Minulla on nyt pieni ongelma piirtämisen kanssa.
Olisiko jotenkin mahdollista rajata näkyvyysalue 10x10 alueelle hahmon ympäriillä (merkitty numerolla 2)

Game.Piirra():

def Piirra(self,merkit=" #@¨~*KLV"):
    cls()
    t2=0;t1=10
    ln=""
    for a in self.map:
        for s in a:
            try:
                if t1 <= 0: break
                if s == 2: t2=1
                ln = "%s%s" % (ln, merkit[int(s)])
            except:
                ln = "%s" % (ln)
            if t2==1: t1=t1-1
        print "%s" % (ln)
        ln == ""
        if t1 <= 0: break

Yritin tuommoista värkätä, muttei se kovin toiminut...

Metabolix [15.02.2010 18:21:23]

#

Kannattaa säilyttää maasto yhdessä paikassa (map) ja hahmo ja muut olennot toisessa paikassa (oliot). Olioita ei ole koskaan tarpeen sijoittaa kartalle, vaan riittää, että ne käsittelee piirtovaiheessa (ja tietysti törmäyksiä tarkistaessa ym.):

for y in range(self.hahmo.y - 5, self.hahmo.y + 5 + 1):
    rivi = ""
    for x in range(self.hahmo.x - 5, self.hahmo.x + 5 + 1):
        # Yleensä näkyy lattia tai seinä kartalta.
        # (Jos käytät kartassa lukuja, voit tässä muuttaa ne merkeiksi.)
        merkki = kartta[y][x]
        # Tutkitaan kuitenkin, onko jokin olio tässä kohti.
        for olio in self.oliot:
            # Jos olio on tässä, vaihdetaankin sen merkki.
            if (olio.x == x) and (olio.y == y):
                merkki = olio.merkki
                # Samassa kohdassa voi varmaankin olla vain yksi (?),
                # joten lopetetaan silmukka ensimmäiseen löytyneeseen.
                break
        rivi += merkki
    print rivi

janijohannes [15.02.2010 19:17:09]

#

Hmm...
Tuon toteuttaminen vaatisi koko systeemin rakentamisen uudelleen. Kartat on suunniteltu niin, että niihin merkitään joko numeroilla tai merkeillä, että mitä siinä kohdassa sisältää.
Olisiko tuohon jtn. keinoa?

jalski [15.02.2010 20:11:28]

#

Miten olisi, jos käyttäisit Tkinter:iä ja Canvas widgettiä pelin graafiseen esittämiseen? Kartan voit tallentaa vaikka yksinkertaisesti 2-ulotteiseen taulukkoon. Kartan ruudussa olevan sisällön määrittelyyn kelpaa aivan hyvin numero.

janijohannes [15.02.2010 21:01:19]

#

Yritin jo Tkinterillä, muttei onnistu.
Se ei suostu piirtään sitä tekstiä ja getchi ei toimi sillon.

jalski [15.02.2010 22:31:33]

#

Mihin tarvitset getch:iä?

Tarkoituksenasi on ilmeisesti liikuttaa pelihahmoa lukemalla näppäimistösyötettä?

Tk:n kanssa toimiessa oikea tapa on bindata näppäimistön painallukset canvakseen ja käsitellä ne eventissä.

Canvaksessa on suoraan tuki tekstille. Kartan piirtoon kannattaa kuitenkin käyttää canvaksen bitmappia tai imagea.


Taidanpa tehdä harjoituksena Infernolle oman Tk-toteutuksen Limbolla. Käytän varmaankin panel widgetiä piirtämiseen, koska se on joustavin vaihtoehto ja voin käyttää suoraan Infernon järjestelmä moduleita grafiikan tuottamiseen.

janijohannes [16.02.2010 18:07:04]

#

Ja mites tämä käytännössä tehdään?

jalski [16.02.2010 18:59:51]

#

Googlella löytyy nopeasti jotain, millä pääset Tkinterin Canvaksen kanssa alkuun:

http://www.builderau.com.au/program/python/soa/Tkinter-canvas-freeform-GUIs-in-Python/0,2000064084,339281815,00.htm

http://effbot.org/tkinterbook/canvas.htm

http://tkinter.unpythonic.net/pydoc/

http://www.pythonware.com/library/tkinter/introduction/events-and-bindings.htm

janijohannes [03.03.2010 18:40:17]

#

Miten saisin rajattua taulukkoa?
Elikkä kun on x,y taulukko, miten saan 10 ruutua eteen, taakse, ylös ja alas paikasta jossa on luku "2"?

Metabolix [03.03.2010 18:46:35]

#

Johan tuossa aiemmassa viestissäni neuvoin. Jos välttämättä haluat säilyttää luvun vain taulukossa, sinun täytyy joka piirtokerralla ensin etsiä se, jotta voit soveltaa neuvojani. Muuta tapaa ei ole; pakkohan ohjelman on jotenkin tietää piirrettävän alueen rajat kartalla, jotta voisi piirtää sen.

jalski [04.03.2010 19:56:39]

#

Jos haluat harjoitella tuota kartan toteuttamista taulukon avulla ja sen kanssa touhuamista, niin voisit toteuttaa jonkun hauskan, mutta toteutukseltaan riittävän yksinkertaisen harjoitusohjelman.

Oma ehdotukseni tällaiseksi harjoitusohjelmaksi olisi vaikkapa: Langton's ant

Nettimato [06.03.2010 12:56:43]

#

Onko python maksullinen?

jalski [06.03.2010 12:59:23]

#

Ei ole. Tuolta löytyypi: http://www.python.org/

Nettimato [06.03.2010 13:02:23]

#

mikä niistä olisi paras?

nomic [06.03.2010 17:54:49]

#

Nettimato kirjoitti:

mikä niistä olisi paras?

Miten olisi uusin versio sille alustalle mitä käytät?

Metabolix [06.03.2010 19:24:02]

#

Nettimato: Aloita Python-oppaasta, jonka liitteessä kerrotaan Pythonin asennuksesta. Jos on kysyttävää, tee kysymyksillesi oma keskustelu, mutta lue kuitenkin ensin keskustelun ohjeet, jotta osaat esittää asiasi järkevästi.


Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta