Cod Cod, tôi chọn bạn!


55

Hàng xóm tốt bụng của bạn, Doctor Tree, vừa cho bạn ba sinh vật ma thuật gọi là Cod Pokémon. Có một giải đấu chiến đấu ở thị trấn Colorville gần đó. Bạn có phải là người tốt nhất, giống như chưa từng có ai?

Tổng quan

Đây là một giải đấu chiến đấu. Mỗi người chơi điều khiển một đội gồm ba quái vật, và mục tiêu là hạ gục (tiêu diệt) đội kia. Có 100 vòng, với số điểm được trao cho chiến thắng và quan hệ. Đội có nhiều điểm nhất thắng!

Quái vật

Một con mã là một sinh vật nhỏ phức tạp. Có năm loại (yếu tố) để lựa chọn, ba chỉ số và ba vị trí di chuyển trên mỗi loại.

Các loại

Mỗi bộ mã được gán một loại. Năm loại là Bình thường, Tâm linh, Lửa, Nước và Cỏ. Mỗi cái đều có điểm mạnh và điểm yếu. Thiệt hại dựa trên biểu đồ sau:

biểu đồ

Các con số là bội số thiệt hại. Chẳng hạn, Lửa tấn công Nước có bộ điều biến 0,5 (một nửa sát thương), trong khi Lửa tấn công Cỏ được nhân đôi (2).

Số liệu thống kê

Mỗi quái vật có ba chỉ số xác định khả năng chiến đấu của nó. Tấn công làm tăng thiệt hại mà nó gây ra. Phòng thủ làm giảm thiệt hại cần thiết. Tốc độ cho phép nó di chuyển trước những người có Tốc độ thấp hơn.

Mỗi quái vật có giá trị bắt đầu là 50 cho mỗi chỉ số và tối đa là 100. Khi bạn tạo quái vật của mình, bạn sẽ có thể chỉ định thêm 80 điểm chỉ số (mỗi điểm). Hãy nhớ rằng không có chỉ số riêng lẻ nào có thể vượt quá 100. Vì vậy, bạn có thể có phân phối 100/80/50, 90/80/60 hoặc 65/65/100, nhưng 120/50/60 là bất hợp pháp. Bất kỳ đội nào có số liệu thống kê bất hợp pháp đều bị loại. Bạn không bắt buộc phải sử dụng tất cả 80 điểm, nhưng có lẽ bạn không nên đi với mức tối thiểu 50/50/50.

Bạn cũng có thể coi HP là một chỉ số, nhưng mỗi Cod Pokémon có 100 HP không thể sửa đổi. Khi HP giảm xuống 0, họ không thể tiếp tục chiến đấu. HP được nạp lại 100 trước mỗi trận chiến.

Di chuyển

Mỗi quái vật biết ba động tác chiến đấu. Ba lựa chọn phải khác biệt, do đó không có Punch / Punch / Punch.

Có 15 động tác, ba loại mỗi loại. Mỗi loại có một cuộc tấn công trực tiếp, một cuộc tấn công yếu hơn với một hiệu ứng và một hiệu ứng di chuyển duy nhất.

id  name        type    power   uses    usable  effect

0   Punch       N       20      -       NFWG
1   Heal        N        0      3       NFWG    Heals 50 HP
2   Slow        N       10      5       NFWG    Enemy speed x0.8
3   Pain        P       20      -       PFWG
4   Sleep       P        0      3       PFWG    No enemy action until wake
5   Weaken      P       10      5       PFWG    Enemy Atk x0.8
6   Fireball    F       20      -       NPFW
7   Burn        F        0      3       NPFW    Enemy -10 HP each turn
8   Sharpen     F       10      5       NPFW    Own Atk x1.25
9   Watergun    W       20      -       NPWG    
10  Confuse     W        0      3       NPWG    Enemy may strike itself (10 power)
11  Shield      W       10      5       NPWG    Own Def x1.25
12  Vine        G       20      -       NPFG
13  Poison      G        0      3       NPFG    Enemy -5xTurns HP each turn
14  Sap         G       10      5       NPFG    Enemy Def x0.8

typeđề cập đến loại di chuyển. powerlà sức mạnh nổi bật của nó. usescho biết số lần có thể được sử dụng cho mỗi trận chiến ( -không giới hạn). usablehiển thị loại nào có thể được sử dụng bởi (ví dụ, Punch không thể được cung cấp cho loại Tâm linh, vì không có loại nào P). effectcho thấy những tác động của các động tác có. Có 75% cơ hội cho mỗi hiệu ứng hoạt động, ngoại trừ Heal, luôn hoạt động.

Đối với các hiệu ứng thay đổi chỉ số của quái vật, các hiệu ứng có thể được xếp chồng lên nhau . Ví dụ: sử dụng Weaken hai lần có thể làm giảm hiệu quả tấn công của đối thủ xuống 0,64. Các hiệu ứng không thay đổi chỉ số của quái vật (Ngủ, Ghi, v.v.) không được xếp chồng lên nhau .

Giấc ngủ khiến đối thủ ngủ, với 60% cơ hội thức dậy vào đầu mỗi lượt. Không có hành động sẽ được thực hiện bởi quái vật ngủ.

Burn gây sát thương cho đối thủ 10 HP vào cuối mỗi lượt khi hoạt động . Poison hoạt động tương tự, nhưng mất một lượng ngày càng tăng mỗi lượt. Ở lượt đầu tiên, nó là 5 và tăng 5 điểm sau mỗi lượt. Vì vậy, đến lượt thứ tư, nó sẽ gây sát thương cho 20. Đây là những thiệt hại bằng phẳng, không bị ảnh hưởng bởi loại quái vật hoặc phải chịu tiền thưởng.

Sự nhầm lẫn có thể khiến một con quái vật tấn công chính nó thay vì làm những gì nó được bảo phải làm. Đòn tấn công này có sức mạnh 10 và có 30% cơ hội xảy ra ở một lượt cho trước.

Để rõ ràng, các hiệu ứng kéo dài cho đến khi kết thúc trận chiến (trừ Ngủ, như đã lưu ý ở trên).

Mov cũng nhận được 20% sức mạnh nếu được sử dụng bởi một quái vật thuộc loại tương ứng. Ví dụ, một quái vật Grass sử dụng Vine được tăng cường, trong khi sử dụng Punch thì không.

Chỉ số bí mật

Số liệu thống kê và loại (nhưng không di chuyển) của mỗi quái vật là kiến ​​thức công khai. Đối thủ của bạn sẽ có thể thấy những gì họ đang chiến đấu, để chọn hành động tốt nhất. Tuy nhiên, cũng có những phần thưởng có sẵn được ẩn đi.

Cụ thể, cứ sau hai trận chiến, bạn sẽ được tặng một điểm "thưởng" cho mỗi quái vật trong đội của mình. Điểm được trao cho tất cả quái vật, sống hay chết, người chiến thắng hay kẻ thua cuộc. Bạn có thể chỉ định điều này cho bất kỳ số liệu thống kê nào bạn chọn. Bạn không thể xếp chúng trên một con quái vật; mỗi con quái vật được một lần. Những điểm này miễn dịch với giới hạn 100. Vì sẽ có 100 vòng chiến đấu, điều này có nghĩa là bạn có thể nhận được một chỉ số duy nhất lên tới 149 nếu bạn phân bổ tất cả tiền thưởng của mình cho nó. Một lần nữa, đối thủ sẽ chỉ nhìn thấy các chỉ số "cơ sở" của bạn, vì vậy bạn càng tham gia vào giải đấu, kiến ​​thức của họ càng khác với sự thật.

Trận chiến

Trận chiến diễn ra giữa các đội gồm ba người, mỗi lần một người hoạt động. Khi bắt đầu, bạn sẽ được hiển thị đội của đối thủ và được yêu cầu chọn quái vật nào sẽ là người chơi "hoạt động" đầu tiên của bạn.

Sau đó, lần lượt diễn ra với các bước sau:

  • Chuyển đổi: Công tắc quái vật bắt buộc diễn ra (nếu có)
  • Chọn hành động chiến đấu
  • Chuyển đổi: Bất kỳ chuyển đổi quái vật tùy chọn (được chọn làm hành động chiến đấu) diễn ra
  • Kiểm tra giấc ngủ: Cơ hội để đánh thức giấc ngủ
  • Tấn công 1: Nếu có thể, quái vật tốc độ hơn sử dụng chiêu thức đã chọn
  • Tấn công 2: Nếu có thể, quái vật khác sử dụng chiêu thức đã chọn
  • Hiệu ứng sát thương: Áp dụng sát thương bỏng / độc cho quái vật sống

"Speedier" có nghĩa là quái vật có tốc độ cao hơn. Nếu cả hai chỉ số tốc độ là như nhau, nó được chọn bởi PRNG coin lật mỗi lượt.

Vào cuối bất kỳ lượt nào mà quái vật hoạt động của bạn chết, bạn sẽ được yêu cầu chọn một hoạt động mới. Bạn cũng có thể chọn chuyển đổi quái vật hoạt động khi bạn di chuyển cho bất kỳ lượt nào (miễn là bạn có nhiều hơn một con còn sống). Một lần nữa, nếu bạn chuyển đổi khi bạn di chuyển, bạn sẽ không thực hiện một trận chiến di chuyển theo lượt đó.

Quái vật không được "xử lý" khi không hoạt động. Điều này có nghĩa là chúng không gây sát thương bỏng / độc, quầy độc không tích lũy, không đánh thức giấc ngủ, v.v. Không có hiệu ứng nào bị loại bỏ hoặc thay đổi khi chuyển đổi . Đây không phải là trò chơi chiến đấu quái vật khác . Nếu bạn tắt với đòn tấn công được nâng lên và đốt cháy, chúng sẽ vẫn ở đó khi bạn quay lại.

