Đây là một thử thách King of the Hill trong một vòng tròn. Đó là một trận chiến để tìm ra tay súng giỏi nhất của phương tây!
Để có thể cạnh tranh trong cuộc thi này, bạn cần thực hiện hai chức năng. Cái đầu tiên đặt các thuộc tính của tay súng của bạn và cái thứ hai là chức năng logic chính cho tay súng.
Chức năng thuộc tính
function () {
var bot = {
name: "testBot",
numbOfBullets: 7,
reloadSpeed: 1,
shotsPerTurn: 1,
moveSpeed: 2
}
return bot
}
Hàm thuộc tính bao gồm 5 biến mà bạn sẽ cần đặt theo một số quy tắc (ngoại trừ name
đó là bất kỳ chuỗi nào). Bạn phải dành tổng cộng chính xác 15 điểm cho tay súng của mình - những tay súng không dành đủ 15 điểm sẽ không đủ điều kiện. Đây là cách các thuộc tính hoạt động:
numbOfBullets
- xác định khẩu súng của bạn chứa bao nhiêu viên đạn.Giá trị ban đầu và tối thiểu
numbOfBullets
là 1. Mỗi viên đạn bổ sung có giá 1 điểm với tối đa là 16 viên đạn với 15 điểm đã bỏ ra.reloadSpeed
- xác định số lần quay mà tay súng của bạn cần nạp lại súng sau khi hết đạn.Giá trị cơ bản và tối đa là 4 với mức tối thiểu là 1. Giảm thuộc tính này đi 1 điểm 2 điểm.
shotsPerTurn
- xác định số lần tay súng của bạn có thể bắn trong một lượt.Giá trị cơ bản và tối thiểu là 1. Mỗi lần tăng thêm 1 điểm, bạn có thể có tối đa 6 bức ảnh mỗi vòng với 15 điểm chi tiêu. Tăng thuộc tính này ở trên
numbOfBullets
là phản tác dụng vì bạn không thể bắn nhiều viên đạn hơn thì súng của bạn có thể giữ được.moveSpeed
- xác định có bao nhiêu khoảng trống mà tay súng của bạn có thể chạy trong một lượt.Giá trị cơ bản và tối thiểu là 1. Mỗi lần tăng thêm 1 chi phí 3 điểm với tối đa 6 tốc độ với 15 điểm chi tiêu. Tay súng có thể chạy sang trái hoặc phải mỗi lượt tối đa tốc độ di chuyển của mình. Anh ta cũng có thể đứng yên mà cho anh ta một phần thưởng (nhiều hơn về điều này sau).
Hàm ví dụ ở trên có 6 điểm chi cho đạn, 6 điểm dành cho tốc độ tải lại và 3 điểm dành cho chuyển động.
Chức năng chính
function main(bulletsLeft, yourShots, enemyShots, yourMovement, enemyMovement) {
var shots = [];
shots.push(Math.floor((Math.random() * 24) + 1));
var move = yourMovement[yourMovement.length - 1] + 2
var play = [];
play.shots = shots;
play.move = move;
play.reload = false;
return play;
}
Thông số:
bulletsLeft
, số lượng đạn còn lại trong súng của bạnyourShots
, đây là một loạt các mảng của tất cả các vị trí trong quá khứ mà tay súng của bạn đã bắn vào.Ví dụ cho một tay súng có thể bắn 1 viên đạn mỗi vòng:
[[12],[4],[22],...]
Ví dụ cho một tay súng có thể bắn 3 viên đạn mỗi vòng:
[[12,13,14],[11,15,16],[9,14],...]
enemyShots
- giống như trên nhưng đối với kẻ thù của bạnyourMovement
- một mảng của tất cả các vị trí chuyển động trong quá khứ của bạnenemyMovement
, giống như trên nhưng đối với kẻ thù của bạn
Những gì bạn cần trả lại:
Bạn được yêu cầu trả về một biến có 3 thuộc tính:
shots
- một dãy số xác định không gian / s mà tay súng của bạn sẽ bắn vàomove
- một số duy nhất xác định không gian mà tay súng của bạn sẽ cố gắng di chuyển đếnreload
- một giá trị đúng / sai mà bạn có thể khiến tay súng của mình tải lại
Các cuộc đấu tay đôi
Cuộc thi diễn ra sau vòng 1 so với 1 hệ thống. Mỗi tay súng có 50 viên đạn chống lại mọi tay súng khác. Một vòng đấu kéo dài cho đến khi ai đó bị trúng đạn hoặc cho đến khi 66 lượt đi qua (một lượt là khi cả hai người chơi đã bắn).
Tay súng có thể kiếm được 2 điểm bằng cách giết chết đối thủ của mình, 1 điểm nếu cả hai đều chết trong cùng một lượt hoặc 0 điểm nếu đạt đến giới hạn 66 lượt. Trường chụp có chiều rộng 24 không gian (bao gồm 1-24). Để đánh một người chơi và giành chiến thắng trong một vòng, bạn cần phải bắn vào cùng một không gian như anh ta hiện đang đứng.
Dưới đây là hướng dẫn từng bước về cách thức đấu tay đôi. Điều này cũng bao gồm tất cả các lệnh không hợp lệ và các quy tắc đặc biệt:
- Khi bắt đầu mỗi trận đấu, cả hai người chơi được đưa lên vũ trụ 12 và súng lục ổ quay của họ được nạp đầy đủ
- Chức năng chính được gọi và tay súng thực hiện lệnh di chuyển đầu tiên của họ và chọn nơi họ muốn bắn
- Đầu tiên các tay súng di chuyển đến vị trí mới của họ. Nếu bất kỳ đầu vào không hợp lệ nào được thực hiện tại lệnh di chuyển (vị trí thấp hơn 1 hoặc cao hơn 24 hoặc chúng di chuyển nhiều khoảng trống hơn thì chúng cũng được phép) chúng vẫn ở cùng một vị trí.
- Lần tải lại tiếp theo được kiểm tra, nếu bạn hết đạn trong lượt trước hoặc bạn gọi là tự tải lại thì tay súng của bạn sẽ đi vào chu kỳ tải lại. Anh ta đang tải lại nhiều lượt như bạn đặt
reloadSpeed
giá trị của mình . Nếu bạn quyết định đứng yên (trả lại số nguyên không gian giống như bạn đứng trước hoặc chỉ trả về giá trị không hợp lệ), bạn tải lại bộ đếm đi xuống trong 2 lượt thay vì một. - Bây giờ hãy kiểm tra giá trị bắn của bạn, mỗi lượt bạn có thể nhập bao nhiêu vị trí bắn tùy thích, chúng sẽ luôn bị cắt theo số lượng hợp lệ thực tế được xác định bởi: Số lần bắn mỗi lượt và số lượng đạn trong khẩu súng lục ổ quay của bạn ( cái nào thấp hơn).
shotsPerTurn
Giá trị của bạn tăng thêm 1 nếu bạn quyết định đứng yên trong lượt này, vì vậy bạn có thể thực hiện thêm một cú đánh nếu bạn quyết định đứng yên. Nếu bạn đang trong chu kỳ tải lại, bạn có 0 bức ảnh. Bây giờ đến chụp thực tế, có 2 cách này có thể đi xuống. Nếu cả hai tay súng có cùng một chỉ số di chuyển thì cả hai đều bắn cùng một lúc và cả hai có thể giết nhau cùng một lúc. Trong trường hợp chúng có các chỉ số di chuyển khác nhau, bot có chỉ số di chuyển cao hơn sẽ bắt đầu bắn trước và nếu anh ta giết được đối thủ của mình, anh ta sẽ thắng vòng này. Nếu tay súng có thể bắn một hoặc nhiều viên đạn trong một vòng thì nó sẽ tuân theo các quy tắc như trên ngoại trừ trong nhiều chu kỳ như một ví dụ: Hãy nói rằng bot1 có 3 viên đạn và nhanh hơn và bot 2 có 2 viên đạn thì nó sẽ như thế này :
Bot1 shoots, Bot2 shoots cycle 1 Bot1 shoots, Bot2 shoots cycle 2 Bot1 shoots cycle 3
Điều này sẽ trông giống nhau nếu chúng có cùng tốc độ di chuyển mà nếu bây giờ Bot1 tấn công Bot2 trong cùng chu kỳ thì Bot2 cũng có thể tấn công Bot1 và đó sẽ là một trận hòa.
QUY TẮC
Đầu tiên tôi đang sao chép một số quy tắc từ mục Sở thích của Calvin cũng áp dụng ở đây.
Khi khai báo một biến JavaScript mới, bạn phải sử dụng từ khóa var. Điều này là do một biến được khai báo không có var trở thành toàn cục thay vì cục bộ, do đó sẽ dễ dàng vô tình (hoặc cố ý) gây rối với bộ điều khiển hoặc giao tiếp tự do với những người chơi khác. Rõ ràng là bạn không cố gắng gian lận.
Khi khai báo các hàm, tốt nhất là sử dụng từ khóa var, nghĩa là sử dụng var f = function(...) {...}
thay vì function f(...) {...}.
tôi không hoàn toàn chắc chắn tại sao, nhưng đôi khi nó xuất hiện để tạo sự khác biệt.
Trong mã của bạn, bạn không thể ...
- cố gắng truy cập hoặc sửa đổi bộ điều khiển hoặc mã của người chơi khác.
- cố gắng sửa đổi bất cứ điều gì được tích hợp vào JavaScript.
- thực hiện các truy vấn web.
- làm những việc độc hại khác.
Quy tắc bổ sung của tôi:
- Người dùng có thể tạo nhiều tay súng như họ muốn và thay đổi chức năng của họ trong bất kỳ khoảng thời gian nào
- Tôi sẽ xóa bất kỳ mục nào khỏi trò chơi mất quá nhiều thời gian hoặc cố gắng gian lận theo bất kỳ cách nào tôi thấy phù hợp
- Tên của các thuộc tính mà hàm của bạn cần trả về phải giống như trong các ví dụ có cùng cấu trúc!
Câu trả lời của bạn phải ở định dạng này, hàm đầu tiên là hàm thuộc tính và hàm thứ hai là hàm logic. Lưu ý rằng tôi đã sử dụng dấu chấm than bởi vì nếu bạn chỉ tạo các dòng mới giữa các khối mã, trình phân tích cú pháp sẽ không thấy hai khối mã khác nhau, do đó bạn phải sử dụng bất kỳ ký hiệu nào (chỉ sử dụng dấu chấm than) để phân tách chúng:
var bot = {
name: "testBot",
numbOfBullets: 7,
reloadSpeed: 1,
shotsPerTurn: 1,
moveSpeed: 2
}
return bot
var shots = []
var testBot_moveUp = true
if(Math.random() * 2 > 1)
testBot_moveUp = false
shots.push(Math.floor((Math.random() * 24) + 1))
var move = 0
if (testBot_moveUp)
move = yourMovement[yourMovement.length - 1] + 2
else
move = yourMovement[yourMovement.length - 1] - 2
move = 12
var play = []
play.shots = shots
play.move = move
play.reload = false
return play
Và đây là bộ điều khiển: ĐIỀU KHIỂN TRÒ CHƠI . Chỉ cần mở liên kết và đợi các bot tải, sau đó chọn cái nào bạn muốn trong cuộc chiến (có thể là tất cả) và nhấn nút bắt đầu.
Tôi cũng đưa vào một testbot như câu trả lời của mình sẽ cạnh tranh, nó cũng là một ví dụ về cách cấu trúc của câu trả lời sẽ như thế nào. Lưu ý, nếu bạn mắc một lỗi nhỏ và chỉnh sửa câu trả lời, thuật toán stackexchanges của bạn có thể không nhận được ngay và trang web mà bộ điều khiển sử dụng được tạo bởi stackexchange sẽ không được cập nhật (nhưng sau này hoặc nếu bạn thực hiện các thay đổi lớn hơn mà tôi đề xuất làm, chỉ cần thêm một số văn bản ở cuối). Đây là trang web: codelink
<!---->
để phân tách các codeblocks "vô hình" (không có !
).