Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: Python ongelmia

AeH [07.12.2008 14:36:48]

#

Tälläisen pienen harjoittelutyön tein ja nyt tarvitsisi hiema parannusehdoituksia itse koodiin ja uusia ideoita kaivataan.

# -*- coding: cp1252 -*-
def oraakkeli():
    raha = 100
    tikari = 5
    miekka = 10
    claymore = 20
    rautakeppi = 15
    aseet = ['Tikari', 'Miekka', 'Claymore', 'Rautakeppi',]    #Tekee listan
    print "Tervetuloa Oraakkelin asepajaan!"
    print "Mitä haluaisit ostaa?"
    print "Sinulla on käytössäsi %i kultakolikkoa" %(raha)
    print "---------------------"
    for tuote in aseet:
        print tuote   #Tulostaa aseet listan näytölle
    print "---------------------"
    komento = int(raw_input('Minkä aseen haluat ostaa: '))
    if komento == 1:
        if raha < 5:    #Jos rahaa on vähemmän kuin 5
            print "Sinulla ei ole tarpeeksi rahaa ostaaksesi Tikaria!"
        elif raha > 5:  #Muutoin jos rahaa on enemmän kuin 5
            print "Ostit tikarin, josta maksoit %i kultakolikkoa" %(tikari)
            print "Nyt sinulla on enää", raha-tikari, "kultakolikkoa jäljellä"
    elif komento == 2:
        if raha < 10:
            print "Sinulla ei ole tarpeeksi raha ostaaksesi Miekkaa!"
        elif raha > 10:
            print "Ostit Miekan, josta maksoit %i kultakolikkoa" %(miekka)
            print "Nyt sinulla on enää", raha-miekka, "kultakolikkoa jäljellä"
    elif komento == 3:
        if raha < 20:
            print "Sinulla ei ole tarpeeksi rahaa ostaaksesi Claymorea!"
        elif raha > 20:
            print "Ostit Claymoren, josta maksoit %i kultakolikkoa" %(claymore)
            print "Nyt sinulla on enää", raha-claymore, "kultakolikkoa jäljellä"
    elif komento == 4:
        if raha < 15:
            print "Sinulla ei ole tarpeeksi rahaa ostaaksesi Rautakeppiä!"
        elif raha > 15:
            print "Ostit Rautakepin, josta maksoit %i kultakolikkoa" %(rautakeppi)
            print "Nyt sinulla on enää", raha-rautakeppi, "kultakolikkoa jäljellä"
oraakkeli()

def inventori():
    inv = []

Eli pitäisi saada tehtyä inventorin ja itseltäni ei taidot ehkä vielä riitä sen tekemiseen. Tuo raha olisi varmaan paljon parempi erillisenä, jos aijon laajentaa ja tehdä lisää kauppoja. Ainuttakaan ideaa en ole saanut vielä aikaseksi, joten ideoita otetaan vastaan.

ville-v [07.12.2008 14:49:33]

#

Ehdotan, että laitat esineiden hinnatkin taulukkoon. Ostamisen voi sitten muokata tämän suuntaiseksi:

if raha < hinnat[komento]:
    print "Ei riitä."
else:
    raha -= hinnat[komento]
    print "Ostit esineen", esine[komento], "maksoit siitä ", hinnat[komento]
    print "Nyt sinulla on enää", raha, "kultakolikkoa jäljellä"

eq [08.12.2008 16:13:44]

#

Erillisten taulukoiden sijaan voit myös yhdistää hinnat ja esineet samaan taulukkoon, joko hash-taulukkoina tai pelkkinä taulukkoina, ts.

esineet = [{'nimi': 'miekka', 'hinta': 10}, ...]
esineet[0]['nimi'] == 'miekka', esineet[0]['hinta'] = 10
/* tai */
esineet [['miekka', 10], ...]
esineet[0][0] == 'miekka', esineet[0][1] == 10

En tiedä onko se tarkoituksenmukaista, mutta nykyisessä ohjelmassasi rahaa ei voi käyttää loppuun asti; ts. kymmenellä kolikolla et saisi Miekkaa, vaikka se sen hinta mitä ilmeisimmin on (ostotapahtuman jälkimmäinen tarkistus vaatii, että kolikoita on enemmän kuin tuotteen hinnaksi on määritelty; jos kolikkoja on vain yhtä paljon, ohjelma ei paitsi "osta" tuotetta (mitä se ei tee muutenkaan tällä hetkellä), mutta ei myöskään ilmoita pelaajalle mitään ostosta). Myös, tallennat esineiden hinnat muuttujiin, mutta et käytä muuttujissa olevia hintoja tarkistaessasi rahamäärän riittävyyttä, joten joutuisit hintoja muuttaessasi muuttamaan ohjelmaa monista kohdista.

Chiman [08.12.2008 18:58:19]

#

Tässä oma ehdotukseni. Ilman esimerkkikoodia idea ei aukea, mutten toisaalta halua tehdä valmiiksi toisen puolesta, joten tein rajoitetun esimerkin. Olioilla on helppo pitää kirjaa mm. ostetuista varusteista ja rahamäärästä.

Yleensä pitkiä if-elif-elif-listoja vältetään ja käytetään esim. dictiä (avain) tai listaa (indeksi) tarjoamaan vaihtoehdot. Tässä käytin listaa, koska indeksi riitti valintaan.

# -*- coding: cp1252 -*-

class Ase(object):
    def __init__(self, nimi, hinta):
        self.nimi = nimi
        self.hinta = hinta

class Pelaaja(object):
    def __init__(self, nimi):
        self.nimi = nimi
        self.rahat = 100
        self.varusteet = []


def oraakkeli(pelaaja):
    aseet = []
    aseet.append(Ase('Tikari', 5))
    aseet.append(Ase('Miekka', 10))

    print 'Sinulla on %d kultakolikkoa' % pelaaja.rahat
    print 'Tarjonta:'
    for i, a in enumerate(aseet):
        print '%d) %-12s %s' % (i+1, a.nimi, a.hinta)

    komento = int(raw_input('Ase jonka haluat ostaa: '))
    ostos = aseet[komento - 1]

    if ostos.hinta > pelaaja.rahat:
        print 'Rahasi eivät riitä (%s maksaa %d)' % (ostos.nimi, ostos.hinta)
    else:
        print '%s ostettu, maksoit %d' % (ostos.nimi, ostos.hinta)
        pelaaja.rahat -= ostos.hinta
        pelaaja.varusteet.append(ostos)


if __name__ == '__main__':
    p = Pelaaja('Ville')
    oraakkeli(p)

AeH [09.12.2008 16:57:20]

#

Kiitos paljon vastauksista. Viimeinen viesti selvensi asioita, jotka on olleet vielä hieman pimennossa.

Vastaus

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

Tietoa sivustosta