Mô phỏng trận chiến giữa hai sinh vật


16

Chào mừng, người chơi mã dũng cảm! Hôm nay bạn sẽ đứng giữa một trận chiến vĩ đại giữa một con yêu tinh và một yêu tinh!

    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!

Các thách thức

Thử thách của bạn là mô phỏng một trận chiến, giống như trận chiến trên. Bạn sẽ nhận được đầu vào trong mẫu này:

creatureName health strength defense accuracy agility

Ví dụ, trận chiến giữa yêu tinh và yêu tinh sẽ là:

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

Các sinh vật đầu tiên và thứ hai sẽ xen kẽ các cuộc tấn công.

  • In 'creatureName tấn công otherCreatureName!'
  • Kiểm tra xem sinh vật có tránh được không. Sinh vật sẽ tránh được một cuộc tấn công nếu (thời gian linh hoạt của nó rand () chia cho 2) lớn hơn (thời gian chính xác của kẻ tấn công rand ()).
    • Nếu sinh vật né tránh, hãy in 'creatureName né tránh!'
    • Mặt khác, tính toán lượng sát thương gây ra bằng cách trừ (sức mạnh của kẻ tấn công lần rand ()) và (thời gian phòng thủ của người phòng thủ rand () chia cho 2). Thiệt hại tối thiểu là 1. In 'creatureName đánh otherCreatureName cho (x) thiệt hại!' Sau đó in 'creatureName có (x) sức khỏe còn lại.' trừ khi sức khỏe của sinh vật bằng 0 hoặc ít hơn, trong trường hợp này ...
      • Nếu sức khỏe của sinh vật bằng 0 hoặc ít hơn, hãy in 'creatureName đã bị giết!' và kết thúc chương trình.

Quy tắc

  • Mã ngắn nhất sẽ thắng.
  • Đừng in theo nghĩa đen 'creatureName', nhưng thay thế nó bằng tên của sinh vật. Không in '(x) thiệt hại' hoặc '(x) sức khỏe;' thay thế chúng với số tiền thực tế. (Tôi phải xác định điều này vì một số người rất sáng tạo với việc bẻ cong quy tắc .: P)

2
Tại sao làm phức tạp thông số kỹ thuật bằng cách giảm một nửa sự nhanh nhẹn và phòng thủ?
Peter Taylor

@Peter Bởi vì nếu không các trận chiến mất quá nhiều thời gian.
Doorknob

2
Quan điểm của tôi là: tại sao không thay đổi đầu vào, ví dụ như goblin 50 40 18 3 2 elf 50 35 15 4 5?
Peter Taylor

@Peter Meh, điều đó dường như quá kỳ lạ - tại sao phòng thủ sẽ thấp hơn nhiều như vậy? Dù sao, nó là một câu đố; không có lý do gì để không: P
Doorknob

Tôi nghĩ không rõ liệu 'creatureName có còn (x) sức khỏe hay không.' nên được in ở vòng cuối cùng (khi sinh vật bị giết) và trong trường hợp nên (tôi cho rằng không nên) nếu (x) phải luôn là 0 hoặc nó có thể là số âm.
dịch

Câu trả lời:


4

APL ( 249 244 242)

Phong cách thủ tục lần này, vì vậy (ít nhất là trong Dyalog) bạn phải dán cái này vào cửa sổ soạn thảo. Tôi đặt tên cho nó G(dòng đầu tiên là tên, tôi đã bao gồm nó bởi vì đó là cách nó hiển thị trong cửa sổ soạn thảo nên có lẽ nó sẽ được tính).

G
⎕ML ← 3
DA ← {(⊂ ↑ ⍵), 1 ↓ ⍵} ¨ 2 6⍴A⊂⍨ '' ≠ A ←
→ 5
⎕ ← (D) 'né tránh!'
AD ← DA
⎕ ← (↑ A) 'tấn công', '!', D
→ 4 /> /? A [6], D [5]
⎕ ← A [1], 'lượt truy cập', D [1], 'cho', 'thiệt hại!', ⍨D [2] - ← 1⌈ - /? A [3], ⌈D [4] 2
→ 12 / ⍨D [2] 0
⎕ ← D [1], 'có', D [2], 'sức khỏe còn lại!'
→ 5
⎕ ← D [1], 'đã bị giết!'

(chỉnh sửa: các GOTO số đã sử dụng thay vì nhãn dòng. Hóa ra rằng (ít nhất là trong Dyalog) tất cả các định nghĩa nhãn X:được đặt thành Xsố dòng, do đó cũng có thể sử dụng trực tiếp các số.)


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!"}

Chạy với perl -nM5.010(hoặc perl -nE '<code>'). Trên mỗi meta , công -ntắc được tính là một ký tự phụ. Không có thủ thuật đánh gôn ưa thích nào trong mã này, ngoại trừ việc sử dụng $=như là biến thiệt hại để cứu một int.

Chỉnh sửa: Hy vọng, tính toán thiệt hại là chính xác ngay bây giờ.