Hiệu ứng sát thương diễn ra cho dù bạn có giết chết đối thủ tích cực của mình hay không. Theo cách này, các thành viên của cả hai đội có thể chết trong một lượt.

Khi một đội hết quái vật có thể sử dụng, họ sẽ thua. Nếu cả hai đội chạy hết lượt, đó là hòa. Nếu trận chiến kéo dài 1000 lượt, đó là một trận hòa.

Công thức để xác định thiệt hại là:

floor((effAttack / effDefense) * movePower * typeMultiplier * moveBoost)

effAttackeffDefenselà những chỉ số hiệu quả cho những con quái vật. Tấn công hiệu quả có được bằng cách thêm Tấn công và Thưởng Tấn công, sau đó nhân (bằng 0,8 hoặc 1,25) nếu có bất kỳ hiệu ứng nào làm thay đổi nó. Hãy nhớ rằng những hiệu ứng này có thể xếp chồng lên nhau.

Sát thương chỉ có thể là 0 khi công cụ sửa đổi loại là 0 (Bình thường <-> Tâm linh) hoặc Sức mạnh của di chuyển là 0 (Chữa lành, Đốt cháy, v.v.). Nếu không, mức tối thiểu được thi hành tại 1.

Giải đấu

Giải đấu kéo dài trong 100 vòng. Trong mỗi vòng, các đội được xáo trộn và ghép với nhau một cách ngẫu nhiên. Nếu có một số lượng lẻ các đội, phần còn lại sẽ nhận được một lời tạm biệt (điểm số là hòa). Chiến thắng một trận chiến kiếm được cho đội 2 điểm, các mối quan hệ có giá trị 1 , và không mất gì. Đội nào có nhiều điểm nhất vào cuối sẽ chiến thắng!

Nếu các đội bị trói, một giải đấu chỉ có các đội được buộc ở vị trí đầu tiên sẽ diễn ra để xác định thứ tự bẻ khóa.

Giao thức

Bộ điều khiển sẽ gửi chương trình của bạn một trong bốn lệnh. Ký tự đầu tiên xác định loại lệnh, với dữ liệu sau nếu cần.

Chương trình của bạn sẽ chấp nhận lệnh làm đối số và sẽ trả lời trên STDOUT trong vòng một giây . Đừng sống nghe STDIN, nó sẽ không ở đó. Mỗi lệnh sẽ sinh ra một quy trình mới.

Bạn có thể ghi dữ liệu / trạng thái vào đĩa. Đặt bất kỳ tệp nào trong thư mục con có cùng tên với nhóm của bạn. Không viết quá 32 kilobyte dữ liệu, nếu không bạn sẽ bị loại. Dữ liệu sẽ tồn tại giữa các vòng, nhưng sẽ bị xóa giữa các giải đấu.

Các lệnh

Dữ liệu nhóm

Điều này được gửi một lần khi bắt đầu giải đấu để đăng ký đội của bạn. Câu trả lời của bạn phải không đổi , không khác nhau cho mỗi giải đấu.

Truy vấn:

T

Phản ứng:

name|member0|member1|member2

namelà một chuỗi với tên nhóm của bạn. Vui lòng chỉ sử dụng chữ và số để dễ phân tích cú pháp. memberNlà một chuỗi thành viên, cung cấp các chi tiết của từng quái vật:

Chuỗi thành viên:

name:typeid:attack:defense:speed:moveid0:moveid1:moveid2

Một lần nữa, 'tên' là một chuỗi, lần này với tên của quái vật này. typeidlà loại của nó. Các id loại theo thứ tự được hiển thị trong biểu đồ ở trên, với Bình thường = 0 và Cỏ = 4.

Ba lĩnh vực tiếp theo là số liệu thống kê cơ sở của bạn. Hãy ghi nhớ các giới hạn được mô tả trong phần thống kê ở trên.

Ba cuối cùng là di chuyển quái vật của bạn. ID được hiển thị trong biểu đồ di chuyển ở trên.

Một ví dụ trả lời dữ liệu nhóm có thể trông như thế này:

DummyTeam|DummyA:0:50:60:70:0:1:2|DummyB:0:50:60:70:0:1:2|DummyC:0:50:60:70:0:1:2

Bất kỳ đội nào gửi lại rác, định dạng sai hoặc dữ liệu bất hợp pháp ở đây sẽ không tham gia cho đến khi nó được sửa.

Chọn hoạt động

Điều này được gửi vào đầu mỗi trận chiến, và khi một con quái vật chết và cần phải được chuyển đổi.

Truy vấn:

C#battleState

battleStatecho thấy tình trạng của trận chiến hiện tại Chịu đựng tôi ở đây, nó xấu xí:

yourTeamState#theirTeamState

Nơi XteamStatetrông như:

name:activeSlot|member0state|member1state|member2state

activeSlotcho thấy quái vật nào đang hoạt động (0-2). Các quốc gia thành viên có hai hương vị. Nếu đó là đội của bạn , nó sẽ cung cấp thêm thông tin. Vì thế,

Thành viên của bạn :

name:id:attack:defense:speed:hp:typeid:poisonedturns:moveCount0:moveCount1:moveCount2:bonusAttack:bonusDefense:bonusSpeed:effectid:effectid:effectid

Thành viên của họ :

name:id:attack:defense:speed:hp:typeid:poisonedturns:effectid:effectid:effectid

idchỉ đơn giản là một định danh số nguyên bạn có thể sử dụng để theo dõi quái vật nếu bạn không thích sử dụng name.

attack:defense:speedlà số liệu thống kê cơ sở của bạn .

poisonedturns cho bạn biết bạn đã bị đầu độc bao nhiêu lần.

moveCountXcho biết bạn còn lại bao nhiêu lần sử dụng cho mỗi lần di chuyển. Nếu 0, nó không thể được sử dụng. Đối với di chuyển không giới hạn, điều này sẽ là tiêu cực.

bonus(stat) là số điểm thưởng bạn đã chỉ định cho mỗi chỉ số.

effectidlà một danh sách các hiệu ứng có kích thước thay đổi đã được áp dụng cho quái vật của bạn. Sẽ không có dấu vết :trên chuỗi, cho dù có hiệu ứng hoạt động hay không. Nếu có các hiệu ứng xếp chồng lên nhau, chúng sẽ hiển thị dưới dạng nhiều hiệu ứng trong danh sách.

Các id hiệu ứng là:

0  NONE           (should not appear, internal use)
1  POISON
2  CONFUSION 
3  BURN 
4  SLEEP 
5  HEAL           (should not appear, internal use)
6  ATTACK_UP
7  ATTACK_DOWN
8  DEFENSE_UP
9  DEFENSE_DOWN
10 SPEED_DOWN

Phản ứng:

memberSlot

Câu trả lời duy nhất cần có là một số 0,1,2, cho biết thành viên nào bạn muốn hoạt động. Đây phải là một thành viên có khả năng chiến đấu. Đừng gửi lại 1nếu thành viên 1 đã chết.

Trận chiến

Mỗi lượt, bạn cần quyết định phải làm gì.

Truy vấn:

A#battleState

battleStateđây chính xác như được mô tả ở trên.

Phản ứng:

Để sử dụng di chuyển, hãy gửi lại vị trí di chuyển. Ví dụ: nếu tôi đã gán Punch cho vị trí 0, việc gửi sẽ 0thực hiện Punch.

Để chuyển sang thành viên khác, hãy gửi vị trí của thành viên cộng với mười . Vì vậy, để chuyển sang thành viên 2, gửi 12.

Bất cứ điều gì không trong [0,1,2,10,11,12] đều được coi là không hợp lệ và sẽ không dẫn đến hành động nào trong lượt này.

Chỉ số tiền thưởng

Sau mỗi hai trận chiến, bạn nhận được một điểm thưởng bí mật cho mỗi thành viên trong đội.

Truy vấn:

B#yourTeamState

Trạng thái nhóm của bạn giống như được hiển thị ở trên, đừng bắt tôi lặp lại.

Phản ứng:

stat0:stat1:stat2

Phản hồi của bạn sẽ đại diện cho chỉ số nào sẽ tăng cho mỗi thành viên trong nhóm. Tấn công là 0, Phòng thủ là 1, Tốc độ là 2.

Vì vậy, để tăng tốc độ của thành viên, tấn công của thành viên hai và phòng thủ của thành viên ba, bạn sẽ trả lời:

2:0:1

Bộ điều khiển

Bộ điều khiển có thể được tìm thấy trên BitBucket: https: //Geobits@bitbucket.org/Geobits/codemon.git

Chỉ cần ném tất cả các tệp lớp đã gửi, đệ trình và player.conf vào một thư mục và chạy.

Lớp chính của bộ điều khiển được gọi Tournament. Cách sử dụng là:

java Tournament [LOG_LEVEL]

Các cấp độ nhật ký từ 0-4 cung cấp thông tin ngày càng tăng. Cấp 0 điều hành giải đấu một cách âm thầm và chỉ đưa ra kết quả, trong đó cấp 3 đưa ra bình luận lần lượt. Cấp 4 là đầu ra gỡ lỗi.

Bạn có thể thêm các bài nộp vào giải đấu trong players.confChỉ cần thêm chuỗi dòng lệnh cần thiết để chạy chương trình, mỗi dòng trên mỗi dòng. Dòng bắt đầu với #ý kiến.

Trong bài viết của bạn, bao gồm lệnh tôi sẽ cần thêm vào của tôi players.confvà bất kỳ bước biên dịch nào (nếu cần).

Bao gồm là một đội giả bao gồm tất cả các thành viên Bình thường với ba động tác Bình thường. Họ chọn di chuyển ngẫu nhiên và có chỉ số khủng. Hãy vui vẻ đánh bại họ.

