จำลองการต่อสู้ระหว่างสองสิ่งมีชีวิต


16

ยินดีต้อนรับนักกอล์ฟผู้กล้ารหัส! วันนี้คุณจะยืนอยู่ท่ามกลางการต่อสู้อันยิ่งใหญ่ระหว่างกลินและเอลฟ์!

    goblin attacks elf!
    elf dodges!
    elf attacks goblin!
    elf hits goblin for 13 damage!
    goblin has 37 health left.
    goblin attacks elf!
    goblin hits elf for 1 damage!
    elf has 49 health left.
    elf attacks goblin!
    elf hits goblin for 19 damage!
    goblin has 18 health left.
    goblin attacks elf!
    goblin hits elf for 26 damage!
    elf has 23 health left.
    elf attacks goblin!
    elf hits goblin for 20 damage!
    goblin has been slain!

ความท้าทาย

ความท้าทายของคุณคือการจำลองการต่อสู้เหมือนข้างบน คุณจะได้รับการป้อนข้อมูลในแบบฟอร์มนี้:

creatureName health strength defense accuracy agility

ตัวอย่างเช่นการต่อสู้ระหว่างพวกภูตกับเอลฟ์จะเป็น:

goblin 50 40 35 3 2 elf 50 35 30 4 5

สิ่งมีชีวิตที่หนึ่งและสองจะสลับการโจมตี

  • พิมพ์ 'creatureName โจมตี otherCreatureName!'
  • ตรวจสอบเพื่อดูว่าสิ่งมีชีวิตหลบ สิ่งมีชีวิตจะหลบการโจมตีหาก (ความว่องไวของมัน rand คูณ () หารด้วย 2) มากกว่า (ความแม่นยำของผู้โจมตีคูณ rand ())
    • หากสิ่งมีชีวิตหลบพิมพ์ 'creatureName dodges!'
    • มิฉะนั้นคำนวณความเสียหายที่กระทำโดยการลบ (ความแข็งแกร่งของผู้โจมตีคูณ rand ()) และ (เวลาการป้องกันของผู้พิทักษ์ rand () หารด้วย 2) ความเสียหายขั้นต่ำคือ 1. พิมพ์ 'creatureName ยอดนิยมสร้างชื่ออื่นเพื่อสร้างความเสียหาย (x)!' จากนั้นพิมพ์ 'creatureName มีสุขภาพเหลือ (x)' เว้นแต่ว่าสิ่งมีชีวิตจะมีค่าเป็น 0 หรือน้อยกว่าซึ่งในกรณีนี้ ...
      • หากสุขภาพของสิ่งมีชีวิตเป็น 0 หรือน้อยกว่าให้พิมพ์ 'creatureName ถูกสังหาร!' และจบโปรแกรม

กฎระเบียบ

  • รหัสที่สั้นที่สุดชนะ
  • อย่าพิมพ์ 'creatureName' แต่แทนที่ด้วยชื่อของสิ่งมีชีวิต อย่าพิมพ์ '(x) damage' หรือ '(x) health;' แทนที่ด้วยจำนวนเงินจริง (ฉันต้องระบุสิ่งนี้เพราะบางคนมีความคิดสร้างสรรค์มากด้วยการดัดกฎ: P)

2
ทำไมสเป็คที่ซับซ้อนโดยลดความว่องไวและการป้องกันลงครึ่งหนึ่ง?
Peter Taylor

@ Peter เพราะมิฉะนั้นการต่อสู้ใช้เวลานานเกินไป
Doorknob

2
ประเด็นของฉันคือ: ทำไมไม่เปลี่ยนอินพุตเช่นเป็นgoblin 50 40 18 3 2 elf 50 35 15 4 5?
Peter Taylor

@ Peter Meh ที่ดูเหมือนแปลกเกินไป - ทำไมการป้องกันจะต่ำกว่ามาก? อย่างไรก็ตามมันเป็นปริศนา; ไม่มีเหตุผลที่จะไม่: P
Doorknob

ฉันคิดว่ายังไม่ชัดเจนว่า 'creatureName มีสุขภาพ (x) เหลืออยู่' ควรพิมพ์ในรอบสุดท้าย (เมื่อสิ่งมีชีวิตถูกสังหาร) และในกรณีที่ควร (ฉันถือว่าไม่ควร) หาก (x) ควรเป็น 0 เสมอหรืออาจเป็นจำนวนลบได้
7904 epidemic

คำตอบ:


4

APL ( 249 244 242)

