นี่คือความท้าทาย King of the Hill ในการแข่งรอบ มันเป็นการต่อสู้เพื่อค้นหามือปืนที่เก่งที่สุดของตะวันตก!
เพื่อให้สามารถแข่งขันในการแข่งขันครั้งนี้คุณต้องทำสองฟังก์ชั่น คนแรกกำหนดคุณลักษณะของมือปืนของคุณและที่สองคือฟังก์ชั่นลอจิกหลักสำหรับมือปืน
ฟังก์ชั่นแอตทริบิวต์
function () {
var bot = {
name: "testBot",
numbOfBullets: 7,
reloadSpeed: 1,
shotsPerTurn: 1,
moveSpeed: 2
}
return bot
}
ฟังก์ชันแอททริบิวต์ประกอบด้วยตัวแปร 5 ตัวที่คุณจะต้องตั้งค่าตามกฎบางอย่าง (ยกเว้นname
ว่าจะเป็นสตริงใดก็ได้) คุณต้องใช้คะแนนรวม 15 แต้มกับมือปืนของคุณ - มือปืนที่ไม่ได้ใช้คะแนนเต็ม 15 คะแนนจะไม่มีสิทธิ์ นี่คือการทำงานของคุณลักษณะ:
numbOfBullets
- กำหนดจำนวนกระสุนปืนของคุณค่าเริ่มต้นและต่ำสุด
numbOfBullets
คือ 1 แต่ละสัญลักษณ์แสดงหัวข้อย่อยค่าใช้จ่ายเพิ่มเติม 1 จุดที่มีสูงสุดเป็น 16 กระสุนที่มี 15 คะแนนการใช้จ่ายreloadSpeed
- กำหนดจำนวนนักแม่นปืนของคุณที่จะต้องบรรจุปืนใหม่หลังจากที่กระสุนหมดฐานและค่าสูงสุดคือ 4 โดยมีค่าต่ำสุดคือ 1 การลดคุณสมบัตินี้ 1 ค่าใช้จ่าย 2 คะแนน
shotsPerTurn
- กำหนดว่ามือปืนของคุณสามารถยิงได้กี่ครั้งในคราวเดียวฐานและค่าต่ำสุดคือ 1 แต่ละครั้งเพิ่มขึ้น 1 ค่าใช้จ่าย 3 คะแนนเพื่อให้คุณได้สูงสุด 6 นัดต่อรอบโดยใช้ 15 คะแนน การเพิ่มแอททริบิวต์ด้านบน
numbOfBullets
นี้เป็นผลสำเร็จเนื่องจากคุณไม่สามารถยิงกระสุนได้มากกว่านี้แล้วปืนของคุณก็สามารถถือได้moveSpeed
- กำหนดจำนวนช่องว่างที่มือปืนของคุณสามารถวิ่งได้ในคราวเดียวค่าฐานและค่าต่ำสุดคือ 1 แต่ละค่าใช้จ่ายเพิ่มขึ้น 1 ค่า 3 คะแนนโดยมีความเร็วสูงสุด 6 ระดับใช้เวลา 15 คะแนน มือปืนสามารถวิ่งได้ทั้งทางซ้ายและขวาทุกครั้งที่ความเร็วเคลื่อนที่สูงสุด เขายังสามารถยืนนิ่งซึ่งให้โบนัสเขา (เพิ่มเติมในภายหลังนี้)
ตัวอย่างฟังก์ชั่นด้านบนมี 6 คะแนนที่ใช้กับกระสุน, 6 คะแนนใช้กับความเร็วในการโหลดและ 3 คะแนนสำหรับการเคลื่อนไหว
ฟังก์ชั่นหลัก
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;
}
พารามิเตอร์:
bulletsLeft
จำนวนกระสุนที่เหลือในปืนของคุณyourShots
นี่คืออาร์เรย์ของอาร์เรย์ของตำแหน่งที่ผ่านมาทั้งหมดที่มือปืนของคุณยิงได้ตัวอย่างมือปืนที่สามารถยิงได้ 1 ลูกต่อรอบ:
[[12],[4],[22],...]
ตัวอย่างมือปืนที่สามารถยิง 3 นัดต่อรอบ:
[[12,13,14],[11,15,16],[9,14],...]
enemyShots
- เหมือนข้างบน แต่สำหรับศัตรูของคุณyourMovement
- อาร์เรย์ของตำแหน่งการเคลื่อนไหวที่ผ่านมาทั้งหมดของคุณenemyMovement
เช่นเดียวกับข้างบน แต่สำหรับศัตรูของคุณ
สิ่งที่คุณต้องคืน:
คุณจะต้องส่งคืนตัวแปรซึ่งมี 3 คุณลักษณะ:
shots
- อาร์เรย์ของตัวเลขที่กำหนดว่ามือปืนของคุณจะยิงที่ว่าง / พื้นที่ใดmove
- หมายเลขเดียวที่กำหนดว่ามือปืนของคุณจะพยายามย้ายไปที่ใดreload
- มูลค่าจริง / เท็จที่คุณสามารถโหลดมือปืนของคุณได้
การดวล
การประกวดมีดังนี้โรบิน 1 รอบต่อ 1 ระบบ มือปืนแต่ละคนมี 50 รอบต่อมือปืนคนอื่น ๆ รอบจะดำเนินต่อไปจนกว่าจะมีใครถูกกระสุนนัดหนึ่งหรือจนกว่าจะถึง 66 ตาผ่าน
มือปืนสามารถได้รับ 2 คะแนนโดยการฆ่าฝ่ายตรงข้าม 1 คะแนนหากพวกเขาทั้งคู่ตายในเทิร์นเดียวกันหรือ 0 คะแนนหากพวกเขาถึง 66 เทิร์น จำกัด สนามถ่ายภาพมีความกว้าง 24 ช่อง (รวม 1-24 ช่อง) ในการตีผู้เล่นและชนะรอบคุณต้องยิงที่พื้นที่เดียวกับที่เขากำลังยืนอยู่
นี่คือคำแนะนำทีละขั้นตอนเกี่ยวกับการดวล นอกจากนี้ยังครอบคลุมถึงคำสั่งที่ไม่ถูกต้องและกฎพิเศษ:
- ในตอนเริ่มต้นของการดวลแต่ละครั้งผู้เล่นทั้งสองจะถูกวางในอวกาศ 12 และปืนพกของพวกเขานั้นเต็ม
- มีการเรียกฟังก์ชั่นหลักและมือปืนทำการสั่งย้ายครั้งแรกและเลือกตำแหน่งที่ต้องการถ่าย
- ครั้งแรกที่มือปืนย้ายไปที่ตำแหน่งใหม่ หากมีการป้อนข้อมูลที่ไม่ถูกต้องที่คำสั่งย้าย (ตำแหน่งต่ำกว่า 1 หรือสูงกว่าจากนั้น 24 หรือย้ายช่องว่างมากขึ้นพวกเขาจะได้รับอนุญาตด้วย) พวกเขาอยู่ในตำแหน่งเดียวกัน
- มีการตรวจสอบการโหลดครั้งถัดไปถ้าคุณหมดกระสุนก่อนหน้านี้หรือคุณเรียกว่าการรีโหลดด้วยตัวเองมือปืนของคุณจะเข้าสู่รอบการโหลดใหม่ เขาได้รับการบรรจุใหม่สำหรับผลัดกันมากที่สุดเท่าที่คุณตั้งค่าของคุณ
reloadSpeed
คุ้มค่า หากคุณตัดสินใจที่จะหยุดนิ่ง (คืนค่าจำนวนเต็มพื้นที่เดียวกับที่คุณยืนอยู่ก่อนหน้าหรือเพียงแค่คืนค่าที่ไม่ถูกต้อง) คุณโหลดตัวนับซ้ำลงไป 2 รอบแทนที่จะเป็นหนึ่ง - ตอนนี้มาตรวจสอบค่าการยิงของคุณทุกครั้งที่คุณสามารถเข้าไปยังสถานที่ถ่ายภาพได้มากเท่าที่คุณต้องการจะถูกตัดออกไปตามจำนวนที่ถูกต้องตามจริงซึ่งพิจารณาจาก: จำนวนนัดต่อรอบและจำนวนกระสุนในปืนพกของคุณ แล้วแต่จำนวนใดจะต่ำกว่า)
shotsPerTurn
มูลค่าของคุณจะเพิ่มขึ้น 1 หากคุณตัดสินใจที่จะหยุดนิ่งในเทิร์นนี้ดังนั้นคุณสามารถสร้างช็อตพิเศษหากคุณตัดสินใจที่จะหยุดนิ่ง หากคุณอยู่ในรอบการรีโหลดคุณมี 0 นัด ตอนนี้การถ่ายภาพจริงมาถึงแล้วมี 2 วิธีที่สิ่งนี้สามารถลดลงได้ หากมือปืนทั้งสองมีสถิติ movespeed เดียวกันจากนั้นพวกเขาทั้งสองยิงในเวลาเดียวกันและสามารถฆ่าซึ่งกันและกันในเวลาเดียวกันได้ ในกรณีที่พวกเขามีสถิติ movespeed ที่แตกต่างกันบอทที่มีค่า movespeed ที่สูงขึ้นจะเริ่มยิงก่อนและถ้าเขาฆ่าคู่ต่อสู้ของเขาเขาจะชนะในรอบนี้ หากมือปืนสามารถยิงกระสุนหนึ่งนัดหรือมากกว่าในรอบเดียวมันจะเป็นไปตามกฎเดียวกันกับข้างบนยกเว้นในรอบที่มากขึ้นตัวอย่างเช่นสมมติว่า bot1 มี 3 กระสุนและเร็วกว่าและบอ 2 มี 2 กระสุนมันจะเป็นเช่นนี้ :
Bot1 shoots, Bot2 shoots cycle 1 Bot1 shoots, Bot2 shoots cycle 2 Bot1 shoots cycle 3
นี่จะดูเหมือนกันถ้าพวกเขามี movespeed เหมือนกันเท่านั้นว่าถ้าตอนนี้ Bot1 กด Bot2 ในรอบเดียวกัน Bot2 ก็สามารถกด Bot1 ได้และมันจะเป็นเน็คไท
กฎ
ก่อนอื่นฉันกำลังคัดลอกกฎบางอย่างจากรายการงานอดิเรกของ Calvin ที่ใช้ที่นี่ด้วย
เมื่อประกาศตัวแปร JavaScript ใหม่คุณต้องใช้คำหลัก var นี่เป็นเพราะตัวแปรที่ประกาศโดยไม่มี var กลายเป็นโกลบอลแทนที่จะเป็นโลคัลดังนั้นจึงเป็นเรื่องง่ายที่จะเกิดความสับสน (หรือจงใจ) โดยไม่ตั้งใจกับคอนโทรลเลอร์หรือสื่อสารกับผู้เล่นอื่นอย่างอิสระ ต้องชัดเจนว่าคุณไม่ได้พยายามโกง
เมื่อประกาศฟังก์ชั่นมันเป็นการดีที่สุดที่จะใช้คำหลัก var เช่นกันเช่นใช้var f = function(...) {...}
แทนfunction f(...) {...}.
ฉันไม่แน่ใจว่าทำไม แต่บางครั้งมันก็สร้างความแตกต่าง
ในรหัสของคุณคุณอาจไม่ ...
- พยายามเข้าถึงหรือแก้ไขคอนโทรลเลอร์หรือรหัสของผู้เล่นอื่น
- พยายามแก้ไขสิ่งที่มีอยู่ใน JavaScript
- ทำแบบสอบถามเว็บ
- ทำสิ่งที่เป็นอันตรายเป็นอย่างอื่น
กฎเพิ่มเติมของฉัน:
- ผู้ใช้สามารถสร้างมือปืนได้มากเท่าที่ต้องการและเปลี่ยนฟังก์ชั่นในช่วงเวลาใดก็ได้
- ฉันจะลบรายการใด ๆ ออกจากเกมที่อาจใช้เวลานานเกินไปหรือพยายามโกงในลักษณะที่ฉันเห็นว่าเหมาะสม
- ชื่อของคุณสมบัติที่ฟังก์ชั่นของคุณจำเป็นต้องกลับมาจะต้องเหมือนกันในตัวอย่างที่มีโครงสร้างเดียวกัน!
คำตอบของคุณควรอยู่ในรูปแบบนี้ฟังก์ชันแรกคือฟังก์ชันแอ็ตทริบิวต์และอันดับที่สองเป็นฟังก์ชันตรรกะ โปรดสังเกตว่าฉันใช้เครื่องหมายอัศเจรีย์เพราะถ้าคุณสร้างบรรทัดใหม่ระหว่างโค้ดบล็อกตัวแยกวิเคราะห์จะไม่เห็นบล็อคโค้ดสองแบบดังนั้นคุณต้องใช้สัญลักษณ์ใด ๆ (แค่ใช้เครื่องหมายอัศเจรีย์) เพื่อแยกพวกเขา:
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
และนี่คือการควบคุม: การควบคุมเกม เพียงแค่เปิดลิงค์และรอให้บอทโหลดจากนั้นเลือกอันที่คุณต้องการในการต่อสู้ (อาจเป็นทั้งหมด) แล้วกดปุ่มเริ่ม
ฉันใส่ testbot เป็นคำตอบที่จะแข่งขันมันยังทำหน้าที่เป็นตัวอย่างว่าโครงสร้างของคำตอบควรเป็นอย่างไร โปรดทราบว่าหากคุณทำผิดพลาดเล็กน้อยและแก้ไขอัลกอริทึมสแต็กคำตอบของคุณอาจไม่สามารถรับได้ทันทีและไซต์ที่คอนโทรลเลอร์ใช้ซึ่งสร้างโดย Stackexchange นั้นไม่ได้รับการอัพเดต (แต่จะใหม่กว่าหรือหากคุณทำการเปลี่ยนแปลงครั้งใหญ่กว่า ทำเพียงเพิ่มข้อความที่ส่วนท้าย) นี่คือเว็บไซต์: codelink
<!---->
เพื่อแยก codeblocks "ล่องหน" (โดยไม่ต้อง!
)