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.
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ä"
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.
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)
Kiitos paljon vastauksista. Viimeinen viesti selvensi asioita, jotka on olleet vielä hieman pimennossa.
Aihe on jo aika vanha, joten et voi enää vastata siihen.