ลักษณะขั้นตอนในครั้งนี้ดังนั้น (อย่างน้อยใน Dyalog) คุณต้องวางสิ่งนี้ลงในหน้าต่างตัวแก้ไข ฉันตั้งชื่อมันG(บรรทัดแรกคือชื่อฉันรวมไว้ด้วยเพราะนั่นคือวิธีที่ปรากฏในหน้าต่างแก้ไขดังนั้นควรนับด้วย)

G
⎕ML← 3
DA ← {(⊂↑⍵), ⍎¨1↓⍵} ¨↓ 2 6⍴A⊂⍨ '' ≠ A ←⍞
→ 5
⎕← (↑ D) 'หลบ!
AD ← DA
⎕← (↑ A) 'โจมตี', '!' ⍨↑ D
→ 4 / ⍨> / หรือไม่ [6], D [5]
⎕← [1], 'ฮิต' D [1], 'สำหรับ', 'ความเสียหาย!' ⍨D [2] - ←1⌈? - / A [3], ⌈D [4] ÷ 2
→ 12 / ⍨D [2] ≤0
⎕← D [1], 'มี', D [2], 'สุขภาพดี!'
→ 5
⎕← D [1], 'ถูกสังหาร!'

(แก้ไข: ใช้ตัวเลข GOTO แทนป้ายกำกับบรรทัดปรากฎว่า (ใน Dyalog เป็นอย่างน้อย) การกำหนดฉลากทั้งหมดX:จะถูกตั้งค่าXเป็นหมายเลขบรรทัดดังนั้นอาจใช้ตัวเลขโดยตรงเช่นกัน)


6

Perl, 254 + 1

for((@a[0..5],@b)=split;$a[1]>0;@c=@a,@a=@b,@b=@c){say"$a[0] attacks $b[0]!\n",rand$b[5]/2<rand$a[4]?do{($==rand($a[2])-rand$b[3]/2)<1and$==1;"$a[0] hits $b[0] for $= damage!\n$b[0] has ",($b[1]-=$=)>0?"$b[1] health left.":"been slain!"}:"$b[0] dodges!"}

ทำงานด้วยperl -nM5.010(หรือperl -nE '<code>') ต่อเมตาที่-nนับสวิทช์เป็นตัวละครตัวหนึ่งเป็นพิเศษ ไม่มีแฟนซีเล่นกอล์ฟเทคนิคในรหัสนี้ยกเว้นอาจจะใช้เป็นตัวแปรความเสียหายให้กับบันทึก$=int

แก้ไข:หวังว่าการคำนวณความเสียหายจะถูกต้องแล้ว


6

CoffeeScript 454 432

ส่งผ่านสตริงไปที่ bเพื่อให้ได้ผลลัพธ์ ฉันคิดว่ามันน่าจะสนุกกว่าถ้าได้เอาท์พุตอนิเมชั่นกราฟิกดังนั้นฉันจึงรวบรวมตัวอย่าง เพียงแค่เปลี่ยนกล่องอินพุตเพื่อเปลี่ยนสถิติและชื่อ รูปภาพจากjpg.toซึ่งเป็น google-images API ที่ไม่เป็นทางการ

การสาธิต Super Action

การจำลองการต่อสู้ที่ใช้งานจริง

b=(s)->
 r=Math.random
 p=s.split ' '
 n=p.map Number
 l=''
 o=(x...)->l+=x.join(' ')+'!\n'
 while 1|i=!i
  c=(x)->n[i*6+x]*r()
  d=(x)->n[(i||6)+x]*r()
  t=->d(4)/2>c 5
  h=->Math.max c(2)-d(3)/2,1
  a=p[i*6]
  b=p[6+i*-6]
  o a,'attacks',b
  if c(5)/2>d 4
   e=Math.ceil h()
   q=n[(i||6)+1]-=e
   o a,'hits',b,'for',e,'damage'
   o b,'has',q,'health left'if q>0
  else
   o b,'dodges'
  if q<1
   o b,'has been slain'
   break
 l

อินพุตที่แนะนำ (แนะนำของคุณเอง):

charmander 50 40 25 3 2 bulbasaur 90 30 40 4 5
voldemort 9999 10 5 1 1 batman 20 50 10 1010 30

