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
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.
Ahaa! Tuo oli unohtunut.
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.
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ä...)
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...
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
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?
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.
Yritin jo Tkinterillä, muttei onnistu.
Se ei suostu piirtään sitä tekstiä ja getchi ei toimi sillon.
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.
Ja mites tämä käytännössä tehdään?
Googlella löytyy nopeasti jotain, millä pääset Tkinterin Canvaksen kanssa alkuun:
http://effbot.org/tkinterbook/canvas.htm
http://tkinter.unpythonic.net/pydoc/
http://www.pythonware.com/library/tkinter/
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"?
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.
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
Onko python maksullinen?
Ei ole. Tuolta löytyypi: http://www.python.org/
mikä niistä olisi paras?
Nettimato kirjoitti:
mikä niistä olisi paras?
Miten olisi uusin versio sille alustalle mitä käytät?
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.
Aihe on jo aika vanha, joten et voi enää vastata siihen.