Saatan olla ihan helvetin tyhmä ja tälleen, mutta mitä täytyy kirjoittaa jotta Python-ohjelma tyhjentää ruudun?
Pöllin tämän koodin tuolta Oppaasta, mutta muuttelen sitä kivasti.
# -*- coding: latin-1 -*- kartta = [[1, 1, 1, 1, 1, 1], [1, 2, 1, 1, 0, 0], [1, 0, 0, 0, 0, 1], [1, 0, 1, 1, 0, 1], [1, 3, 0, 0, 0, 1], [1, 1, 1, 1, 1, 1]] omay = 1 omax = 1 merkit = " #@!" #BTW, tuo ! on taikajuoma. Pistän sen toimimaan jossain vaiheessa :3 while True: for rivi in kartta: for ruutu in rivi: print merkit[ruutu], print if omay == 1 and omax == 5: print "Pääsit maaliin!" break suunta = raw_input("Suunta (y/a/v/o): ") uusix = omax uusiy = omay if suunta == "y": #Tässä on ongelma. pitäisi saada ohjelma tyhjentämään ruutu joka siirron välissä. uusiy = omay - 1 if suunta == "a": uusiy = omay + 1 if suunta == "v": uusix = omax - 1 if suunta == "o": uusix = omax + 1 if kartta[uusiy][uusix] == 0: kartta[omay][omax] = 0 kartta[uusiy][uusix] = 2 omay = uusiy omax = uusix
PS. Google ei kertonut vastausta kunnolla.
Käytätkö ANSI-terminaalia?
print "\033[2J"
Ruudun tyhjentäminen riippuu käytetystä terminaalista. Pythonin curses-moduuli tarjoaa monipuoliset mahdollisuudet tehdä erilaisia tekstipohjaisia käyttöliittymiä, ja hoitaa terminaalin ohjaamisen puolestasi. Pythonin dokumentaatiosta löytyy opas cursesin käyttöön: http://docs.python.org/2/howto/curses.html Curses on monipuolinen kirjasto, ja sen käyttö voi alussa tuntua hieman hankalalta. Koska näytät olevan vielä aloittelemassa ohjelmointia, en panostaisi tässä vaiheessa terminaalilla kikkailuun.
Suuri osa terminaaleista tukee ANSI-ohjauskoodeja, ja näin yksinkertaisissa ohjelmissa voi olla perusteltua käyttää niitä suoraan.
import sys # Ruudun tyhjennys sys.stdout.write("\x1b[2J") # Ruudun tyhjennys ja kursorin siirto vasempaan yläkulmaan sys.stdout.write("\x1b[2J\x1b[H")
Toisaalta voit myös ”tyhjentää” ruudun tulostamalla monta tyhjää riviä. Toki tulostus tällöin jatkuu ruudun alareunasta, mutta ainakin temppu toimii vielä useammassa ympäristössä kuin ANSI-ohjauskoodit.
print "\n" * 50
Öhm. Onko YHTÄÄN semmoista tapaa (ei tuo tyhjärivi-spämmi) joka toimisi missä tahansa Python-hommelissa? Jos vaikka jaan valmiin pelin nettiin, niin sen pitäisi sitten toimia ihan joka ikisellä joka sitä pelaa.
Tyhärivi-spämmi tulee kysymykseen vain, jos ei löydy muuta tapaa.
lare290 kirjoitti:
Öhm. Onko YHTÄÄN semmoista tapaa (ei tuo tyhjärivi-spämmi) joka toimisi missä tahansa Python-hommelissa?
Ei.
lare290 kirjoitti:
Öhm. Onko YHTÄÄN semmoista tapaa (ei tuo tyhjärivi-spämmi) joka toimisi missä tahansa Python-hommelissa?
Curses toimii käytännössä kaikkialla. Toki joku voi pelata vaikka kaukokirjoittimella, jossa paperin tyhjentäminen ei ole mahdollista, mutta en huolehtisi siitä.
-tossu- kirjoitti:
Curses toimii käytännössä kaikkialla.
Windowsissa se ilmeisesti vaatii kuitenkin jotain kikkailua.
Ja mites tämä Curses toimii? joku sen niminen moduuli/kirjasto mikälie asentui tähän automaattisesti niiden muiden kanssa. Eli mitä pitää sitten tehdä, jos se on jo tässä?
BTW, onko pythonissa "tai"-koodia? että esim "sejase = 5 TAI sejase = 4 niin tapahtuu näinjanäin"
jotenkin näin.
Lisäys: Äh, näyttää ihan helvetin vaikealta. mie meen aidan matalasta osasta ja käytän tuota tyhjärivispämmeriä.
pythonissa on toki loogiset operaattorit, eli esimerkkisi olisi: sejase==5 or sejase==4
Useammalla vaihtoehtoisella arvolla ehdon voi tehdä siististi näin:
if sejase in (4, 5):
Kiitti, ootte auttanut tosi paljon :3
Lisäys: No nyt tuli tämmöinen ongelma. Kun hahmo ottaa avaimen, niin miten voin hävittää muuttujat (tai mikälie nyt onkaan)avainy ja avainx (avaimen koordinaatit), jotta avain ei olisi enää olemassa? kartalta osaan sen hävittää mutta se jää kuitenkin tyhjälle lattialle kummittelemaan.
Lisäys:
Selvennykseksi pätkä koodia:
if omay in (avainy - 1, avainy, avainy + 1) and omax in (avainx -1, avainx, avainx + 1): kartta = [[1, 1, 1, 1, 1, 1], [1, 0, 1, 1, 0, 0], [1, 0, 0, 0, 0, 1], [1, 0, 1, 1, 0, 1], [1, 0, 0, 0, 5, 1], [1, 1, 1, 1, 1, 1]] avainy = 6 avainx = 6 #eli täällä. väliaikaisesti laitoin sen siirtämään avaimen koordinaatit vain nurkkaan.
Ps. jos joku tietää tehokkaamman tavan tehdä esineen poimimis-järjestelmä, niin saa kertoa ihan vapaasti.
Lisäys: PPs. tämän keskustelun saa siirtää vaikka projekti-puolelle jos voi ja osaa.
lare290 kirjoitti:
miten voin hävittää muuttujat
Mitä luulet tuossa if-lauseessa tapahtuvan, jos käyttämiäsi muuttujia ei ole ollenkaan olemassa? Voit vaikka kokeilla:
if olematon_muuttuja == 1: print "?"
Tästä tulee tietenkin virheilmoitus. Et siis halua oikeasti hävittää muuttujia. Arvojen asettaminen pelialueen ulkopuolelle on ihan hyvä ratkaisu. (Itse käyttäisin silloin negatiivisia arvoja, jotta kartan koko ei vaikuttaisi asiaan.) Toinen vaihtoehto on, että laitat erilliseen muuttujaan tiedon, onko avain jo poimittu, ja tarkistat osuman vain, jos ei vielä ole. Kolmas paljon parempi vaihtoehto on, että luovut kokonaan erillisistä muuttujista ja katsot suoraan kartasta, onko pelaajan vieressä avain; on aivan turha säilyttää samaa tietoa sekä kartassa että muissa muuttujissa.
lare290 kirjoitti:
tämän keskustelun saa siirtää vaikka projekti-puolelle jos voi ja osaa.
Tämä keskustelu ei kuulu projektialueelle, koska tämä keskustelu ei käsittele projektiasi ideana tai käyttäjän näkökulmasta vaan alkeellisia kysymyksiäsi Pythonista.
Luulen, että sinun kannattaisi nyt malttaa koodata enemmän itsenäisesti. Toisessa keskustelussa kyselit, miten oppii ohjelmoimaan. Vastaan tässä: koodaa paljon ja ratkaise ongelmat itse miettimällä, kokeilemalla ja lukemalla oppaita. Jos tulee vastaan jokin mahdoton ongelma, mieti sitä ensin rauhassa ja tee vaikka välillä jotain muuta äläkä ryntää liian kärkkäästi kyselemään.
lare290 kirjoitti:
Kun hahmo ottaa avaimen, niin miten voin hävittää muuttujat (tai mikälie nyt onkaan)avainy ja avainx (avaimen koordinaatit), jotta avain ei olisi enää olemassa?
Anna muuttujalle avainx arvo None merkiksi siitä, ettei avainta ole. Se ei ole sama asia kuin muuttujien hävittäminen, mutta et voi hävittää muuttujia kokonaan, ettei ohjelmasi kaadu, kun se koittaa seuraavan kerran tarkistaa, oletko avaimen vieressä. Lisää myös if-lauseen alkuun ehto "avainx != None". Muutoin ohjelmasi kaatuu, kun se yrittää laskea "None - 1".
lare290 kirjoitti:
Ps. jos joku tietää tehokkaamman tavan tehdä esineen poimimis-järjestelmä, niin saa kertoa ihan vapaasti.
Voit tallentaa esineet pelkästään karttaan, ja tarkistaa, mitä hahmon alla on. Jos se on esine, poistetaan se kartasta ja lisätään esineet-taulukkoon.
esineet = ["taikajuoma", "avain"] # Lisätään toinen taikajuoma esineet.append("taikajuoma") # Käytetään yksi taikajuoma esineet.remove("taikajuoma") # Tarkistetaan, onko yhtään taikajuomaa jäljellä if "taikajuoma" in esineet: print "Taikajuomia on jäljellä"
Voiko Pythonissa arvotulle luvulle antaa rajat, joiden sisältä se sitten arpoo random luvun? Ja miten?
ja voiko Python arpoa erilaisista tapahtumista, esim. jotta saisin peliin hirviön kävelemään random suuntaan joka vuorolla?
Lisäys: Tiedän että kyselen liikaa, mutta on aika vaikea mistään päätellä tälläisiä asioita.
Vaikea päätellä? No aivan varmasti on. Mitä jos arvailun sijaan lukisit käyttöohjeet? Näkyyhän tuolla random-moduulilla olevan useampikin funktio, joka voisi sellaisenaan sopia. Ajattelin jo aluksi, ettet osannut matikkapäällä ratkaista, miten liukuluvusta väliltä 0.0 - 1.0 saa johdettua vapaavalintaisia lukuvälejä...
lare290 kirjoitti:
Tiedän että kyselen liikaa, mutta on aika vaikea mistään päätellä tälläisiä asioita.
Tiedon etsiminen on aivan eri asia kuin päätteleminen. Ensin voit selata Ohjelmointiputkan Python-oppaan uudestaan läpi, ja sitten voit kokeilla eri hakukoneita kysymyksesi tärkeimmillä sanoilla (esim. Python ja random). Tässä tapauksessa jopa tiedän, että näillä keinoilla varmasti löytyy sopivia paloja ratkaisuun, joten jos väität muuta, et varmasti ole kokeillut. Jos joskus et löydäkään ratkaisua, on usein hyvä jättää asia hautumaan muutamaksi päiväksi ja koodata välillä muuta.
Jatkossa myös tee uusille kysymyksille uusi aihe. Nythän ei puhuta enää ruudun tyhjentämisestä.
lare290 kirjoitti:
Voiko Pythonissa arvotulle luvulle antaa rajat, joiden sisältä se sitten arpoo random luvun? Ja miten?
Voit käyttää funktiota random.randint(), jolle annetaan ala- ja yläraja.
import random luku = random.randint(10, 13) print(luku) # 10, 11, 12 tai 13
lare290 kirjoitti:
ja voiko Python arpoa erilaisista tapahtumista, esim. jotta saisin peliin hirviön kävelemään random suuntaan joka vuorolla?
Voit arpoa satunnaisen luvun ja käydä if-lauseilla eri vaihtoehdot läpi.
import random suunta = random.randint(0, 3) if suunta == 0: print("ylös") elif suunta == 1: print("oikealle") elif suunta == 2: print("alas") elif suunta == 3: print("vasemmalle")
lare290 kirjoitti:
Tiedän että kyselen liikaa, mutta on aika vaikea mistään päätellä tälläisiä asioita.
Jos ei itse keksi tai löydä vastausta, kannattaa ehdottomasti kysyä! Ei muuten opi.
Aihe on jo aika vanha, joten et voi enää vastata siihen.