ว้าวเยี่ยมมาก! : DI จะยอมรับคำตอบนี้ถ้าฉันสามารถยอมรับสอง แต่ฉันพูดในกฎที่สั้นที่สุดจะได้รับการยอมรับและฉันสามารถยอมรับคำตอบเดียวเท่านั้น :( ดังนั้น +1 และvoldemort 9999haha: D
Doorknob

@Doorknob เป็นโบนัสพิเศษคุณสามารถให้หมายเลขได้10e42แต่เบราว์เซอร์ของคุณอาจหยุด ...
Brigand

6

ทับทิม, 292 264

v=$*
def p*a;puts a*' 'end
loop{a,b=v[0],v[6]
w=v.map &:to_i
p a,:attacks,b+?!
w[11]*rand/2>w[4]*rand ? (p b,:dodges!):(h=v[7]=w[7]-=d=[rand(w[2])-rand(w[9])/2,1].max
p a,:hits,b,:for,d,:damage!
p b,:has,h<1?"been slain!":"#{h} health left."
h<1&&exit)
v.rotate!6}

รายการรหัสกอล์ฟครั้งแรกของฉัน ความหมายของวิธีการวิเคราะห์คำนั้นอยู่เหนือฉัน :)

ตกลงหรือไม่ที่จะอ่านอินพุตจากพารามิเตอร์บรรทัดคำสั่ง (เช่น ruby battle.rb goblin 50 40 35 3 2 elf 50 35 30 4 5 ) หรือไม่?

Ideone run


ใช่มันไม่เป็นไร
Doorknob

5

JavaScript; 347 341 333

อย่างที่ฉันทำเสมอฉันจะเริ่มต้นด้วยวิธีแก้ปัญหาของตัวเอง:

for(m=prompt().split(' '),r=Math.random,a=console.log,c=0,d=6;;){if(a(m[c]+' attacks '+m[d]+'!'),r()*m[c+4]>r()*m[d+5]/2){if(a(m[c]+' hits '+m[d]+' for '+(h=Math.max(~~(r()*m[c+2]-r()*m[d+3]/2),1))+' damage!'),(m[d+1]-=h)<1){a(m[d]+' has been slain!');break}a(m[d]+' has '+m[d+1]+' health left.')}else a(m[d]+' dodges!');t=c;c=d;d=t}

แก้ไข: เห็นได้ชัดว่าได้รับมอบหมาย console.logให้แบ่งตัวแปรในบางเบราว์เซอร์ดังนั้นนี่คือรหัสเดียวกันกับการประกาศฟังก์ชั่นแทน:

for(m=prompt().split(' '),r=Math.random,a=function(x){console.log(x)},c=0,d=6;;){if(a(m[c]+' attacks '+m[d]+'!'),r()*m[c+4]>r()*m[d+5]/2){if(a(m[c]+' hits '+m[d]+' for '+(h=Math.max(~~(r()*m[c+2]-r()*m[d+3]/2),1))+' damage!'),(m[d+1]-=h)<1){a(m[d]+' has been slain!');break}a(m[d]+' has '+m[d+1]+' health left.')}else a(m[d]+' dodges!');t=c;c=d;d=t}

ฉันกำลังคิดที่จะเปลี่ยนเป็นalertแต่นั่นก็อาจจะเป็นความชั่วร้าย: P


ฉันได้รับเนื่องจากการUncaught TypeError: Illegal invocation a=console.logคุณไม่ต้องผูกconsoleวัตถุเป็นบริบทa=console.log.bind(console)หรือไม่
C5H8NNaO4

@ C5H อืมมันแปลกนะ มันใช้งานได้สำหรับฉัน
Doorknob

เพิ่งตรวจสอบใน Firefox, Safari และ Chrome, ใน Firefox มันทำงาน =) Chrome ให้ฉันข้างต้นและ Safari TypeError
C5H8NNaO4

@ C5H :( ฉันอาจจะแทนที่ด้วยalertแต่อาจจะน่ารำคาญมาก: P
Doorknob

: P ใช่ว่าจะน่ารำคาญจริง ๆ แต่อย่างน้อยก็จะบันทึกตัวอักษร "6" และหลีกเลี่ยง TypeError =) แต่ฉันเดาว่า Ok อย่างน้อยก็ทำงานบน Firefox =)
C5H8NNaO4

4

Python: 393

ฉันบีบยากขึ้นเล็กน้อยถ้าฉันมี 3 ฉันอาจจะทำ print = pสั้นลงได้อีกสักครู่ แต่ฉันไม่คิดว่าจะมีเหลืออยู่ในนี้

393:

