Nethack’te parşömenlerin otomatik fiyat tespiti


21

Oh tanrılar hayır !! Bizi burada Doorknob'la bırakamazsın! Her yerde nethack olacak! - 1b önce Geobits tarafından

Hayal kırıklığına uğratmadı ...

Giriş

(Fuarla ilgilenmiyorsanız ve / veya Tab Patlama Sendromu varsa bu bölümü atlayabilirsiniz )

Nethack'ın (ve Rogue ve aynı roguelike türündeki benzer oyunların) karakteristik mekaniğinden biri, tanımlama sistemidir . Oyunun başında, yalnızca başlangıç ​​envanterinizdeki öğeler "resmi olarak tanımlanır". Diğer nesnelerin büyük çoğunluğu bilinmeyen başlar; örneğin, bir "yansıma kalkanı" ilk olarak tanımlanmadan önce bir "parlak gümüş kalkan" olarak görünecektir.

"Parlak bir gümüş kalkan" sadece yansıma kalkanı olabilir , ancak bunun diğer iki durumda da ilginç sonuçları olabilir.

  1. Bazı öğeler birbirinden farklıdır, ancak aynı "görünüme" sahiptir. Örneğin, eğer bir " gri taş " bulursanız , dört şeyden biri olabilir: Bir çakmaktaşı taş (işe yaramaz), bir mihenk taşı (faydalı olabilir), bir yük taşı ( sizi bir ton ağırlığında ve sizi ağırlaştıracaktır ) düşüremezsin ), veya bir luckstone (oyunu kazanmak için neredeyse gerekli)

  2. Birçok öğe (kaydırır, değnekler, yüzükler, imla kitapları, bazı zırhlar vb.) Rastgele bir görünüme sahiptir. Bunun anlamı, iksirlerin sahip olabileceği bir dizi olası görünüme sahip olmasıdır; örneğin, [ altın iksiri , girdap iksiri , gazlı iksiri , mor-kırmızı iksiri vb.]. Bu görünüşe sonra rastgele aslında (ne atanmış şifa iksir , felç iksir , görünmez bkz iksir , polimorfunun iksir , vb.)

    Ki bu demek olduğunu altıgen muska olabilir bir oyun (Can kurtarma muska) içinde hayatını kurtarmak ve ölüme sonraki (boğulma muska) seni boğmak .

Doğal olarak, bu, tanımlayıcı öğeleri oyunun kritik bir parçası haline getirir. Öğeler "resmi olarak tanımlanabilir" anlamına gelir, yani kesinlikle kesin bir şekilde belli bir öğe olarak ortaya çıkacaklardır (ör. Bulduğunuz tüm mücevherli değnekler canavar yaratma değnekleri olarak gösterilecektir ); Bu öncelikle , tanımlamak için kullanılan kaydırma ya da imla kitapları aracılığıyla yapılır . Tipik olarak bunlar yetersiz kalsa da, ki bizi ...

Gayri resmi tanımlama. Bu, tanımlanamayan belirli bir öğenin belirli bir tür olduğundan (veya yalnızca birkaç türden biri olabileceğinden) emin olduğunuz (veya kesin olduğundan ), ancak henüz onu "resmen" tanımlamamış olduğunuz anlamına gelir. Bu birkaç yöntemle yapılabilir: çubuklar için gravür testi , halkalar için lavabo testi veya en yaygın yöntem ...

fiyat kimliği grafiği

... fiyat tanımlama ! Bu zorluk ne hakkında.

Kısaca, Doom Zindanları boyunca yer alan dükkanlar var (evet, dükkan sahipleri bazı yeraltı zindanlarına dükkan kurmanın iyi bir fikir olacağını düşündü; nedenini sorma). Bu dükkanlarda seyahatlerinizde rastladığınız çeşitli eşyaları alıp satabilirsiniz. Bir ürün alırken veya satarken, dükkan sahibi ilk önce size ne kadar satacağını / sizden satın alacağını söyleyecektir. Belirli öğelerin belirli fiyatlara sahip olması garanti edildiğinden, belirli bir öğe türünü gayri resmi olarak tanımlamak için bunu kullanabilirsiniz .

