Hei. Minulla on pieni ongelma.
En saa vihollista Pythonilla tehtyyn labyrinttiin.
Sille pitäisi saada tekoäly,että se liikkuisi.
Olen koittanut saada paikallaan pysyvää vihollista,mutta sekään ei meinaa onnistua.
Olen tekemässä merkkigraafista peliä nimeltä Strikecamp.
Saan koodattua sen,että oma hahmo liikkuu,ja sen että ohjelma antaa viestin kun pääset maaliin.
Ainut ongelma on se että en saa vihollista tehtyä,jolle voisi lisätä tekoälyn,ja se voisi sen ansiosta liikkua ja iskeä takaisin.
HP,MP ja Raha muuttujat olen saanut koodattua.
Kiitos etukäteen ongelman ratkaisseille!
Omituista, kyllä minä saan vihollisen toimimaan ihan helposti.
Sellainen vastaus kuin kysymyskin. Kerro lisää, jos haluat, että joku pystyy auttamaan. Millä tavalla olet yrittänyt tehdä vihollisen, ja millä tavalla yrityksesi "ei onnistu"? Vihollisen toteuttaminen riippuu monesta asiasta. Millainen pelisi rakenne muilta osin on? Miten olet toteuttanut esimerkiksi pelaajan itsensä ja ympäröivän labyrintin? (Jos et osaa selittää, laita edes koodia näytille tänne, jos sitä on kohtalaisen vähän, tai johonkin pastebiniin, jos sitä on paljon.)
Pelaaja on perinteinen "@"-merkki.
Labyrintti on rakenteeltaan tällainen:
# # # # # # # @ # # . # # . . . . # # # # # . # # . . . . # # . # # # # # . . . # # # . # . . . # # # # # #
(Mod. lisäsi kooditagit!)
Sen koodi on:
kartta = [[1, 1, 1, 1, 1, 1], [1, 2, 1, 1, 0, 1], [1, 0, 0, 0, 0, 1], [1, 1, 1, 1, 0, 1], [1, 0, 0, 0, 0, 1], [1, 0, 1, 1, 1, 1], [1, 0, 0, 0, 1, 1], [1, 0, 1, 0, 0, 0], [1, 1, 1, 1, 1, 1]] omay = 1 omax = 1 merkit = ".#@"
Toisin sanoen olet kopioinut suoraan oppaassa olevan esimerkin ja lisännyt siihen yhden print-rivin sekä muuttanut karttaa vähän. Et ole oikeasti ohjelmoinut riviäkään (etkä ole tehnyt yhtään omaa muuttujaa!), eikä tuolta pohjalta voi oikein lähteä tekemään peliä. (Edit: muokkasit sitten kopioidun koodin pois viestistäsi...)
Jos nyt ihan varmasti haluat kehittää tuohon koodiin vihollisen, voit kopioida kaikki hahmon sijaintiin liittyvät koodit ja vaihtaa niistä jokaisen oma-sanan tilalle vihollinen. Tekoälyn saat lisättyä, kun korvaat vihollisen vuorolla raw_input-funktion omatekoisella funktiolla, joka palauttaa uuden kulkusuunnan.
Jos tässä selityksessä on mielestäsi jotain epäselvää, et osaa vielä ohjelmoida tarpeeksi. Siihen auttaa vain yksi keino: palaa opassarjan alkuun ja opettele jokainen selitetty asia niin, että ymmärrät kunnolla, miten se toimii. Yksi osaamisen mittari on, että pystyy kirjoittamaan kaikki esimerkkiohjelmat omin sanoin lunttaamatta riviäkään alkuperäisestä koodista ja pystyy vielä muokkaamaan niitä järkevästi hieman toisenlaisiksi.
Millä funktiolla saisi arvottua joko y,a,v,o (ylös,oikealle,vasemmalle,oikealle)sillä Randomia en saa toimimaan?
Voit arpoa randomilla luvun nollasta kolmeen ja ottaa sen mukaan merkkijonosta "yavo" yhden merkin. Muitakin tapoja on, mutta tämä sinun olisi pitänyt itsekin keksiä, jos luulet jo pystyväsi tekemään pelin.
Indeksin arpominen on se tavallisin tapa, mutta jos tarvitaan nimenomaan yksi merkki, on choice kätevin:
>>> from random import choice >>> choice('yavo') 'y'
Metabolix kirjoitti:
Voit arpoa randomilla luvun nollasta kolmeen ja ottaa sen mukaan merkkijonosta "yavo" yhden merkin. Muitakin tapoja on, mutta tämä sinun olisi pitänyt itsekin keksiä, jos luulet jo pystyväsi tekemään pelin.
Yritin arpoa sillä lukua,mutta en saanut sitä toimimaan.
Näytä miten yritit.
Chiman kirjoitti:
Näytä miten yritit.
Selvä: Yritin näin:
suunta = random (0, 3) uusix = vihollinenx uusiy = vihollineny if suunta == "0": uusiy = vihollineny - 1 if suunta == "1": uusiy = vihollineny + 1 if suunta == "2": uusix = vihollinenx - 1 if suunta == "3": uusix = vihollinenx + 1 if kartta[uusiy][uusix] == 0: kartta[vihollineny][vihollinenx] = 0 kartta[uusiy][uusix] = 2 vihollineny = uusiy vihollinenx = uusix
Miksi vertailuissa numerot ovat lainausmerkeissä? Ohjelmointikielissä yleensä ottaen tuo merkintä tarkoittaa merkkijonoa eikä yksinkertaisesti pelkkää numeroa.
Muuta tuo nyt alkuun...
Kannattaisi muuten varmaan tallentaa nuo mahdolliset suunnat taulukkoon x, y pareina (tuple) ja sitten käyttää tuota arvottua numeroa indeksinä taulukkoon, mistä uusi suunta haetaan.
Santeri P. kirjoitti:
Yritin näin:
suunta = random (0, 3)
Korvaa tuo tällaisella:
from random import randint suunta = randint(0, 3)
Ja sitten vertailuista muuta "0" -> 0 joka kohdasta, kuten jalski sanoi.
Kiitos ohjeista,vielä yksi ongelma,kun vihollinen liikkuu ensikerran se muuttuu samanlaiseksi kuin pelaaja. Sitä ei erota omasta pelaajasta :( Olisiko vielä tuohon vastausta?
Ymmärrätkö ollenkaan tuota liikutuskoodia? Siinä merkitään vanhaan kohtaan lattia ja uuteen kohtaan pelaaja. Keksitkö, mikä siis menee vikaan?
Siis,kun vihollinen merkitään pelissä &-merkillä.
Kun se liikkuu ensimmäisen kerran,siitä tulee @-merkki kuten pelaaja on jo.
Pelistä ei saa selvää jos vihollinen on samanlainen kuin pelaaja.
Luepa uudestaan. Sanoin, että merkitset liikkumisen yhteydessä karttaan uuteen kohtaan pelaajan. Kerronpa vielä vastauksenkin: sinun pitäisi merkitä siihen vihollinen eikä pelaajaa. Mieti: Millä numerolla pelaaja merkitään? Millä numerolla vihollinen merkitään? Missä kohti koodissa merkitään karttaan uusi sijainti?
Offtopiccina tähän voisi mainita, että on todella rasittavaa lukea postauksia joissa ongelmana on: Tää ei toimi auttakaa!!!!
Sen jälkeen pastetaan jokin valmis netistä löydetty koodinpätkä, josta ei tajuta yhtään mitään ja kysellään jälleen: Tää ei toimi auttakaa!!!
Vinkki: Lue jokin pythonin perusteet opettava kirja.
Metabolixin viimeinen postaus ratkaisee ongelman. Älä kysy miten saat seinät toimimaan tai vastaavia kysymyksiä ennen kuin tiedät missä/mikä ongelmasi on.
Tässä on koko koodi.
Onko jotain pielessä?
# -*- coding: latin-1 -*- kartta = [[1, 1, 1, 1, 1, 1], [1, 2, 1, 1, 0, 1], [1, 0, 0, 0, 0, 1], [1, 0, 1, 1, 0, 1], [1, 0, 0, 0, 0, 1], [1, 0, 1, 1, 0, 1], [1, 0, 0, 0, 0, 1], [1, 0, 1, 1, 3, 1], [1, 1, 1, 1, 1, 1]] pelaajay = 1 pelaajax = 1 vihollineny = 7 vihollinenx = 4 merkit = ".#@&" while True: for rivi in kartta: for ruutu in rivi: print merkit[ruutu], print if pelaajay == 7 and pelaajax == 4: print "Pääsit maaliin!" break if vihollineny == 1 and vihollinenx ==1: print "Hävisit!" break suunta = raw_input("Suunta (y/a/v/o): ") uusix = pelaajax uusiy = pelaajay if suunta == "y": uusiy = pelaajay - 1 if suunta == "a": uusiy = pelaajay + 1 if suunta == "v": uusix = pelaajax - 1 if suunta == "o": uusix = pelaajax + 1 if kartta[uusiy][uusix] == 0: kartta[pelaajay][pelaajax] = 0 kartta[uusiy][uusix] = 2 pelaajay = uusiy pelaajax = uusix from random import randint suunta = randint(0, 3) uusix = vihollinenx uusiy = vihollineny if suunta == 0: uusiy = vihollineny - 1 if suunta == 1: uusiy = vihollineny + 1 if suunta == 2: uusix = vihollinenx - 1 if suunta == 3: uusix = vihollinenx + 1 if kartta[uusiy][uusix] == 0: kartta[vihollineny][vihollinenx] = 0 kartta[uusiy][uusix] = 2 vihollineny = uusiy vihollinenx = uusix
Santeri P. kirjoitti:
Onko jotain pielessä?
Miksi kysyt, kun kerta tiedät hyvin itsekin, että kyllä on? Selitit ongelman jo useammassa viestissä ja tiedät milloin ja miten se ilmenee - mutta et ole korjannut sitä, koska kukaan ei ole antanut valmista, korjaavaa koodinpätkää.
Ongelman korjaamiseksi ks. Metabolixin viesti (kirjoitettu [06.11.2010 12:29:07]) ja toimi ohjeiden mukaan.
Kääntäkää koodi,ja liikkukaa pelissä.
Ymmärrätte sen ongelman paremmin.
Ongelma ilmenee vain pelatessa.
Kyllä kaikki täällä neuvoja antaneet tietävät, mikä ongelma on, miten se ilmenee ja miten sen voi korjata. Ei, sen ymmärtämiseksi ei tarvitse suorittaa koodia eikä ongelmaa ymmärrä ohjelmaa ajamalla "paremmin".
Se, että vihollinen saa ensimmäisen kierroksen jälkeen saman piirtomerkin kuin pelaaja on yksinkertaisesti ohjelmointivirhe. Virhe tapahtuu yhdellä ainoalla rivillä, ja korjaus on yhden merkin muuttamisen pituinen. Edelleen, lue ajatuksella läpi Metabolixin viimeisimmät kaksi viestiä.
Ohjelmointivirheen ilmeinen syy on se, että ohjelmoija ei ymmärrä ohjelmansa toimintaa.
Virhettä kannattaa metsästellä tuolta loppupuolelta. Riviltä 55 eteenpäin kannattaa lukea todella ajatuksella koodia.
Aihe on jo aika vanha, joten et voi enää vastata siihen.