Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: Python: Pythonilla labyrinttiin vihollinen

Sivun loppuun

Santeri P. [05.11.2010 16:35:04]

#

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!

Metabolix [05.11.2010 16:40:40]

#

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

Santeri P. [05.11.2010 17:41:01]

#

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 = ".#@"

Metabolix [05.11.2010 17:42:32]

#

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.

Santeri P. [05.11.2010 20:39:21]

#

Millä funktiolla saisi arvottua joko y,a,v,o (ylös,oikealle,vasemmalle,oikealle)sillä Randomia en saa toimimaan?

Metabolix [05.11.2010 20:57:43]

#

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.

Chiman [05.11.2010 21:28:53]

#

Indeksin arpominen on se tavallisin tapa, mutta jos tarvitaan nimenomaan yksi merkki, on choice kätevin:

>>> from random import choice
>>> choice('yavo')
'y'

Santeri P. [06.11.2010 08:25:30]

#

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.

Chiman [06.11.2010 09:13:09]

#

Näytä miten yritit.

Santeri P. [06.11.2010 09:28:30]

#

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

jalski [06.11.2010 10:04:44]

#

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.

Chiman [06.11.2010 11:22:27]

#

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.

Santeri P. [06.11.2010 11:40:09]

#

Kiitos ohjeista,vielä yksi ongelma,kun vihollinen liikkuu ensikerran se muuttuu samanlaiseksi kuin pelaaja. Sitä ei erota omasta pelaajasta :( Olisiko vielä tuohon vastausta?

Metabolix [06.11.2010 12:18:15]

#

Ymmärrätkö ollenkaan tuota liikutuskoodia? Siinä merkitään vanhaan kohtaan lattia ja uuteen kohtaan pelaaja. Keksitkö, mikä siis menee vikaan?

Santeri P. [06.11.2010 12:21:55]

#

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.

Metabolix [06.11.2010 12:29:07]

#

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?

jimi-kimi [06.11.2010 14:00:49]

#

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.

Santeri P. [06.11.2010 15:23:02]

#

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

eq [06.11.2010 15:36:57]

#

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.

Santeri P. [06.11.2010 15:46:14]

#

Kääntäkää koodi,ja liikkukaa pelissä.
Ymmärrätte sen ongelman paremmin.
Ongelma ilmenee vain pelatessa.

eq [06.11.2010 15:50:07]

#

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.

Teuro [06.11.2010 15:59:39]

#

Virhettä kannattaa metsästellä tuolta loppupuolelta. Riviltä 55 eteenpäin kannattaa lukea todella ajatuksella koodia.


Sivun alkuun

Vastaus

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

Tietoa sivustosta