2013-11-24 13 views
5

Python'da bir Roguelike programlamak için this tutorial üzerinden çalışmayı yeni bitirdim ve şimdi nereye gideceğimi ve ne yapacağımı anlamaya başlıyorum.Öğeleri ve özelliklerini harici bir dosyada saklayabilir ve gerektiğinde arayabilir miyim? (Python'da bir Roguelike programlarken)

Durumumun kötülüğünün karışıklığı var. Öğeleri bir yerde saklamak istiyorum, örneğin; yaratıklar; becerileri; Kendileri için çok sayıda özelliği olan çok sayıda yer olabilir.

Şu anda, tüm bu kod, oldukça büyük olan tek bir dosyadadır ve bu en temel düzeydedir. Bir seviyede öğeleri yerleştirmek için fonksiyon şu anda böyle çok görünür: gibi ben fazla öğe eklemek niyetinde gibi

def place_objects(room): 

    #Maximum number of items per room 
    max_items = from_dungeon_level([[1, 1], [2, 4]]) 

    #Chance of each item (by default they have a chance of 0 at level 1, which then goes up) 
    item_chances = {} 
    item_chances['heal'] = 35 
    item_chances['lightning'] = from_dungeon_level([[25, 4]]) 
    item_chances['fireball'] = from_dungeon_level([[25, 6]]) 
    item_chances['confuse'] = from_dungeon_level([[10, 2]]) 
    item_chances['sword'] = from_dungeon_level([[5, 4]]) 
    item_chances['shield'] = from_dungeon_level([[15, 8]]) 

    #Choose a random number of items 
    num_items = libtcod.random_get_int(0, 0, max_items) 

    for i in range(num_items): 
     #Choose random spot for this item 
     x = libtcod.random_get_int(0, room.x1+1, room.x2-1) 
     y = libtcod.random_get_int(0, room.y1+1, room.y2-1) 

     #Only place it if the tile is not blocked 
     if not is_blocked(x, y): 
      choice = random_choice(item_chances) 
      if choice == 'heal': 
       #Create a healing potion 
       item_component = Item(use_function=cast_heal) 
       item = Object(x, y, '~', 'Salve', libtcod.light_azure, item=item_component) 
      elif choice == 'lightning': 
       #Create a lightning bolt scroll 
       item_component = Item(use_function=cast_lightning) 
       item = Object(x, y, '#', 'Scroll of Lightning bolt', libtcod.light_yellow, item=item_component) 
      elif choice == 'fireball': 
       #Create a fireball scroll 
       item_component = Item(use_function=cast_fireball) 
       item = Object(x, y, '#', 'Scroll of Fireball', libtcod.light_yellow, item=item_component) 
      elif choice == 'confuse': 
       #Create a confuse scroll 
       item_component = Item(use_function=cast_confuse) 
       item = Object(x, y, '#', 'Scroll of Confusion', libtcod.light_yellow, item=item_component) 
      elif choice == 'sword': 
       #Create a sword 
       equipment_component = Equipment(slot='right hand', power_bonus=3) 
       item = Object(x, y, '/', 'Sword', libtcod.sky, equipment=equipment_component) 
      elif choice == 'shield': 
       #Create a shield 
       equipment_component = Equipment(slot='left hand', defense_bonus=1) 
       item = Object(x, y, '[', 'Shield', libtcod.sky, equipment=equipment_component) 

      objects.append(item) 
      item.send_to_back() 

, bu fonksiyon ciddi uzun alacak (düzey oluşturulursa, bu işlev denir) Daha sonra her bir öğenin öğesinin yapmasını sağlamak için oluşturulması gereken tüm işlevler olacaktır. Bu işi main.py'den alıp başka bir yerde saklamak istiyorum, bununla birlikte çalışmayı kolaylaştırmak için, ama şu anda bunu nasıl yapacağımı bilmiyorum. İşte

deneyin ve sorunun düşünmek için benim girişimleri şunlardır:

ben her öğenin içerdiği özelliklerin bir sayı ile bir öğe sınıfı içeren bir dosya alabilir; (isim, tür, koşul, büyü, simge, ağırlık, renk, açıklama, equip_slot, materal). Daha sonra numaralı öğenin dosyasında yer alan öğelerin işlevlerini saklayın. Ana dosya, bu dosyayı ne zaman arayacağını bilir?

Tüm öğe verileri harici bir dosyada (XML veya başka bir şey gibi) depolanabilir ve gerektiğinde buradan okunabilir mi?

Bu, yalnızca öğelerden fazlasına uygulanabileceğim bir şeydir. Bu gerçekten, gerçekten istediğim şey bir ana döngü ve organizasyonun daha iyi bir yapısı olduğunda, oyundaki binlerce yaratık çizgiyi işaretleyerek tüm yaratıkları, öğeleri ve diğer nesneleri tutan gerçekten şişirilmiş bir anaçık olmamanız için gerçekten yararlı olacaktır.

cevap

1

İnsan tarafından okunabilir dosyalara ihtiyacınız yoksa, Python'un pickle kitaplığını kullanmayı düşünün; Bu, dosyalara yazılabilen ve okunabilen nesneleri ve işlevleri serileştirebilir.

class Equipment(Object): 

class Sword(Equipment): 

class Item(Object): 

class Scroll(Item): 
: fazla iyileştirme için

game/ 
    main.py 
    objects/ 
     items.py 
     equipment.py 
     creatures.py 

, örneğin yapmak için devralma kullanın:

organizasyon açısından

, sen örneğin ana oyun döngü gelenler sınıfları dışarı ayıran bir nesne klasörü olabilir

Daha sonra, örneğin kılıcı, başlangıçta tanımlanabilir (örneğin hangi eldedir) ve sadece belirli bir kılıca (örn. isim, güç ikramiyesi) göre değişen şeylerin aktarılması gerekir.

1

Tüm öğe verileri saklanabilir harici bir dosyada (XML veya gibi bir şey) ve gerektiğinde buradan okuyabilirsiniz?

Bunu, ConfigParser modülüyle yapabilirsiniz.

Öğelerin özelliklerini ayrı bir dosyada (normal, metin dosyası) saklayabilirsiniz. Nesnelerinizi otomatik olarak oluşturmak için bu dosyayı okuyun.

import ConfigParser 
from gameobjects import SwordClass 

config = ConfigParser.RawConfigParser() 
config.read('example.cfg') 

config_map = {'Sword': SwordClass} 
game_items = [] 

for i in config.sections(): 
    if i in config_map: 
     # We have a class to generate 
     temp = config_map[i]() 
     for option,value in config.items(i): 
      # get all the options for this sword 
      # and set them 
      setattr(temp, option, value) 
     game_items.append(temp) 
: dosyayı okumak için, Şimdi

import ConfigParser 

config = ConfigParser.RawConfigParser() 
config.add_section('Sword') 
config.set('Sword', 'strength', '15') 
config.set('Sword', 'weight', '5') 
config.set('Sword', 'damage', '10') 

# Writing our configuration file to 'example.cfg' 
with open('example.cfg', 'wb') as configfile: 
    config.write(configfile) 

: Burada bir rehber olarak belgelere örnekler kullanmak için gidiyorum

İlgili konular