Quy tắc linh tinh

  • Bạn không được đọc hoặc ghi vào bất kỳ tài nguyên bên ngoài nào (ngoại trừ trong thư mục con của riêng bạn, tối đa 32 kB như đã lưu ý ở trên).

  • Đội của bạn cần tham gia giải đấu "mù". Điều đó có nghĩa là bạn không thể phân tích nguồn của người khác để tìm ra một đội / quái vật cụ thể sẽ làm gì trong một tình huống nhất định. Bạn có thể phân tích di chuyển / chỉ số của đối thủ và theo dõi khi giải đấu diễn ra, nhưng không mã hóa thông tin này.

  • Không can thiệp vào các quá trình / đệ trình khác. Không gọi họ, sử dụng sự phản chiếu để lấy dữ liệu của họ, v.v. Đừng gây rối với máy tính của tôi. Đừng thử nó. Đây là theo ý của tôi. Những người vi phạm có thể bị cấm tham gia trong tương lai.

  • Thí sinh được giới hạn tối đa hai mục. Nếu bạn gửi nhiều hơn, tôi sẽ chỉ ghi được hai lần đầu tiên gửi. Nếu bạn muốn thu hồi nó, hãy xóa nó.

  • Các mục có thể không tồn tại chỉ để chống đỡ các mục khác. Ngoài ra, bạn không được cố gắng gián tiếp loại bỏ các thí sinh khác (ví dụ: sử dụng tên nhóm nhân vật 27M cho người chơi DQ cố gắng ghi điều này vào đĩa). Mỗi bài nộp nên chơi để giành chiến thắng trên giá trị riêng của nó.

  • Chương trình của bạn có thể sinh ra tối đa một quá trình con tại một thời điểm (tổng số con cháu, không trực tiếp). Cả quá trình chính và bất kỳ tiến trình con nào cũng phải kết thúc trực tiếp sau khi đưa ra đầu ra. Dù bằng cách nào, hãy đảm bảo bạn không vượt quá thời gian chờ.

  • Giải đấu sẽ được tổ chức trên máy tính của tôi chạy Ubuntu với bộ xử lý Intel i7 3770K.

Các kết quả

Đây là kết quả của những người chơi hiện tại. Nó rất gần giữa các ứng cử viên hàng đầu và tôi đang nghĩ về việc giảm số lượng vòng lên tới 500 (và điều chỉnh khoảng cách các điểm thưởng cho phù hợp). Bất kỳ phản đối, ý kiến?

------- Final Results -------

158     Happy3Campers
157     LittleKid
71      InsideYourHead
68      HardenedTrio
46      BitterRivals

Kết quả chơi đầy đủ trên Google Drive


62
Tôi muốn trở thành người giỏi nhất / Giống như không có mã nào từng có / Để không gặp sự cố là thử nghiệm của tôi / Để gỡ lỗi là nguyên nhân của tôi! / Tôi sẽ đi qua mạng LAN / Scripting xa và cố gắng hiểu / Tại sao BIOS của tôi bị rán! / Cod Pokémon, đó là bạn và tôi / Chơi gôn mọi thứ có thể nhìn thấy / Cod Pokémon, bạn thân nhất của tôi / Sau khi chương trình kết thúc! / Cod Pokémon, một lang rất đúng / Không có segfaults sẽ kéo chúng tôi qua / Bạn dạy tôi và tôi sẽ dạy cho bạn / Cod Pokémon, hãy chơi golf tất cả!
Kaz Wolfe

1
Thay vì tăng số vòng lên 500, thật tuyệt nếu một vòng sẽ bao gồm tất cả mọi người chiến đấu với mọi người. Vì vậy, không còn byecho một số lượng đối thủ cạnh tranh không đồng đều và sẽ được đảm bảo rằng các cặp đối sánh được phân phối công bằng và đồng đều.
foobar

@foobar Tôi muốn tránh điều đó vì nó thay đổi quy mô của các trận chiến n^2thay vì n. Chỉ với 7 đối thủ và 100 vòng đấu hiện tại, đó là 2100 trận chiến (so với 300, và 1500 với 500 vòng). Nó chỉ trở nên tồi tệ hơn khi có nhiều mục nhập hơn. Tôi có thể thu nhỏ lại số vòng, nhưng tôi ngần ngại làm điều đó vì tính biến thiên vốn có (liên quan đến trạng thái đặc biệt) và có bội số 50 (cho điểm thưởng) dễ dàng hơn.
Geobits 9/2/2015

Không phải thử thách này đòi hỏi phải cập nhật? :)
GholGoth21

@ GholGoth21 Vâng, tôi tin là có. Tôi có lẽ không thể đến được hôm nay, nhưng có thể ngày mai hoặc ngày hôm sau. Ping tôi trong trò chuyện nếu không được cập nhật vào thứ năm hoặc lâu hơn nếu bạn muốn.
Geobits

Câu trả lời:


16

Chúc mừng 3 người cắm trại - PHP

Một nhóm những kẻ hèn nhát thích vỗ về phe đối lập với những phép thuật suy nhược và xem chúng bị thối rữa.

EDIT : Ông Lumpy đã bị trừng phạt nặng nề và sẽ không nói những lời không hay nữa


Tiện dụngTiện dụngGrass - atk:50 def:99 spd:81 Confuse Poison Heal

Một con hải ly không có nọc độc thích gây nhầm lẫn cho mọi người với những cái bắt tay có vấn đề


FlippyFlippyWater - atk:50 def:99 spd:81 Confuse Burn Heal

Một cựu chiến binh bảng thông báo với một điểm yếu cho các cuộc nói chuyện ngớ ngẩn và những cuộc chiến nảy lửa.


Hạt dẻHạt dẻFire - atk:50 def:99 spd:81 Burn Poison Heal

Vũ khí hủy diệt hàng loạt là kẹo yêu thích của mình.


Hàng loạtHàng loạtPhp - lines:500 clarity:05 spd:01 Gather Guess Store

Nhờ có IQ gần 2 chữ số và trí nhớ phi thường, Lumpy có thể đoán được động thái của kẻ thù. Vâng, chủ yếu.


Chiến lược

Chiến lược là để đối thủ bị đầu độc, đốt cháy và nhầm lẫn càng sớm càng tốt.
Giấc ngủ không được sử dụng vì nó dường như không mạnh hơn 3 phép thuật ở trên.
Sự nhầm lẫn gây chết người trong thời gian dài, vì nó giảm 30% các đòn tấn công (cả gây sát thương và sử dụng phép thuật), ngăn người chữa lành tự chữa lành vết thương và gây tổn hại nặng cho người chơi (một quái vật 50 def / 100 atk sẽ tự gây ra 20 điểm sát thương ).

Khi một kẻ thù được dán kỹ lưỡng, các trại viên của tôi chỉ cần nhìn anh ta nổ tung, thối rữa và tự đấm mình đến chết.

Phòng thủ và chữa bệnh cao được sử dụng để giảm thiểu thiệt hại đến trong cơn đau.

Trong khi 3 người cắm trại của tôi đang chiến đấu, con nai ma thuật Lumpy theo dõi kẻ thù mỗi khi di chuyển, và đôi khi quản lý để xác định chúng. Thông tin được đưa trở lại cho các máy bay chiến đấu của chúng tôi, những người làm hết sức mình để tận dụng lợi thế của nó.

Sau khi phòng thủ, tốc độ là chỉ số quan trọng nhất để tăng.
Sáng kiến ​​là rất quan trọng để áp dụng chữa bệnh trước khi đòn tiếp theo đến.

Tấn công hoàn toàn không được sử dụng.

Có phải phép thuật là vũ khí tối thượng?

Các phép thuật như chất độc, đốt cháy và nhầm lẫn thoát khỏi logic đá / giấy / cắt kéo tổng thể của các cuộc tấn công khác.

Khi một quái vật bị ảnh hưởng, nó sẽ tiếp tục mất HP ngay cả sau khi phép thuật đã chết. Cứ như thể hồn ma của caster cứ tấn công anh ta.
Bên cạnh đó, chất độc trở nên mạnh mẽ nhanh chóng hơn một đòn tấn công lớn được buff đầy đủ (trên 50 điểm sau 5 lượt).

Tuổi thọ của một con quái vật bị đầu độc và bị đốt cháy không vượt quá 8 lượt, thậm chí với 3 lần chữa lành.

Như bot của Martin dường như chỉ ra, sự cân bằng trò chơi là khá tốt.
Về cơ bản, đó là sáng kiến ​​sẽ giúp cân bằng giữa những người mắc lỗi chính tả và những kẻ tấn công thuần túy.

Mật mã

Gọi với php campers.php

Đó là một mớ hỗn độn xấu xí, nhưng thật lòng mà nói giao diện cũng không giúp được gì.

Bây giờ khi một cuộc thi căng thẳng phù hợp xuất hiện, tôi đã thực hiện dự đoán di chuyển kẻ thù đã được lên kế hoạch từ lâu.
Phân tích các cuộc tấn công đòi hỏi các suy luận nhào lộn trên không khác nhau và lưu trữ liên tục trạng thái rẽ cuối cùng, có nghĩa là chiến tranh toàn diện với giao diện điều khiển hoang tưởng.
Nó cũng không phải là một thứ đẹp đẽ và cũng không có jackrabbit sáu chân, nhưng nó là một công việc đầy đủ.

<?php