from random import randrange as r
x = input().split()
t=range
a,b=6,0
for i in t(1,6)+t(7,12):x[i]=int(x[i])
while x[b+1] > 0:
 a,b=b,a;print x[a]+" attacks "+x[b]
 if r(x[a+5]/2)>r(x[b+5]):print x[a]+' dodges!';continue
 d=max(r(x[a+2])-r(x[b+3]/2),1);print x[a]," hits ",x[b]," for ",d," damage!";x[b+1]-=d
 if x[b+1]>0:print x[b]," has ",x[b+1]," health left."
print x[b]," has been slain"

399:

from random import randrange as r
x = raw_input().split()
t=range
a,b=6,0
for i in t(1,6)+t(7,12):x[i]=int(x[i])
while x[b+1] > 0:
 a,b=b,a;print x[a]+" attacks "+x[b]
 if r(x[a+5]/2) > r(x[b+5]):print x[a]+' dodges!';continue
 d=max(r(x[a+2])-r(x[b+3]/2),1);print x[a]," hits ",x[b]," for ",d," damage!";x[b+1]-=d                        if x[b+1]>0:print x[b]," has ",x[b+1]," health left."
print x[b]," has been slain"

ฉันคิดว่าผู้คนกำลังกระโดดข้ามว่าถ้าคุณมีสภาพที่ดีในการวนรอบคุณไม่จำเป็นต้องตรวจสอบว่าเป้าหมายนั้นต่ำกว่าสุขภาพหรือไม่


ฉันจะตรวจสอบสุขภาพสองครั้งในส่วนหัวของลูปเพื่อยุติการต่อสู้และในลูปเพื่อพิมพ์อย่างใดอย่างหนึ่ง "ถูกเลื่อน" หรือ "ฮิต ... " เพราะการตรวจสุขภาพสองครั้งจะสั้นกว่า
คอนโซล

4

JavaScript: 340 306

339:

for(m=Math.random,a=prompt().split(" "),c=[a,a.splice(6)],e;0<+c[0][1]&&0<+c[1][1];)c.reverse(),console.log(c[0][0]+" attacks "+c[1][0]+"!\n"+(c[0][4]*m()<c[1][5]*m()/2?c[1][0]+" dodges!":c[0][0]+" hits "+c[1][0]+" for "+(e=1+(c[0][2]*m()-c[1][3]*m()/2|0))+" damage!\n"+c[1][0]+" has "+(0>(c[1][1]-=e)?"been slain!":c[1][1]+" health left.")))

306:

for(var m=Math.random,a=prompt().split(" "),b=a.splice(6),d,e;0<+a[1]&&0<+b[1];d=a,a=b,b=d)console.log(a[0]+" attacks "+b[0]+"!\n"+(a[4]*m()<b[5]*m()/2?b[0]+" dodges!":a[0]+" hits "+b[0]+" for "+(e=a[2]*m()-b[3]*m()/2|0,e<=0?e=1:e)+" damage!\n"+b[0]+" has "+(0>(b[1]-=e)?"been slain!":b[1]+" health left.")))

ตัวอย่างผลลัพธ์:

goblin attacks elf!
elf dodges!
elf attacks goblin!
elf hits goblin for 21 damage!
goblin has 29 health left.
goblin attacks elf!
elf dodges!
elf attacks goblin!
elf hits goblin for 15 damage!
goblin has 14 health left.
goblin attacks elf!
goblin hits elf for 1 damage!
elf has 49 health left.
elf attacks goblin!
elf hits goblin for 16 damage!
goblin has been slain!   

แก้ไขบันทึก: ตัวละคร +1 ฉันพลาด "!" หลังจาก "dodges"
โอ้แล้วฉันลืมใส่ผลลัพธ์หลังจาก "ตัวอย่างเอาต์พุต"
เปลี่ยนส่วนหัวเป็น JavaScript ตามที่ @tbodt แนะนำ


ทำไมคุณไม่เรียกมันว่า JavaScript เพื่อหลีกเลี่ยงความสับสนของผู้คน
tbodt

@tbodt ฉันไม่คิดว่ามันจะทำให้ผู้คนสับสน =) เปลี่ยนเป็น Javascript แทน
C5H8NNaO4

3

R: 387 ตัวอักษร

a=scan(,"");i=as.integer;r=runif;C=cat;X=data.frame(i(a[2:6]),i(a[8:12]));z=1;Y=c(a[1],a[7]);repeat{p=1+z%%2;n=X[,p];m=X[,-p];N=Y[p];M=Y[-p];C(N,"attacks",M,"\n");if(r(1)*n[5]<r(1)*m[5]/2){C(M,"dodges!\n")}else{C(N,"hits",M,"for",d<-max(round(n[2]*r(1)-m[3]*r(1)/2),1),"damages!\n");h=max(m[1]-d,0);if(h){C(M,"has",X[1,-p]<-h,"health left\n")}else{C(M,"has been slained!");break}};z=z+1}