Işık kaydırma gibi bazı öğeler belirli bir miktara mal olan ve net bir şekilde tanımlamanıza izin veren tek öğelerdir; Bununla birlikte, çoğu ürün, aynı sınıftaki diğer ürünlerle bir fiyat grubunu paylaşır; bu, yalnızca olanakları daraltmanıza izin verir (ki bu hala faydalıdır). Bununla birlikte, bir ürünün alım / satım fiyatları bir dizi değişkenden ( Charisma stat'ünüz gibi) etkilenir . Bu nedenle yukarıdaki grafikte.

Nethack'ı sevdiğimi söyleyebilir misiniz?

Giriş

Giriş şu anda oynanmakta olan bir (vanilya, 3.4.3) Nethack oyunu olarak sağlanacaktır:

"For you, most gracious sir; only 177 for this scroll labeled VERR YED HORRE."
--More--

        ------------
        |          .                                        ---------
        |          |                         ----------     |    ^  |
        |          .##       ################.        +#   #.       .#
        |          | #                       |       _|#   #---------#
        |          | ###                   ##.<       |#   ####      #
        |          .#########################----------#      #      #
        ------------   ###     #         ############# #      #      #
           #             #  -----------  #             #      #   ####
         ###             ###|         |###             #      #   #----------
         #                 #.         |#             ### #    #   #|.???????|
        ##                  |         |#             #--------#   #|.??@????|
    ----.----###############.         |#             #|      |#   #-@???????|
    |.......+#              |         |#             #.      |#    ----------
    |.......|               |         .#              |      |#
    |......>|               -----------               |      +#
    ---------                                         --------


Wizard the Evoker         St:12 Dx:14 Co:11 In:16 Wi:12 Ch:10  Chaotic
Dlvl:2  $:0  HP:11(11) Pw:0(8) AC:9  Exp:1 T:11

Bu, birkaç özelliğe sahip olmanın garanti edildiği anlamına gelir:

  • Her zaman 24 satır uzunluğunda olacak.

  • Her satır, her zaman 80 karakter veya daha kısa uzunlukta olacaktır.

  • İkinci-en son satır, aşağıdaki "oluşacak belirteçleri oyuncunun adı ve başlık ( 'şeklinde,' foo çubuğu ((tek bir boşluk ile ayrılmış) niteliklerin listesi") ve oyuncunun hizalama Kanuni, Tarafsız veya Kaotik). Her belirteç , değişken sayıda boşlukla ayrılacaktır. 1

  • Niteliklerin listesi her zaman St:* Dx:* Co:* In:* Wi:* Ch:*, bir *karakterin 3 ile 25 arasında bir tam sayıyı temsil ettiği yerde olacaktır. 2 (Buradaki ilgi odağı, fiyatları hesaplamanız gereken son stat, Charisma'dır.)

  • İlk satır her zaman mağaza ile ilgili bir mesajdan oluşacaktır (özellikle, bir ürünü alırken veya satarken görüntülenen mesaj). Ayrıca, bu öğenin tek, tanımlanamayan, adsız bir kaydırma olacağı garanti edilir. Bir öğeyi satın almak için, bu:

    "For you, {TITLE}; only {PRICE} for this scroll labeled {LABEL}."--More--
    

    ve satış için:

    {SHK} offers {PRICE} gold pieces for your scroll labeled {LABEL}.  Sell it? [ynaq] (y)
    

    burada listelenen "değişkenler" {curly braces}aşağıdaki gibidir:

    • {TITLE}her zaman " iyi ", " onurlu ", " en zarif " veya " saygın " olanlardan biri, " hanımefendi " veya " efendim " ile birleştirilmiş.

    • {PRICE} her zaman bir tamsayıdır.

    • {LABEL}her zaman aşağıdakilerden biri olacaktır ( kaynak ):

      ZELGO MER       JUYED AWK YACC  NR 9             XIXAXA XOXAXA XUXAXA
      PRATYAVAYAH     DAIYEN FOOELS   LEP GEX VEN ZEA  PRIRUTSENIE
      ELBIB YLOH      VERR YED HORRE  VENZAR BORGAVVE  THARR
      YUM YUM         KERNOD WEL      ELAM EBOW        DUAM XNAHT
      ANDOVA BEGARIN  KIRJE           VE FORBRYDERNE   HACKEM MUCHE
      VELOX NEB       FOOBIE BLETCH   TEMOV            GARVEN DEH
      READ ME
      
    • {SHK}her zaman aşağıdakilerden biri olacaktır ( kaynak ):

      Skibbereen      Ballingeary     Inishbofin      Annootok        Abitibi
      Kanturk         Kilgarvan       Kesh            Upernavik       Maganasipi
      Rath Luirc      Cahersiveen     Hebiwerie       Angmagssalik    Akureyri
      Ennistymon      Glenbeigh       Possogroenoe    Aklavik         Kopasker
      Lahinch         Kilmihil        Asidonhopo      Inuvik          Budereyri
      Kinnegad        Kiltamagh       Manlobbi        Tuktoyaktuk     Akranes
      Lugnaquillia    Droichead Atha  Adjama          Chicoutimi      Bordeyri
      Enniscorthy     Inniscrone      Pakka Pakka     Ouiatchouane    Holmavik
      Gweebarra       Clonegal        Kabalebo        Chibougamau     Lucrezia
      Kittamagh       Lisnaskea       Wonotobo        Matagami        Dirk
      Nenagh          Culdaff         Akalapi         Kipawa
      Sneem           Dunfanaghy      Sipaliwini      Kinojevis
      

    Bu mesaj başka bir satıra bölünebilir (ancak 2 satırdan fazla sürmeyecektir). 3

  • İlk birkaç satırın yanı sıra, tüm bahisler ekranın geri kalan kısmının görünümüne göre kapalıdır. Nethack , ASCII karakter kümesinin çoğunluğunu kullanır . Güvenle kabul edebileceğiniz tek şey, girişin yalnızca ASCII olacağıdır (ancak bu muhtemelen önemli değildir çünkü 3-22 satırlarını atabilirsiniz).

Girdi bir işlev argümanı olarak alınırsa, tam olarak yukarıdaki örnekte gösterildiği gibi verilecektir (yeni satır ayrılmış). STDIN üzerinden giriş yaparsanız, art arda 24 giriş satırı olarak verilir (tekrar yukarıda gösterildiği gibi). Girişin sonunda yeni bir satırsonu olup olmamasını seçebilirsiniz. Girişin arkada boşluk olmaması garantilidir.

Çıktı

Çıktı #namesadece fiyat-kimliğindeki parşömen ne yapmalıyım . Kullandığım adlandırma sistemi (ve başkalarının kullandığını gördüm):

  • Kaydırma açıkça belli bir kaydırma olarak tanımlanırsa (tanımla, hafif, büyü silahı), #nameo kadar. Bu, aşağıdaki taban fiyatların kaydırılması için geçerlidir (aşağıda taban fiyatının nasıl hesaplanacağını göreceksiniz): 20 -> tanımla, 50 -> hafif, 60 -> enchant silahı.

  • Aksi halde, kaydırma görünümünün ilk üç harfini veya 3 karakterden azsa ilk sözcüğü alın. Örneğin, ZELGO MERolur ZEL, VE FORBRYDERNEolur VE, vb. Bununla birleştin (bir boşluk ve ardından) kaydırmanın temel fiyatı. Örneğin ELB 300,.

  • Temel fiyat iki olasılıktan biri olabilirse, genellikle belirli bir fiyat dilimine yerleştirecek şekilde teklif edilen bir fiyat alana kadar ürünü alıp satmaya çalışırım. Ancak, bu zorlukta bunu yapamazsınız, bu yüzden iki olası taban fiyatı sadece bir eğik çizgi ile ayırın ( /). Örneğin HAC 60/80,.

İşte bir öğenin taban fiyatını, satın almayı teklif ettiğiniz fiyata dönüştürmenin formülü:

  • öğenin taban fiyatıyla başla

  • olası bir% 33'le "tanımlanamayan ek ücret" şansı price += price / 3

  • % 33 "enayi biçimlendirme" nin bir başka şansı (bu aslında rastgele bir şans değil, ama bu zorluğun amaçları için), aynı şekilde hesaplandı

  • aşağıdaki gibi uygulanan bir karizma değiştirici:

    Ch    3-5     6-7       8-10      11-15  16-17     18        19-25
    Mod   +100%   +50%      +33%      +0%    -25%      -33%      -50%
    Code  p *= 2  p += p/2  p += p/3  ---    p -= p/4  p -= p/3  p /= 2
    

Ve işte baz fiyat için formül -> satış fiyatı:

  • öğenin taban fiyatıyla başla

  • Bunu 2 veya 3'e bölün (sırasıyla "normal" veya "enayi işaretlemesi"; yine rastgele değil, ancak bu zorluğun amaçları içindir)

  • % 25 azalma şansı 4 ile hesaplananprice -= price / 4

Bölünme tamsayı bölmedir, yani her adımdaki sonuç yuvarlanır. (Kaynak: wiki ve biraz kaynak kodu kazma. Bu formülleri tersine çevirmek sizin işiniz.)

Son olarak, olası alış fiyatlarını (Charisma stat'üne göre gruplandırılmış) gösteren ve belirli bir baz fiyatla bir parşömen satış fiyatlarını gösteren kullanışlı bir ASCII çizelgesi:

Base  Ch<6          6-7          8-10         11-15        16-17        18           19-25        Sell
20    40/52/68      30/39/51     26/34/45     20/26/34     15/20/26     14/18/23     10/13/17     5/6/8/10
50    100/132/176   75/99/132    66/88/117    50/66/88     38/50/66     34/44/59     25/33/44     12/16/19/25
60    120/160/212   90/120/159   80/106/141   60/80/106    45/60/80     40/54/71     30/40/53     15/20/23/30
80    160/212/282   120/159/211  106/141/188  80/106/141   60/80/106    54/71/94     40/53/70     20/26/30/40
100   200/266/354   150/199/265  133/177/236  100/133/177  75/100/133   67/89/118    50/66/88     25/33/38/50
200   400/532/708   300/399/531  266/354/472  200/266/354  150/200/266  134/178/236  100/133/177  50/66/75/100
300   600/800/1066  450/600/799  400/533/710  300/400/533  225/300/400  200/267/356  150/200/266  75/100/113/150

Wiki grafik ihmaller dört olası satış fiyatlarının iki içerecek şekilde iken (Bu, olası tüm satış fiyatlarını listeler dışında wiki grafiğe aynıdır Hayır, elle bu çizelgeyi yapmadığını;. İle oluşturulan bu yakut komut .)

Test durumları

Giriş:

"For you, honored sir; only 80 for this scroll labeled LEP GEX VEN ZEA."
--More--                   #                                          #
                      ----------------                              -----
                      |              |              ------------####+   |
      -----           |              -##############+          .#   |   |
      |   .###########|           >  |#           # |          |  ##.   |
      |   |          #------------.---#           ##.          |  # -----
      -+---          ##################             ----.-------###    #
       ####                     ###                     #       #      #
          #                     #                       #     ###      ###
          ###                 ###                       #     #          #
            #                 #                         #   ###     -----|--
       -----.---            ###                     ----+---#       |...@..|
       |       |            #                       |      |#       |???+??|
       |  <    .#          ##                     ##+      |        |+?????|
       |       |#    ------.-------                 |      |        |??]?@?|
       ---------###  |            |                 |      |        --------
            #     #  |            |                 --------
                  ###|            |                       #
                    #+            |
                     --------------

Wizard the Evoker         St:11 Dx:15 Co:9 In:20 Wi:9 Ch:11  Chaotic
Dlvl:7  $:0  HP:11(11) Pw:1(8) AC:9  Exp:1

Çıktı: LEP 60/80


Giriş:

"For you, most gracious sir; only 80 for this scroll labeled DAIYEN FOOELS."
--More--                                                             #
                ------------                         -----      -------
 -----          |          |                         |   |      |     |
 |!)%|          |          |     ---------------     |   |     #-     |
 |*[@|          |          .#####|   <         |#####.   |   ###|     |
 |?(?|          ---------.--    #+             |#    |   |   #  |     |
 |[!(|                  ##       |             |#    |   +#### #.     .#
 |.@.|         ##################.             +#    ---.-     #|     |#
 ---|-                ###        ---------------#       ##     #-------#
    ##                #                    ######        #     #       #
     #              ###                         #        #     #       #
     ##             #                           #        #     #       #
  ------        #####                           #        #     #       #
  |    |       -.----                           #        #     #       #
  |    .#####  |^   |                        ####        #     #       #
  |    |    #  |    |          ----          #-----------.---- #       #------
  |    |    ###|    |          |  |          #.      >       | #       #|    |
  ------      #.    |          |  |           |              .##       #|    |
               |    |          ----           |              |         #.    |
               ------                         ----------------          ------

Wizard the Evoker         St:11 Dx:14 Co:16 In:15 Wi:10 Ch:9  Chaotic
Dlvl:6  $:0  HP:11(11) Pw:9(9) AC:9  Exp:1

Çıktı: enchant weapon


Giriş:

Aklavik offers 113 gold pieces for your scroll labeled GARVEN DEH.  Sell it?
[ynaq] (y)

     -----      ------                                 ---------      -------
     |   |      |    |                         #     ##.       |      |.?)%/|
     |   |    ##.    |                       -----   # |       |      |.@!=*|
     |<  |    # |    |            #        ##.   .#####+    >  |#    #-.*?@[|
     |   .##### |    |      ------------   # | { |#    |^      |#    #|.=%)+|
     ---.-      |    |      |          .#### |   |#    ---------##   #-------
       ##       -.----     #.          |     |   |#          # ###   #
       #         ########  #|          .##   |   |#            ##    #
     ###                #  #------------ #   -----#          ####    #
     #                  #######          ##########################  #
     #                    #   #                            ###----.--#
     #                    ### #                            # #|     |#
   --.----       ########################################### #.     |#
   |     |       #----------.-#                               |     |#
   |     |       #|          |#                               -------
   |     |       #|          .#
   |     |########|          |
   -------        ------------
                   #    #
Wizard the Evoker         St:9 Dx:14 Co:11 In:19 Wi:10 Ch:12  Chaotic
Dlvl:4  $:0  HP:11(11) Pw:5(9) AC:9  Exp:1 Satiated

Çıktı: GAR 300


Giriş:

"For you, good lady; only 67 for this scroll labeled VE FORBRYDERNE."--More--

                                                 -------
                                               ##|     |
  ------------                                 # |     |
  |+[!/!?%[?)|                               ### |     |          --------
  |[)(!/+]?!@|               #               #   |     |        ##+      |
  |.......@..|            --------------   ###   | <   | ##       |      |
  --------+---           #|            |   #     |     |  #       |    > |
          #            ###|            .####     --.----  ###    #-      |
          #            ###.            |           #        #  ###|      |
          #          #### ---.----------           #        ######.      |
          #          ####    ##                    #         ###  --------
          #        ####       #                    #         #
          #        ####       ########################     ###
        ###      ####                            ----+---- #
        #   #    ####                            |       .##
    ----.------####                              |  ^    |
    |         +####                              |    >  |
    |         |                                  | ^     |
    -----------                                  ---------

Wizard the Evoker         St:18 Dx:18 Co:16 In:20 Wi:20 Ch:18  Chaotic
Dlvl:4  $:150 HP:11(11) Pw:5(7) AC:9  Exp:1

Çıktı: VE 100


Giriş:

Droichead Atha offers 5 gold pieces for your scroll labeled XIXAXA XOXAXA
XUXAXA.  Sell it? [ynaq] (y)
                                                ------------
                   -----                        |          .#
                   |   .### -----------        #.       {  |#
       -----       |   |  # |         |      ###|          |#
       |   .#     #.   |  # |         |      #  ---------+--#
       |   |    ###-|---    |         .##  ###          ##  #
       |   |    #   # #     |         | #  #            #   #
       |   -#####   #       |         | #### ############   #
       |>  | ##     #       ---------+-  ## -.----------    # ----------
       |   .####    ###             ## #####|          |    # |.*??/?)*|
       -----   #      #             #  #    |          |    # |@*)%!)]%|
               ###    ###         ######    |          |    # |.=)!%*!!|
                 #      #         #  #      |          |    ##+@*[%)(%?|
                 #####################      |          |      |.]?*?)%%|
                    -----+---.----##########.          |      |.%)%!!!%|
                    |            +##        ------------      ----------
                    |    <       |                  #
                    |            |
                    --------------

Wizard the Digger          St:11 Dx:9 Co:14 In:6 Wi:6 Ch:9  Lawful
Dlvl:3  $:0  HP:15(15) Pw:0(1) AC:9  Exp:1

Çıktı: identify

(Nethack'i diğer tüm dükkan sahibi adları kaldırılmış olarak el ile derlemek zorunda kaldım çünkü adında boş bir dükkan sahibi bulamadım ...)

kurallar


1: bu bir Nethack oyunu sırasında mutlaka her zaman doğru değildir, ancak bunu sadelik uğruna kabul ediyoruz.

2: tekrar, her zaman doğru değil. Güç 18/01 ila 18 / ** olabilir, ancak bununla başa çıkmanıza gerek yoktur.

3: daha fazla brüt basitleştirme. Örneğin, bir dükkan sahibinin size "pislik" veya "en ünlü ve kutsal yaratık" demesi mümkündür, ancak bunlardan hiçbirini halletmek zorunda değilsiniz.

4: Bir akıllı oyuncunun art arda yüksek fiyatı verilene kadar ürünü satmayı teklif ederek etrafta dolaştığı.


15
Metnin kutsal duvarı!
orlp

7
@ orlp " Ayrıca yazdığım en uzun zorluklardan biri olmalı ": D
Doorknob

Yanıtlar:


10

Javascript (ES6), 1610 724 601 612 419 405 bayt

a=>(b=a.match(/(\d+) (g|f).+d (\w{0,3})[\s\S]+h:(\d+)/m),c=+b[4],d=[20,50,60,80,100,200,300].map(e=>(f=e>>1,g=~~(e/3),[e,b[2]=='g'?[g-(g>>2),g,f-(f>>2),f]:[e,e+g,e+g+~~((e+g)/3)].map(h=>c<6?h*2:c<8?h+h>>1:c<11?h+~~(h/3):c<16?h:c<18?h-(h>>2):c<19?h-~~(h/3):h>>1)])).filter(i=>i[1].includes(+b[1])),j={20:'identify',50:'light',60:'enchant weapon'}[d[0][0]],k=b[3]+' '+d[0][0],d.length==1?j||k:k+'/'+d[1][0])

Büyük metin duvarı, büyük kod duvarı ile tanışın.

Ungolfed

inp => (
    extraction = inp.match(/(\d+) (g|f).+d (\w{0,3})[\s\S]+h:(\d+)/m),

    charisma = +extraction[4],

    allowed = [20, 50, 60, 80, 100, 200, 300].map(base => (
        tmp1 = base >> 1,
        tmp2 = ~~(base / 3),
        [
            base,
            extraction[2] == 'g' ?
                [tmp2 - (tmp2 >> 2), tmp2, tmp1 - (tmp1 >> 2), tmp1]
            :
                [base, base + tmp2, base + tmp2 + ~~((base + tmp2) / 3)].map(val =>
                    charisma < 6 ?
                        val * 2
                    : charisma < 8 ?
                        val + val >> 1
                    : charisma < 11 ?
                        val + ~~(val / 3)
                    : charisma < 16 ?
                        val
                    : charisma < 18 ?
                        val - (val >> 2)
                    : charisma < 19 ?
                        val - ~~(val / 3)
                    : val >> 1
            )
        ]
    )).filter(key => key[1].includes(+extraction[1])),

    name_ = {
        20: 'identify',
        50: 'light',
        60: 'enchant weapon'
    }[allowed[0][0]],

    tmp3 = extraction[3] + ' ' + allowed[0][0],

    allowed.length == 1 ?
        name_ || tmp3
    :
        tmp3 + '/' + allowed[1][0]
)

Örnek


1
Bu büyük bir senaryo yığını.
30'15 Kasım'ı

1
Woah, sonunda birileri buna cevap verdi mi? Güzel: D
Doorknob

@Doorknob Bir süredir bunu güncellemek istiyordum, sonunda anladım.
usandfriends,
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.