6

Cà phê 454 432

Vượt qua một chuỗi bđể có được kết quả. Tôi nghĩ sẽ vui hơn khi có một đầu ra hoạt hình đồ họa, vì vậy tôi đã đặt một bản demo cùng nhau. Chỉ cần thay đổi hộp đầu vào để thay đổi số liệu thống kê và tên. Các hình ảnh từ jpg.to là API hình ảnh google không chính thức.

Bản demo siêu hành động

giả lập trận chiến trong hành động

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

Đầu vào được đề xuất (đề xuất của riêng bạn):

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

Ồ điều đó thật tuyệt! : DI sẽ chấp nhận câu trả lời này nếu tôi có thể chấp nhận hai, nhưng tôi đã nói trong các quy tắc rằng ngắn nhất sẽ được chấp nhận và tôi chỉ có thể chấp nhận một câu trả lời :( Vì vậy +1. Và voldemort 9999haha: D
Doorknob

@Doorknob, như một phần thưởng bổ sung, bạn có thể cung cấp cho nó những con số như thế 10e42, nhưng trình duyệt của bạn có thể đóng băng ...
Brigand

6

Hồng ngọc, 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}

Mã golf đầu tiên của tôi nhập cảnh; làm thế nào phân tích định nghĩa phương thức đó vượt quá tôi :)

Có thể đọc đầu vào từ các tham số dòng lệnh (ví dụ ruby battle.rb goblin 50 40 35 3 2 elf 50 35 30 4 5) không?

Ideone chạy


Vâng, điều đó là ổn.
Doorknob

5

JavaScript; 347 341 333

Như tôi luôn làm, tôi sẽ bắt đầu với giải pháp của riêng mình:

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}

EDIT: rõ ràng việc gán console.logcho một biến phá vỡ trên một số trình duyệt, vì vậy đây là cùng một mã với một khai báo hàm thay thế:

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}

Tôi đã nghĩ đến việc thay đổi nó thành alert, nhưng điều đó sẽ trở nên xấu xa: P


tôi nhận được một Uncaught TypeError: Illegal invocationa=console.log. bạn sẽ không phải liên kết consoleđối tượng như bối cảnh, ví dụ a=console.log.bind(console)?
C5H8NNaO4

@ C5H Hmm, thật lạ. Nó làm việc cho tôi.
Doorknob

Chỉ cần kiểm tra nó trong Firefox, Safari và Chrome, trong Firefox nó hoạt động =) Chrome cung cấp cho tôi ở trên và Safari là TypeError
C5H8NNaO4

@ C5H :( Có lẽ tôi có thể thay thế nó bằng alert , nhưng điều đó sẽ rất khó chịu: P
Doorknob

: P Vâng, điều đó thực sự gây phiền nhiễu, nhưng ít nhất nó sẽ lưu các ký tự "6" và tránh TypeError =) Nhưng tôi đoán nó ổn, ít nhất là nó chạy trên Firefox =)
C5H8NNaO4

4

Con trăn: 393

Tôi siết chặt hơn một chút, nếu tôi có 3 thì có lẽ tôi có thể làm print = pđể rút ngắn nó thêm một vài lần nữa, nhưng tôi không nghĩ còn nhiều thứ này nữa.

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"

Tôi nghĩ mọi người đang bỏ qua rằng nếu bạn có một điều kiện tốt trong vòng lặp, bạn không cần phải kiểm tra xem mục tiêu có dưới sức khỏe hay không.


Tôi kiểm tra sức khỏe hai lần, trong tiêu đề vòng lặp để kết thúc trận chiến và trong vòng lặp để in "đã bị giết" hoặc "lượt truy cập ...", bởi vì kiểm tra sức khỏe kép ngắn hơn một bảng điều khiển bổ
sung.log

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.")))

Đầu ra mẫu:

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!   

Chỉnh sửa ghi chú: +1 ký tự, tôi đã bỏ lỡ "!" sau khi "né"
Oh và tôi đã quên thực sự đặt một đầu ra sau khi "Đầu ra mẫu"
Thay đổi tiêu đề thành JavaScript, như @tbodt gợi ý


Tại sao bạn không gọi nó là JavaScript để tránh gây nhầm lẫn cho mọi người?
tbodt

@tbodt Tôi không nghĩ nó sẽ khiến mọi người nhầm lẫn =) Thay đổi nó thành Javascript thay vào đó
C5H8NNaO4

3

R: 387 ký tự

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}

Hoặc được phát triển đầy đủ, với các thụt lề và nhận xét, để làm cho mọi thứ rõ ràng hơn:

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 ký tự

Sau một vài đêm, tôi dường như không thể đến gần các mục khác (không có gì đáng ngạc nhiên đối với C #). Vẫn còn chỗ để cải thiện tôi nghi ngờ. Không có thủ đoạn đặc biệt thông minh.

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!");}}}

Đã bình luận:

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

Trăn 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])
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.