// ============================================================================
// Game
// ============================================================================
class G {
    static $code_type = array ("Normal", "Psychic", "Fire", "Water", "Grass", "?", "self"); 
    static $code_move = array    ("Punch", "Heal", "Slow", "Pain", "Sleep", "Weaken", "Fireball", "Burn", "Sharpen", "Watergun", "Confuse", "Shield", "Vine", "Poison", "Sap", "?", "self", "pass");
    static $move_uses = array (1000,3,5,1000,3,5,1000,3,5,1000,3,5,1000,3,5,   2000,2000);
    static $move_type      = array (0,0,0,1,1,1,2,2,2,3,3,3,4,4,4, 5,5,5);
    static $move_dmg       = array (20,0,10,20,0,10,20,0,10,20,0,10,20,0,10,  20,10,0);
    static $move_forbidden = array (1,1,1,0,0,0,4,4,4,2,2,2,3,3,3);
    static $code_effect = array ("N", "Poison", "Confuse", "Burn", "Sleep", "H", "Sharpen", "Weaken", "Shield", "Sap", "Slow"); 
    static $decode_type, $decode_move, $decode_effect;
    static $damage_multiplier = array (
        array (2, 0, 1, 1, 1, 0),
        array (0, 2, 1, 1, 1, 0),
        array (1, 1,.5, 2,.5, 0),
        array (1, 1,.5,.5, 2, 0),
        array (1, 1, 2,.5,.5, 0),
        array (2, 2, 2, 2, 2,-1),
        array (9, 9, 9, 9, 9, 9, 1));
    static $atk_score = array ("Poison"=> 1002, "Confuse"=>1001, "Burn"=>1000);
    static $status_field = "atk:def:spd:hp:type:Pturns";
    static $all_moves, $strong_moves, $medium_moves, $effect_moves, $possible_moves;

    function init()
    {
        self::$status_field = explode (":", self::$status_field);
        foreach (array ("type", "move", "effect") as $table) self::${"decode_$table"} = array_flip (self::${"code_$table"});
        foreach (self::$code_move as $c=>$m)
        {
            if ($m == "?") break;
            self::$all_moves[] = new Move($m);
            if (self::$move_uses[$c] >  5) self::$strong_moves[] = $m;
            if (self::$move_uses[$c] == 5) self::$medium_moves[] = $m;
            if (self::$move_uses[$c] == 3) self::$effect_moves[] = $m;
            for ($type = 0 ; $type != 5 ; $type++) if ((self::$move_uses[$c] >  5) && (self::$move_forbidden[$c] != $type)) self::$possible_moves[$type][] = $m;
        }
    }

    function __construct ($name, $team)
    {
        $this->turn = 0;
        $this->name = $name;
        $this->team = $team;
        $this->results_pending = false;
    }

    function parse_team ($tpack, $own_team)
    {
        $pack = explode ("|", $tpack);
        list ($name,$active) = explode (":", array_shift($pack));
        if ($own_team)
        {
            $team = $this->team;
        }
        else
        {
            if (!isset($this->enemies[$name])) $this->enemies[$name] = new Team(array (new Monster (), new Monster (), new Monster ()));
            $team = $this->foes = $this->enemies[$name];
        }
        $team->active = $active;
        foreach ($pack as $i=>$mpack) $team->monster[$i]->parse_monster ($own_team, $mpack);
    }

    function choose_active ()
    {
        // detect start of round
        $team = $this->team;
        $foes = $this->foes;
        foreach ($team->monster as $i=>$m) if ($m->hp > 0) $candidate[$i] = $m;
        if (count ($candidate) == 3)
        {
            $this->results_pending = false;
            $this->round++;

            // reinitialize all monsters
            foreach (array($team, $foes) as $t)
            foreach ($t->monster as $m)
                $m->start_round();

            // guess initial opponent
            $opponent = $foes->initial_opponent();
        }
        else
        {
            $this->analyze_last_round();
            $opponent = $foes->active();
        }
        return $this->do_switch ($opponent);
    }

    function choose_attacker ($foe)
    {
        foreach ($this->team->monster as $i=>$m) if ($m->can_attack($foe)) $candidate[$i] = $m;
        if (isset($candidate))
        {
            uasort ($candidate, function ($a,$b) use ($foe) { return ($a->atk_score != $b->atk_score) ? $b->atk_score - $a->atk_score : $b->life_expectancy($foe) - $a->life_expectancy($foe); });
            return key($candidate);
        }
        return -1;
    }

    function do_switch ($foe)
    {
        $replacement = $this->choose_attacker ($foe);
        if ($replacement < 0)
        {
            $candidate =  $this->team->monster;
            uasort ($candidate, function ($a,$b) use ($foe) { return $b->life_expectancy($foe) - $a->life_expectancy($foe); });
            $replacement = key($candidate);
        }

        $this->old_own = $this->team->monster[$replacement];
        $this->old_own->attack = "pass";
        return $replacement;
    }

    function choose_action ()
    {
        $this->analyze_last_round();
        $own = $this->team->active();
        $foe = $this->foes->active();
        $this->old_own = $own;

        if ($own->hp <= $own->max_damage($foe) && $own->can_do ("Heal")) return $own->execute("Heal");
        if ($attack = $own->can_attack($foe)) return $own->execute($attack);
        if ($own->hp <= 50 && $own->can_do ("Heal")) return $own->execute("Heal");

        return 10 + $this->do_switch ($foe);    
    }

    function choose_bonus()
    {
        foreach ($this->team->monster as $m)
        {
            if ($m->spd_b == 0) { $m->spd_b++; $res[] = 2; }
            else                { $m->def_b++; $res[] = 1; }
        }
        return implode (":", $res);
    }

    function parse ($parts)
    {
        self::parse_team ($parts[1], true);
        self::parse_team ($parts[2], false);    
    }

    function analyze_last_round()
    {
        if ($this->results_pending)
        {
            $this->results_pending = false;

            $foes = $this->foes;
            $foe = null;
            foreach ($foes->monster as $m) if ($m->hp != $m->old->hp) $foe = $m;
            if ($foe === null) $foe = $foes->monster[$foes->active];

            $this->old_own->guess_attack($foe);
        }
    }

    function process ($line)
    {
        $parts = explode ("#", $line);
        switch ($parts[0])
        {
        case "T": // register for tournament
            echo "$this->name|$this->team";
            break;
        case "C": // designate active monster
            $this->parse ($parts);
            echo $this->choose_active();
            break;
        case "A": // choose round action
            $this->parse ($parts);
            echo $this->choose_action();

            // save current state
            foreach (array($this->team, $this->foes) as $t)
            foreach ($t->monster as $m)
            {
                unset ($m->old);
                $m->old = clone ($m);
            }
            $this->results_pending = true;
            break;
        case "B": // distribute stat bonus
            echo $this->choose_bonus();
            break;
        }

    }
}
G::init();

// ============================================================================
// Move
// ============================================================================
class Move {
    function __construct ($move)
    {
        $this->register($move);
    }

    function register ($move)
    {
        $this->type = G::$decode_move[$move];
        $this->reinit();
    }

    function reinit()
    {
        $this->uses = G::$move_uses[$this->type];
    }

    function __tostring() { return G::$code_move[$this->type]."($this->uses)"; }
}

// ============================================================================
// Monster
// ============================================================================
class Monster { 
    function __construct ($name="?", $type="?", $atk=100, $def=100, $spd=100, $m0="?", $m1="?", $m2="?")
    {
        $this->name = $name;
        $this->type = G::$decode_type[$type];
        $this->atk  = $atk;
        $this->def  = $def;
        $this->spd  = $spd;
        $this->hp   = 100;
        $this->move = array (new Move($m0), new Move($m1), new Move($m2));
        $this->atk_b = 0;
        $this->def_b = 0;
        $this->spd_b = 0;
        foreach (G::$code_effect as $e) $this->$e = 0;
    }

    function __tostring ()
    {
        return implode (":", array (
            $this->name,
            $this->type,
            $this->atk,
            $this->def,
            $this->spd,
            $this->move[0]->type,
            $this->move[1]->type,
            $this->move[2]->type));
    }

    function start_round()
    {
        foreach ($this->move as $m) $m->reinit();
    }

    function parse_monster ($own_team, $spack)
    {
        $pack = explode (":", $spack);
        $name = array_shift ($pack); // get name
        array_shift ($pack); // skip id
        if ($this->name == "?") $this->name = $name; // get paranoid
        else if ($this->name != $name) die ("expected $this->name, got $name");

        // store updated values
        foreach (G::$status_field as $var) $this->$var = array_shift ($pack);
        if ($own_team)
        {
            foreach ($this->move as $m) $m->new_count = array_shift($pack);
            $pack = array_slice ($pack, 3); // these are maintained internally
        }
        $var = array();
        foreach ($pack as $e) @$var[G::$code_effect[$e]]++; 
        foreach (G::$code_effect as $e) $this->$e = @$var[$e]+0;
    }

    function damage_recieved ($attack, $foe=null)
    {
        if ($attack == "self") $foe = $this;
        $a = G::$decode_move[$attack];
        $type = G::$move_type[$a];
        $dmg = g::$move_dmg[$a];

        if ($dmg == 0) return 0;

        $atk = ($foe ->atk+$foe ->atk_b) * pow (.8, ($foe ->Weaken - $foe ->Sharpen));
        $def = ($this->def+$this->def_b) * pow (.8, ($this->Sap    - $this->Shield ));

        $boost = ($foe->type == $type) ? 1.2 : 1;
        return max (floor ($dmg * $atk / $def * $boost * G::$damage_multiplier[$this->type][$type]), 1);
    }

    function guess_attack_from_effect ($attacks)
    {
        foreach ($attacks as $status) if ($this->$status != $this->old->$status) return $status;
        return "?";
    }

    function guess_attack_from_damage ($foe, $damages)
    {
        $select = array();
        foreach (G::$possible_moves[$foe->type] as $attack)
        {
            $dmg = $this->damage_recieved ($attack, $foe);
            foreach ($damages as $damage) if ($damage != 0 && abs ($dmg/$damage-1) < 0.1) $select[$attack] = 1;
        }
        $res = array();
        foreach ($select as $a=>$x) $res[] = $a;
        return $res;
    }