หรือพัฒนาเต็มที่พร้อมการเยื้องและความคิดเห็นเพื่อทำให้สิ่งต่าง ๆ ชัดเจนขึ้น:

a=scan(,"")                        # Read stdin as character vector
i=as.integer
r=runif
C=cat
X=data.frame(i(a[2:6]),i(a[8:12])) # Data frame with opponents stats
z=1                                # Turn counter 
Y=c(a[1],a[7])                     # Vector of opponents name
repeat{                            # shorter than while(T)
    p=1+z%%2                       # R indexing starts with 1 not 0
    n=X[,p]                        # Attacking opponent stats
    m=X[,-p]                       # Defending opponent stats
    N=Y[p]                         # Attacking opponent name
    M=Y[-p]                        # Defending opponent name
    C(N,"attacks",M,"\n")          # By default, cat separates elements with a space
    if(r(1)*n[4]<r(1)*m[5]/2){
        C(M,"dodges!\n")
    }else{
        C(N,"hits",M,"for",d<-max(round(n[2]*r(1)-m[3]*r(1)/2),1),"damages!\n")
        h=max(m[1]-d,0)            # Health after the strike
        if(h){                     # If health is not 0
            C(M,"has",X[1,-p]<-h,"health left\n")
        }else{                     # If it is
            C(M,"has been slained!")
            break
            }
    }
    z=z+1
}

2

C # - 464 453 ตัวอักษร

หลังจากสองสามคืนนี้ฉันดูเหมือนจะไม่ได้ใกล้เคียงกับรายการอื่น ๆ (ไม่น่าแปลกใจสำหรับ C #) ยังคงมีห้องสำหรับการปรับปรุงฉันสงสัย ไม่มีกลอุบายที่ฉลาดเป็นพิเศษ

using System;using System.Linq;class P{static void Main(string[]a){int D,h=1,z=6;
var n=a.Select(x=>int.TryParse(x,out D)?D:0).ToList();var r=new Random();Func<int>
R=()=>r.Next(101);for(;h>0;z=z>0?0:6){D=(n[8-z]*R()-n[3+z]*R()/2)/100;var d=n[5+z]
*R()/2>n[10-z]*R();h=d?h:n[1+z]-=D=D<1?1:D;Console.Write("{0} attacks {1}!\n"+(d?
"{1} dodges!\n":"{0} hits {1} for {2} damage!\n")+(d?"":"{1} has {3}\n"),a[6-z],a
[z],D,h>0?h+" health left.":"been slain!");}}}

แสดงความคิดเห็น:

using System;
using System.Linq;
class P
{
    static void Main(string[] a)
    {
        int D, // string to int parsing and attack damage 
            h = 1, // health 
            z = 6; // index

        // painful requirement to convert the input strings to integers
        var n = a.Select(x => int.TryParse(x, out D) ? D : 0).ToList();

        // set up a function to return a new random number
        var r = new Random();
        Func<int> R = () => r.Next(101);

        // we'll exit the loop when the defender's health (h) is <= 0.
        // z is used as an index offset to get values out of the list, it flips between 0 an 6 each round
        for (; h > 0; z = z > 0 ? 0 : 6)
        {
            // calculate damage
            D = (n[8 - z] * R() - n[3 + z] * R() / 2) / 100;

            // see if defender dodges
            var d = n[5 + z] * R() / 2 > n[10 - z] * R();

            // subtract health from defender if necessary. store health of defender in h
            h = d ? h : n[1 + z] -= D = D < 1 ? 1 : D;

            // print the round
            Console.Write(
                "{0} attacks {1}!\n" + (d ? "{1} dodges!\n" : "{0} hits {1} for {2} damage!\n") + 
                (d ? "" : "{1} has {3}\n"), a[6 - z], a[z], D, h > 0 ? h + " health left." : "been slain!");
        }
    }
}

1

Python 3, 314

from random import*
r=random
p=print
I=input().split()
H=1
while H>0:s,a,H,D,G=map(int,I[2:5:2]+I[7::2]);N=I[6];p(I[0],"attacks",N+"!");I=I[6:]+I[:6];X=max(int(s*r()-D*r()/2),1)*(G*r()/2<a*r());I[1]=H=H-X;X<1and p(N,"dodges!")or p(I[6],"hits",N,"for",X,"damage!\n"+N,"has",["been slain!","%s health left."%H][H>0])
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.