    function guess_attack ($foe)
    {
        $attempt = G::$decode_move[$this->old->attack];
        $success = ($this->old->attack == "pass");
        foreach ($this->move as $m)
        {
            if ($m->type == $attempt)
            {
                if ($m->new_count == $m->uses-1)
                {
                    $m->uses--;
                    $success = true;
                }
                break;
            }
        }

        $possible = array();
        $attack = $this->guess_attack_from_effect (array("Burn", "Confuse", "Poison", "Sleep", "Slow", "Weaken", "Sap"));
        if ($attack == "?") $attack = $foe->guess_attack_from_effect (array("Sharpen", "Shield"));
        if ($attack == "?")
        {
            $foe_damage = $this->old->hp - $this->hp - (10 * $this->Burn + 5 * $this->Pturns*$this->Poison);
            if ($this->old->attack == "Heal" && $success) $foe_damage += 50;
            $possible_dmg[] = $foe_damage;
            //;!;if ($this->Confuse) $possible_dmg[] = $foe_damage + $this->damage_recieved ("self");
            $possible = $this->guess_attack_from_damage ($foe, $possible_dmg);
            if (count ($possible) == 1) $attack = $possible[0];
        }
        if ($attack == "?")
        {
            $own_damage = $foe->old->hp - $foe->hp 
                        - (10 * $foe->Burn + 5 * $foe->Pturns*$foe->Poison)
                        + $foe->damage_recieved ($this->attack);
            if (abs ($own_damage/50+1) < 0.1) $attack = "Heal";
        }
        if ($attack != "?")
        {
            $type = G::$decode_move[$attack];
            if ($attack != "?")
            {
                foreach ($foe->move as $m) if ($m->type == $type) goto found_old;
                foreach ($foe->move as $m) if ($m->type == 15) { $m->register($attack); goto found_new; }
            }
            found_new:
            found_old:
        }
    }

    function max_damage($foe)
    {
        $dmg = 0;
        foreach ($foe->move as $m) $dmg = max ($dmg, $this->damage_recieved (G::$code_move[$m->type], $foe));
        return $dmg;
    }

    function expected_damage ($foe)
    {
        return $this->max_damage($foe) + 10 * $this->Burn + 5 * ($this->Pturns+1);
    }

    function life_expectancy ($foe)
    {
        $hp = $this->hp;
        $poison = $this->Pturns;
        $heal = $this->can_do ("Heal");
        $dmg = $this->max_damage($foe);
        for ($turn = 0 ; $hp > 0 && $turn < 10; $turn++)
        {
            $hp -= 10 * $this->Burn + 5 * $poison;
            if ($poison > 0) $poison++;
            $hp -= $dmg;
            if ($hp <= 0 && $heal > 0) { $hp+=50; $heal--; }
        }
        return 100 * $turn + $this->hp;
    }

    function can_attack ($foe)
    {
        $attack = false;
        if ($this->hp > 0)
        {
            if      (!$foe->Poison  && $this->can_do ("Poison" )) $attack = "Poison";
            else if (!$foe->Confuse && $this->can_do ("Confuse")) $attack = "Confuse";
            else if (!$foe->Burn    && $this->can_do ("Burn"   )) $attack = "Burn";
        }
        $this->atk_score = ($attack === false) ? 0 : G::$atk_score[$attack];
        return $attack;
    }

    function can_do($move)
    {
        $type = G::$decode_move[$move];
        foreach ($this->move as $m) if ($m->type == $type && $m->uses > 0) return $m->uses;
        return false;
    }

    function execute($move)
    {
        $type = G::$decode_move[$move];
        foreach ($this->move as $i=>$m) if ($m->type == $type) 
        { 
            if ($m->uses > 0)
            {
//;!;               $m->uses--;
                $this->attack = $move;
            }
            else $this->attack = "pass";
            return $i; 
        }
        die ("$this asked to perform $move, available ".implode(",", $this->move));
    }
}

// ============================================================================
// Team
// ============================================================================
class Team {
    function __construct ($members)
    {
        $this->monster = $members;
    }

    function __tostring()
    {
        return implode ("|", $this->monster);
    }

    function active ()
    {
        return $this->monster[$this->active];
    }

    function initial_opponent()
    {
        return $this->monster[0];
    }
}

// ============================================================================
// main
// ============================================================================
$input = $argv[1];

$team_name = "H3C";
$mem_file = "$team_name/memory.txt";
$trc_file = "$team_name/trace.txt";
if (!file_exists($team_name)) mkdir($team_name, 0777, true) or die ("could not create storage directory '$team_name'");
if ($input == "T") array_map('unlink', glob("$team_name/*.txt"));

if (file_exists($mem_file)) $game = unserialize (file_get_contents ($mem_file));
else
{
    $team = new Team (
        array (
            new Monster ("Handy" , "Grass" , 50, 99, 81, "Confuse", "Poison", "Heal"),
            new Monster ("Nutty" , "Fire"  , 50, 99, 81, "Burn"   , "Poison", "Heal"),
            new Monster ("Flippy", "Water" , 50, 99, 81, "Confuse" , "Burn" , "Heal")));
    $game = new G($team_name,$team);
}

$game->process ($input);
file_put_contents ($mem_file, serialize($game));

Các kết quả

LittleKid vẫn còn đe dọa, nhưng bộ ba của tôi đã đánh bại những kẻ quái dị độc ác của anh ta bằng một lề công bằng.

Các bot của Martin phải chịu số phận thiếu sáng kiến ​​và việc tăng tốc độ của chúng sẽ đòi hỏi phải giảm sức tấn công, điều này sẽ làm giảm khả năng gây sát thương của chúng.

Các ứng cử viên mới từ hành tinh JavaScript ngang hàng với nhóm trong một, nhưng họ thua kém các đối thủ khác. Họ thực sự giúp giảm điểm của LittleKid :).

Vì vậy, có vẻ như những người bạn âu yếm của tôi vẫn là vua của ngọn đồi - bây giờ ...

170             H3C
158             Nodemon
145             LittleKid
55              InsideYourHead
42              HardenedTrio
30              BitterRivals

Và tôi cũng không có PHP. Tuy nhiên, tôi hy vọng bạn sẽ lau sàn nhà bằng Metapods, vì họ đi một chiến thuật chậm và sẽ bị đầu độc đến chết.
Sp3000

... * và * bị đốt cháy sắc nét: D. Đó là rắc rối với các quy tắc phức tạp: một chiến lược vượt trội rất có thể xuất hiện. Vì không có sự bảo vệ chống lại những phép thuật này, họ có thể là người đàn ông béo và cậu bé mập mạp.

Tôi sẽ so sánh nó nhiều hơn với một trò chơi không mang tính bắc cầu như kéo, giấy, đá - vì các hiệu ứng mất một thời gian, một đội tấn công toàn diện sẽ có thể hạ gục bạn :)
Sp3000 4/2/2015

2
Vâng, đây là những gì tôi tưởng tượng ngay khi tôi thấy không có phương thuốc nào cho Poison và Burn. Cảm ơn bạn đã mang giấc mơ của tôi đến với cuộc sống.
justhalf 4/2/2015

1
Đó là ông Lumpy bày tỏ sự bối rối khi phát hiện hơn 3 cuộc tấn công khác nhau từ cùng một đối thủ :). Tôi có một phiên bản cố định gần hoàn tất, nhưng tôi đang ở giữa một số thứ khác ngay bây giờ, vì vậy bản sửa lỗi sẽ được đăng trong một ngày hoặc lâu hơn.

7

HardenedTrio, Python 3

Vì Geobits đủ tốt để cung cấp cho chúng tôi hai lần gửi, tôi nghĩ rằng tôi đã gửi một cái gì đó ngớ ngẩn cho lần đầu tiên: P

Bữa tiệc là ba Codemon (Metapod1, Metapod2, Metapod3) với cùng chỉ số và di chuyển:

  • 80 tấn công, 100 phòng thủ, 50 tốc độ
  • Punch, Heal, khiên Harden

Tất cả các điểm thưởng cũng được chỉ định để phòng thủ.


from collections import namedtuple
import sys

BattleState = namedtuple("BattleState", ["us", "them"])
TeamState = namedtuple("TeamState", ["name", "active", "members"])
MemberState = namedtuple("MemberState", ["name", "id", "attack", "defense", "speed", "hp",
                                         "typeid", "poisonedturns", "otherstats"])

def parse_battle_state(state):
    return BattleState(*map(parse_team_state, state.split("#")))

def parse_team_state(state):
    na, *members = state.split("|")
    name, active = na.split(":")
    return TeamState(name, int(active), list(map(parse_member_state, members)))

def parse_member_state(state):
    name, id_, attack, defense, speed, hp, typeid, poisonedturns, *rest = state.split(":")
    return MemberState(name, int(id_), float(attack), float(defense), float(speed),
                       float(hp), int(typeid), int(poisonedturns), rest)

command = sys.argv[1].strip()

if command.startswith("T"):
    print("HardenedTrio|Metapod1:0:80:100:50:0:1:11|"
          "Metapod2:0:80:100:50:0:1:11|Metapod3:0:80:100:50:0:1:11")

elif command.startswith("C"):
    battle_state = parse_battle_state(command[2:])

    for i, codemon in enumerate(battle_state.us.members):
        if codemon.hp > 0:
            print(i)
            break

elif command.startswith("A"):
    battle_state = parse_battle_state(command[2:])
    current_codemon = battle_state.us.members[battle_state.us.active]

    if current_codemon.hp < 50 and int(current_codemon.otherstats[1]) > 0:
        print(1) # Heal up if low

    elif int(current_codemon.otherstats[2]) > 0:
        print(2) # Harden!

    else:
        print(0) # Punch!

elif command.startswith("B"):
    print("1:1:1")

Chạy với

py -3 <filename>

(hoặc với python/ python3thay vì pytùy thuộc vào cài đặt của bạn)



1
@FryAmTheEggman Metapod, CỨNG!
Sp3000

Tôi đang cố đọc mã của bạn, nhưng bị lẫn lộn int(current_codemon.otherstats[1])>0. Điều đó trả về đúng nếu anh ta có hiệu ứng trạng thái? Và anh ta chỉ sử dụng harden nếu anh ta có hai hiệu ứng trạng thái?
Vịt Mooing 6/2/2015

@MooingDuck Đối với Codemon của bạn, bạn đã có moveCounttrước effectids, vì vậy nó sẽ kiểm tra xem nó có thể sử dụng Harden hay không. Tôi đã lười biếng với phân tích cú pháp, đó là lý do tại sao nó được gộp vào đó.
Sp3000 6/2/2015

@ Sp3000: Ồ! Đúng! HAHAHA!
Vịt Mooing 6/2/2015

6

Bên trong đầu bạn, Ruby

  • Brian : Tâm linh, Tấn công: 100, Phòng thủ: 50, Tốc độ: 80, Đau đớn, Quả cầu lửa, Súng nước
  • Elemon1 : Tâm linh, Tấn công: 100, Phòng thủ: 50, Tốc độ: 80, Quả cầu lửa, Súng nước, Cây nho
  • Elemon2 : Tâm linh, Tấn công: 100, Phòng thủ: 50, Tốc độ: 80, Quả cầu lửa, Súng nước, Cây nho
TEAM_SPEC = "InsideYourHead"+
            "|Brian:1:100:50:80:3:6:9"+
            "|Elemon1:1:100:50:80:6:9:12"+
            "|Elemon2:1:100:50:80:6:9:12"

def parse_battle_state request
    request.map do |team_state|
        state = {}
        parts = team_state.split '|'
        state[:active] = parts.shift.split(':')[1].to_i
        state[:monsters] = parts.map do |monster_state|
            monster = {}
            parts = monster_state.split(':')
            monster[:name] = parts[0]
            monster[:hp] = parts[5].to_i
            monster[:type] = parts[6].to_i
            monster
        end
        state
    end
end

request = ARGV[0].split '#'
case request.shift
when 'T'
    puts TEAM_SPEC
when 'C'
    battle_state = parse_battle_state request
    my_state = battle_state[0]
    puts my_state[:monsters].find_index {|monster| monster[:hp] > 0}
when 'A'
    battle_state = parse_battle_state request
    my_state, their_state = *battle_state
    my_monster = my_state[:monsters][my_state[:active]]
    their_monster = their_state[:monsters][their_state[:active]]
    puts [1,0,1,2,0][their_monster[:type]]
when 'B'
    puts '0:0:0'
end

Chạy với

ruby InsideYourHead.rb

Điều này không hoạt động tốt với bot của Manu, nhưng nó đánh bại ba người kia. Tên đội và quái vật khá ngẫu nhiên ... Tôi có thể thay đổi chúng nếu tôi nghĩ ra thứ gì đó tốt hơn

Chiến lược khá đơn giản: tấn công! Cả ba quái vật chỉ có những đòn tấn công thuần túy và chúng chọn cách di chuyển dựa trên loại quái vật của đối thủ.

Tôi có thể thử nghiệm ném vào Heal sau.


1
Hehe điều này trở nên thú vị hơn. Tôi biết tôi có thể tin tưởng vào bạn vì điều đó, Martin :)

6

LittleKid, Java

Một đứa trẻ tìm thấy 3 codémons giống hệt nhau và huấn luyện chúng. Họ rất khó chịu với các đòn tấn công chữa lành + độc của họ. Chỉ sử dụng codém loại bình thường sẽ loại bỏ nhu cầu ghép chúng với kẻ thù cụ thể, vì chất độc hoạt động tốt với tất cả các loại.

public class LittleKid {

    public static void main(String[] args) {
        if(args.length < 1){
            System.out.println("Geobits says you can't do this.");
            System.exit(0);
        }

        String[] sections = args[0].split("#");
        String me, them, out = "";
        switch(sections[0]){
            case "T":
                out = "LittleKid";
                out += "|Poisoner:0:80:100:50:0:1:13";
                out += "|Poisoner:0:80:100:50:0:1:13";
                out += "|Poisoner:0:80:100:50:0:1:13";
                break;
            case "B":
                out = "1:1:1";
                break;
            case "C":
                me = sections[1];
                them = sections[2];
                int pick = 0;

                if(!isAlive(me, pick)){
                    for(int i=0;i<3;i++){
                        if(isAlive(me,i))
                            pick = i;
                    }
                }

                out = String.valueOf(pick);
                break;
            case "A":
                me = sections[1];
                them = sections[2];
                int active = getActive(me);
                int enemyActive = getActive(them);
                if (getField(me, HP, active) < 50 && getField(me, MOVE1, active) != 0) {
                    out = "1";
                } else if (getEffectCount(them, POISON, enemyActive, false) < 1 && getField(me, MOVE2, active) != 0) {
                    out = "2";
                } else {
                    out = "0";
                }
                break;
            default:
                out = "Invalid query from controller.";             
        }
        System.out.println(out);
    }

    static boolean isAlive(String teamState, int who){
        return getField(teamState, HP, who) > 0;
    }

    static int getActive(String teamState){
        return Integer.parseInt(teamState.split("\\|")[0].split(":")[1]);
    }

    static int getField(String teamState, int field, int who){
        String[] fields = teamState.split("\\|")[who+1].split(":");
        return Integer.parseInt(fields[field]);
    }

    static int getEffectCount(String teamState, int effect, int who, boolean mine){
            String[] fields = teamState.split("\\|")[who+1].split(":");
            int count = 0;
            for(int i=mine?14:8;i<fields.length;i++){
                if(Integer.parseInt(fields[i]) == effect)
                    count++;
            }
            return count;
    }

    final static int ID =       1; 
    final static int ATTACK =   2; 
    final static int DEFENSE =  3; 
    final static int SPEED =    4; 
    final static int HP =       5; 
    final static int TYPE =     6;
    final static int MOVE0 =    8; 
    final static int MOVE1 =    9; 
    final static int MOVE2 =    10;

    final static int POISON =           1;
}

5
" Geobits nói rằng bạn không thể làm điều này ": D
Geobits 4/2/2015

Có vẻ như chất độc là bom A thực sự trong trò chơi này :)

5

Nod Pokémon - Javascript

Vì trạng thái dường như là chiến lược thống trị, đội này tập trung vào tốc độ để có được các trạng thái như độc và nhầm lẫn với đối thủ trước, sau đó thoát ra bằng cách chữa lành và / hoặc ngủ trong khi đối thủ lãng phí.

Tôi chưa cài đặt PHP vì vậy điều này không được thử nghiệm đối với các Campers, nhưng dường như đây là một đối thủ đáng gờm đối với LittleKid trong các thử nghiệm của tôi (và giải mã Bitter Rivals).

/*jshint node:true*/
'use strict';

var fs = require('fs');

var dataFile = 'Nodemon/data.json';
function getData(callback) {
  fs.readFile(dataFile, 'utf8', function(err, contents) {
    var data = {round: 0};

    if(!err) {
      data = JSON.parse(contents);
    }

    callback(data);
  });
}

function saveData(data, callback) {
  fs.mkdir('Nodemon', function() {    
    fs.writeFile(dataFile, JSON.stringify(data), callback);
  });
}

var effect = {
  poison: '1',
  confusion: '2',
  burn: '3',
  sleep: '4',
  heal: '5',
  attackUp: '6',
  attackDown: '7',
  defenseUp: '8',
  defenseDown: '9',
  speedDown: '10'
};

function parseMemberCommon(args) {
  return {
    name: args[0],
    id: args[1],
    baseAttack: +args[2],
    baseDefense: +args[3],
    baseSpeed: +args[4],
    hp: +args[5],
    typeId: args[6],
    poisonedTurns: +args[7],
    effects: args.slice(8)
  };
}

function parseOwnMember(arg) {
  var args = arg.split(':');

  var ownArgs = args.splice(8, 6);

  var member = parseMemberCommon(args);

  member.moveCount = [
    +ownArgs[0],
    +ownArgs[1],
    +ownArgs[2]
  ];

  member.bonusAttack = +ownArgs[3];
  member.bonusDefense = +ownArgs[3];
  member.bonusSpeed = +ownArgs[3];

  return member;
}

function parseOpponentMember(arg) {
  return parseMemberCommon(arg.split(':'));
}

function parseTeamStateCommon(arg, memberParse) {
  var args = arg.split(':');
  var state = {
    name: args[0],
    members: []
  };
  args = arg.substring(state.name.length + 1).split('|');
  var activeSlot = args[0];
  for(var index = 1; index < args.length; index++) {
    state.members.push(memberParse(args[index]));
  }
  state.activeMember = state.members[activeSlot];
  return state;
}

function parseOwnState(arg) {
  return parseTeamStateCommon(arg, parseOwnMember);
}

function parseOpponentState(arg) {
  return parseTeamStateCommon(arg, parseOpponentMember);
}

function parseBattleState(arg) {
  var args = arg.split('#');
  return {
    own: parseOwnState(args[0]),
    opponent: parseOpponentState(args[1])
  };
}

function teamData() {

  saveData({round:0}, function() {
    console.log('Nodemon|' + 
      'Charasaur:0:50:80:100:10:13:1|' +
      'Bulbtortle:4:50:80:100:10:13:1|' +
      'Squirtmander:1:50:80:100:10:13:4');
  });
}

function getActiveIndex(battleState) {
  for(var index = 0; index < battleState.own.members.length; index++) {
    var member = battleState.own.members[index];
    if(member.hp > 0) {
      return index;
    }
  }
}

function chooseActive(arg) {
  var battleState = parseBattleState(arg);

  getData(function(data) {
    var allFull = true;
    for(var index = 0; index < battleState.opponent.members.length; index++) {
      var member = battleState.opponent.members[index];
      if(!data.maxSpeed || member.baseSpeed > data.maxSpeed) {
        data.maxSpeed = member.baseSpeed;
      }
      if(member.hp < 100) {
        allFull = false;
      }
    }

    if(allFull) {
      data.round++;
    }

    saveData(data, function() {
      console.log(getActiveIndex(battleState));
    });    
  });
}

function useMove(moves, battleState) {
  var fighter = battleState.own.activeMember;

  for(var moveIndex = 0; moveIndex < moves.length; moveIndex++) {
    var move = moves[moveIndex];
    if(fighter.moveCount[move]) {
      return move;
    }

    for(var memberIndex = 0; memberIndex < battleState.own.members.length; memberIndex++) {
      var member = battleState.own.members[memberIndex];

      if(member.hp > 0 && member.moveCount[move] > 0) {
        return 10 + memberIndex;
      }
    }
  }

  return -1;  //do nothing
}

function battleAction(arg) {
  var battleState = parseBattleState(arg);

  var fighter = battleState.own.activeMember;
  var opponent = battleState.opponent.activeMember;

  var attemptedMoves = [];

  if(opponent.effects.indexOf(effect.poison) === -1) {
    attemptedMoves.push(1);
  }

  if(opponent.effects.indexOf(effect.confusion) === -1) {
    attemptedMoves.push(0);
  }

  if(fighter.name === 'Squirtmander') {
    //sleep
    if(opponent.effects.indexOf(effect.sleep) === -1) {
      attemptedMoves.push(2);
    }
  }
  else {
    //heal
    if(fighter.hp <= 60) {
      attemptedMoves.push(2);
    }
  }

  console.log(useMove(attemptedMoves, battleState));
}

function bonusStats(arg) {
  var teamState = parseOwnState(arg);

  getData(function(data) {
    var result = '1:';

    if(data.round % 4 === 0) {
      result += '1:';
    }
    else {
      result += '2:';
    }
    if(teamState.members[2].baseSpeed + teamState.members[2].bonusSpeed > data.maxSpeed + (data.round / 2)) {
      result += '1';
    }
    else {
      result += '2';
    }
    console.log(result);
  });
}

var actions = {
  'T': teamData,
  'C': chooseActive,
  'A': battleAction,
  'B': bonusStats
};

var arg = process.argv[2];
actions[arg[0]](arg.substring(2));

Chạy với

node nodemon

PS xin lỗi để gật đầu .


Điều này đang leo thang đến một cuộc chiến toàn cầu về phía máy chủ: D

4

Đối thủ đắng - Java

Một đội Cỏ / Lửa / Nước thích bật nó lên.

Greenizard

Có ít nhất bảo hiểm trung lập trên bất cứ ai. Tốc độ cao để bù đắp cho việc thiếu phòng thủ.

Type: Grass
Attack:   80     Vine
Defense:  50     Punch
Speed:   100     Pain

Searizard

Cố gắng để kẻ thù Sap với tấn công thấp. Bỏng và Fireballs sau đó.

Type: Fire
Attack:  100     Fireball
Defense:  50     Burn
Speed:    80     Sap

Blastshield

Sử dụng Shield để tăng cường phòng thủ vốn đã cao. Chữa lành khi cần thiết.

Type: Water
Attack:   80     Watergun
Defense: 100     Shield
Speed:    50     Heal

Điều này cũng được bao gồm với bộ điều khiển. Đây một đội cạnh tranh, không giống như DummyTeam. Lệnh cần thiết players.conflà:

java BitterRivals

public class BitterRivals {

    public static void main(String[] args) {
        if(args.length < 1){
            System.out.println("You're not doing this right. Read the spec and try again.");
            System.exit(0);
        }

        String[] sections = args[0].split("#");
        String me, them, out = "";
        switch(sections[0]){
            case "T":
                out = "BitterRivals";
                out += "|Greenosaur:4:80:50:100:12:0:3";
                out += "|Searizard:2:100:50:80:6:7:14";
                out += "|Blastshield:3:80:100:50:9:11:1";
                break;
            case "B":
                out = "2:0:1";
                break;
            case "C":
                me = sections[1];
                them = sections[2];

                int pick = 0;
                switch(getField(them, TYPE, getActive(them))){
                    case 0:
                    case 1:
                    case 3:
                        pick = 0;
                        break;
                    case 2:
                        pick = 2;
                        break;
                    case 4:
                        pick = 1;
                        break;
                }

                if(!isAlive(me, pick)){
                    for(int i=0;i<3;i++){
                        if(isAlive(me,i))
                            pick = i;
                    }
                }

                out = pick + "";
                break;
            case "A":
                me = sections[1];
                them = sections[2];
                int active = getActive(me);
                int oType = getField(them, TYPE, getActive(them));
                switch(active){
                    case 0:         // Greenosaur
                        switch(oType){
                            case 0:
                            case 4:
                                out = "1";
                                break;
                            case 1:
                                out = "2";
                                break;
                            case 3:
                                out = "0";
                                break;
                            case 2:
                                if(isAlive(me, 2)){
                                    out = "12";
                                } else if(isAlive(me, 1)){
                                    out = "11";
                                } else {
                                    out = "1";
                                }
                                break;
                        }
                        break;
                    case 1:         // Searizard
                        if(oType == 3){
                            if(isAlive(me, 0)){
                                out = "10";
                                break;
                            } else if(isAlive(me, 2)){
                                out = "12";
                                break;
                            }
                            if(getEffectCount(them, BURN, getActive(them), false) < 1 && getField(me, MOVE1, active) > 0){
                                out = "1";
                            } else if(getField(me, MOVE2, active) > 0){
                                out = "2";
                            } else {
                                out = "3";
                            }                           
                        } else {
                            if(getField(them, ATTACK, getActive(them)) < 80){
                                if(getEffectCount(them, DEFENSE_DOWN, getActive(them), false) < 1 && getField(me, MOVE2, active) > 0){
                                    out = "2";
                                    break;
                                } else if(getEffectCount(them, BURN, getActive(them), false) < 1 && getField(me, MOVE1, active) > 0){
                                    out = "1";
                                    break;
                                }
                            }
                            out = "0";
                        }
                        break;
                    case 2:         // Blastshield
                        if(oType == 4){
                            if(isAlive(me, 1)){
                                out = "11";
                                break;
                            } else if(isAlive(me, 0)){
                                out = "10";
                                break;
                            }
                        }
                        if(getField(me, HP, active) < 50 && getField(me, MOVE2, active) > 0){
                            out = "2";
                        } else if(getEffectCount(me, DEFENSE_UP, active, true) < 3 && getField(me, MOVE1, active) > 0){
                            out = "1";
                        } else {
                            out = "0";
                        }
                        break;
                }
                break;
            default:
                out = "Invalid query from controller.";             
        }
        System.out.println(out);
    }

    static boolean isAlive(String teamState, int who){
        return getField(teamState, HP, who) > 0;
    }

    static int getActive(String teamState){
        return Integer.parseInt(teamState.split("\\|")[0].split(":")[1]);
    }

    static int getField(String teamState, int field, int who){
        String[] fields = teamState.split("\\|")[who+1].split(":");
        return Integer.parseInt(fields[field]);
    }

    static int getEffectCount(String teamState, int effect, int who, boolean mine){
            String[] fields = teamState.split("\\|")[who+1].split(":");
            int count = 0;
            for(int i=mine?14:8;i<fields.length;i++){
                if(Integer.parseInt(fields[i]) == effect)
                    count++;
            }
            return count;
    }

    final static int ID =       1; 
    final static int ATTACK =   2; 
    final static int DEFENSE =  3; 
    final static int SPEED =    4; 
    final static int HP =       5; 
    final static int TYPE =     6; 
    final static int PTURNS =   7; 
    final static int MOVE0 =    8; 
    final static int MOVE1 =    9; 
    final static int MOVE2 =    10; 
    final static int HA =       11; 
    final static int HD =       12; 
    final static int HS =       13; 

    final static int POISON =           1;
    final static int CONFUSION =        2;
    final static int BURN =             3;
    final static int SLEEP =            4;
    final static int ATTACK_UP =        6;
    final static int ATTACK_DOWN =      7;
    final static int DEFENSE_UP =       8;
    final static int DEFENSE_DOWN =     9;
    final static int SPEED_DOWN =       10;
}

4

Lỗi 310: Quá nhiều chuyển hướng - C ++

Một đội ngũ được đào tạo và tổ chức cao để chống lại sự tàn phá của chất độc

Trong ba tuần, tôi hầu như không đào tạo được codémons của mình. Tôi thành lập một số đội. Và cuối cùng, tôi sẵn sàng đối mặt với thử thách này. Để trả lời tất cả các đối thủ đầu độc của mình, tôi đã thành lập một đội với các loại tiền mã hóa rất khác nhau, mỗi nhóm có một vai trò cụ thể.


Thuốc giải độc(Hình ảnh, tưởng tượng)

Type : Normal - atk:50 def:100 spd:80 - Poison/Burn/Heal

Thuốc giải độc yêu độc. Đến nỗi tôi không thể ngăn anh ta lao vào tấn công bằng chất độc.


thiền học(Hình ảnh, tưởng tượng)

Type : Fire - atk:100 def:80 spd:50 - Poison/Vine/Heal

Zen là một Pokémon rất đáng ngạc nhiên, phù hợp với tất cả các hiệu ứng. Anh ấy thích xem kẻ thù của mình phấn đấu và kiệt sức chống lại sự im lặng của anh ấy.


Triforce(Hình ảnh, tưởng tượng)

Type : Psychic - atk:88 def:60 spd:82 - Fireball/Watergun/Vine

Triforce là một con cá bống cổ điển, luôn sẵn sàng chiến đấu. Người này sử dụng lực lượng tâm linh của mình để kiểm soát ba yếu tố và gây ra càng nhiều thiệt hại càng tốt.


Bạn có thể tải xuống nhóm tại đây:

Linux:

http://dl.free.fr/iHYlmTOQ2

ra mắt với ./Error310TMR

Các cửa sổ :

http://dl.free.fr/vCyjtqo2s

ra mắt với ./Error310TMR.exe

Mã này là một dự án c ++ hoàn chỉnh. Tôi không biết làm thế nào để xuất bản nó.

$ wc -l src/*
    165 src/BruteForce.cpp
     26 src/BruteForce.h
    349 src/Codemon.cpp
     77 src/Codemon.h
     21 src/Logger.cpp
     35 src/Logger.h
    105 src/NoTimeToExplain.cpp
     27 src/NoTimeToExplain.h
    240 src/Recoverator.cpp
     31 src/Recoverator.h
     26 src/StrManip.cpp
     16 src/StrManip.h
    303 src/Team.cpp
     68 src/Team.h
     88 src/TooManyRedirects.cpp
     24 src/TooManyRedirects.h
     87 src/Unrecoverable.cpp
     27 src/Unrecoverable.h
     59 src/enums.cpp
    119 src/enums.h
     68 src/main.cpp
   1961 total

Nhưng nó rất hiệu quả:

------- Final Results -------

176     Error310TMR
131     H3C
130     LittleKid
121     Nodemon
58      InsideYourHead
47      HardenedTrio
37      BitterRivals

2

Truyện cổ tích

Một đội đường giữa khá chung chung. Dựa trên ba nguyên mẫu, những người cố gắng làm việc của họ, và tắt nếu họ không thể làm việc của họ.

Đội này được tạo ra trước khi có vẻ như chất độc là meta mới, tôi thực sự không theo kịp việc thay đổi đội của mình kể từ khi tôi tạo ra nó, phần lớn thời gian chỉ dành cho việc cố gắng phân tích cú pháp. Tôi chưa thể chạy Giải đấu để thử nó, nhưng đó là một tuần khá bận rộn. Nếu cái này không thực sự hoạt động giống như với dữ liệu thử nghiệm của tôi, tôi sẽ áp dụng một số bóng hơn cho nó sau khi làm việc.

#!/bin/perl
use 5.20.0;
use strict;

use constant MINE => 0;
use constant THEIRS => 1;

$_ = $ARGV[0];

if(/^T/){
    say 'FairyTale|Fairy:1:89:90:51:3:4:13|Dragon:2:100:50:80:6:1:8|Assassin:0:70:60:100:0:1:10';

} elsif(/^C#(.*)/){
    my $state = readBattleState($1);
    if($state->[MINE]->{$state->[MINE]->{slot}}{hp}){
        say $state->[MINE]->{slot};
    } elsif($state->[MINE]->{($state->[MINE]->{slot}+1)%3}{hp}){
        say (($state->[MINE]->{slot}+1)%3);
    } else {
        say (($state->[MINE]->{slot}+2)%3);
    }

} elsif(/^A#(.*)/){
    my $state = readBattleState($1);
    my @actives = (
        $state->[MINE]->{$state->[MINE]->{slot}},
        $state->[THEIRS]->{$state->[THEIRS]->{slot}}
    );
    if($state->[MINE]->{slot} == 0){
        if(!exists($actives[THEIRS]{effects}{4}) && $actives[MINE]{pp}->[1]){
            say 1;
        } elsif(!exists($actives[THEIRS]{effects}{1}) && $actives[MINE]{pp}->[2]) {
            say 2;
        } elsif(!$actives[THEIRS]{type}) {
            if($state->[MINE]->{($state->[MINE]->{slot}+1)%3}{hp} > 0){
                say (($state->[MINE]->{slot}+1)%3);
            } elsif($state->[MINE]->{($state->[MINE]->{slot}+2)%3}{hp} > 0) {
                say (($state->[MINE]->{slot}+2)%3);
            } else {
                say 0;
            }
        } else {
            say 0;
        }
    } elsif($state->[MINE]->{slot} == 1){
        if(!exists($actives[MINE]{effects}{6}) && $actives[MINE]{pp}->[2]){
            say 2;
        } elsif ($actives[MINE]{hp} > 10 && $actives[MINE]{hp} < 50 && $actives[MINE]{pp}->[1]){
            say 1;
        } else {
            say 0;
        }
    } elsif($state->[MINE]->{slot} == 2){
        if(!exists($actives[MINE]{effects}{6}) && $actives[MINE]{pp}->[2]){
            say 2;
        } elsif ($actives[MINE]{hp} > 10 && $actives[MINE]{hp} < 50 && $actives[MINE]{pp}->[1]){
            say 1;
        } elsif($actives[THEIRS]{type} == 1) {
            if($state->[MINE]->{($state->[MINE]->{slot}+1)%3}{hp} > 0){
                say (($state->[MINE]->{slot}+1)%3);
            } elsif($state->[MINE]->{($state->[MINE]->{slot}+2)%3}{hp} > 0) {
                say (($state->[MINE]->{slot}+2)%3);
            } else {
                say 0;
            }
        } else {
            say 0;
        }
    }

} elsif(/^B#(.*)/){
    my $state = readTeam($1, 1);
    say '1:0:2';
}

sub readBattleState {
    local $_ = $_[0];
    if(/^(.*?)#(.*?)$/){
        my @teams;
        $teams[0] = readTeam($1, 1);
        $teams[1] = readTeam($2, 0);
        return \@teams;
    }
}

sub readTeam {
    my $isMine = $_[1];
    local $_ = $_[0];
    if(/.*?:(?<slot>.*?)\|(.*?)\|(.*?)\|(.*?)$/){
        my %team;
        $team{slot} = $1;
        $team{0} = $isMine ? readYourMember($2) : readTheirMember($2);
        $team{1} = $isMine ? readYourMember($3) : readTheirMember($3);
        $team{2} = $isMine ? readYourMember($4) : readTheirMember($4);
        return \%team;
    }
    return 0;
}

sub readYourMember {
    local $_ = $_[0];
    if(/(?<name>.*?):(?<id>.*?):(?<atk>.*?):(?<def>.*?):(?<spd>.*?):(?<hp>.*?):(?<type>.*?):(?<poison>.*?):(?<move0>.*?):(?<move1>.*?):(?<move2>.*?):(?<batk>.*?):(?<bdef>.*?):(?<bspd>.*?)(?<effects>(?::.*)|$)/){
        my %effects = map { $_ => 1 } readEffects($+{effects});
        my %member = (
            name   => $+{name},
            id     => $+{id},
            hp     => $+{hp},
            atk    => $+{atk}+$+{batk},
            def    => $+{def}+$+{bdef},
            spd    => $+{spd}+$+{bspd},
            type   => $+{type},
            pp     => [$+{move0}, $+{move1}, $+{move2}],
            poistrn=> $+{poison},
            effects=> \%effects
        );
        return \%member;
    }
}

sub readTheirMember {
    local $_ = $_[0];
    if(/(?<name>.*?):(?<id>.*?):(?<atk>.*?):(?<def>.*?):(?<spd>.*?):(?<hp>.*?):(?<type>.*?):(?<poison>.*?)(?<effects>(?::.*)|$)/){
        my %effects = map { $_ => 1 } readEffects($+{effects});
        my %member = (
            name   => $+{name},
            id     => $+{id},
            hp     => $+{hp},
            atk    => $+{atk},
            def    => $+{def},
            spd    => $+{spd},
            type   => $+{type},
            poistrn=> $+{poison},
            effects=> \%effects
        );
        return \%member;
    }
    return 0;
}

sub readEffects {
    local $_ = $_[0];
    my @retval = /:([^:]*)/g;
    if(!@retval){
        @retval = (0);
    }
    return @retval;
}

Chạy với

perl fairytale.pl

Bot này bị đuổi vì cố gắng 'chọn thành viên đã chết hoạt động' sau khi chết đầu tiên. Nó không bao giờ vượt qua trận chiến đầu tiên mà tôi có thể thấy.
Geobits 10/2/2015

Có thật không? Tôi nghĩ rằng tôi đã nhận ra lỗi đó trước đó, có lẽ đây là phiên bản cũ hơn của mã đó ...
mezzoEmrys

Đừng quên rằng khi một codemon bị đánh bật, điểm hồi máu của anh ta giảm xuống 0 hoặc ít hơn . Vì vậy, if($state->[MINE]->{$state->[MINE]->{slot}}{hp})tuyên bố sẽ không hoạt động chính xác mà không có >0.
GholGoth21

Ah, yeah, sẽ làm điều đó.
mezzoEmrys

0

Nhóm giả - Java

(CW không cạnh tranh)

Đây là một đội giả để thực hành. Đó là tất cả các loại bình thường, chọn ngẫu nhiên giữa các bước di chuyển của chúng (Đấm, Chữa lành, Chậm) mỗi lượt. Hãy vui vẻ với nó.

public class DummyTeam {

    public static void main(String[] args) {
        if(args.length < 1){
            System.out.println("You need to run this from the tournament. Try to keep up.");
            System.exit(0);
        }

        String[] sections = args[0].split("#");
        String out = "";
        switch(sections[0]){
            // team data
            //      sends back all Normal types with minimum stats and Normal moves (randomized name suffixes to distinguish in tests)
            case "T":
                out = "DummyTeam";
                for(int i=0;i<3;i++)
                    out += "|Dummy"+((char)(Math.random()*26)+65) + i + ":0:50:50:50:0:1:2";
                break;
            // bonus points
            //      shoves them all in defense every time
            case "B":
                out = "1:1:1";
                break;
            // choose active
            //      picks last active if alive, otherwise loops to find first living member
            case "C":
                String[] team = sections[1].split("\\|");
                int current = Integer.parseInt(team[0].split(":")[1]);
                if(Integer.parseInt(team[current+1].split(":")[5]) > 0){
                    out = current + "";
                } else {
                    for(int i=1;i<team.length;i++){
                        if(Integer.parseInt(team[i].split(":")[5]) > 0){
                            out = (i - 1) + "";
                        }
                    }
                }               
                break;
            // choose action
            //      chooses a random move. does not check if it ran out of uses, so wastes turns quite often
            case "A":
                out = ((int)(Math.random()*3)) + "";
                break;
            default:
                out = "Invalid query from controller.";             
        }
        System.out.println(out);
    }


}
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.