มาสงครามรถถังกันเถอะ!
แรงบันดาลใจบางส่วนจากDestroy พวกเขาด้วย Lazers
วัตถุประสงค์
งานของคุณคือการควบคุมรถถัง ย้ายไปรอบ ๆ และยิงรถถังและอุปสรรคอื่น ๆ ในสนามรบ 2D รถถังสุดท้ายจะเป็นผู้ชนะ!
รูปแบบแผนที่
รถถังของคุณจะอยู่ในสนาม 2D บนพื้นฐานn
จากn
ตารางของสี่เหลี่ยมหน่วย ฉันจะตัดสินใจว่าอะไรn
จะขึ้นอยู่กับจำนวนของการส่ง แต่ละตารางสามารถมีเพียงหนึ่งใน:
- รถถัง
- ต้นไม้หนึ่งต้น
- ร็อค
- ผนัง
- ไม่มีอะไร
อุปสรรคและรถถังทั้งหมดเติมเต็มช่องว่างของพวกเขาอย่างสมบูรณ์และพวกเขาปิดกั้นทุกช็อตที่โดนพวกมันจากการทำลายสิ่งต่าง ๆ ลงไปอีก
นี่คือตัวอย่างของฟิลด์ที่มี#
= tank; T
= ต้นไม้; R
= หิน W
= ผนัง; .
= ไม่มีอะไรกับn
= 10
.....#....
..T....R..
WWW...WWWW
W......T..
T...R...Ww
W...W.....
W....W...T
WWWWWW...R
W.........
WWWWWWRT..
พิกัดอยู่ในรูปแบบx, y
ที่x
เพิ่มจากซ้ายไปขวาและy
เพิ่มจากล่างขึ้นบน 0, 0
พื้นที่ด้านล่างซ้ายมีการประสานงาน แต่ละถังอาจเคลื่อนที่ไปยังพื้นที่ว่างและยิงไปในทิศทางใดก็ได้
แผนที่พลวัต
รถถังของคุณไม่เพียงแค่ต้องยิงรถถังอื่น! ถ้ามันยิงบางอย่างบนแผนที่สิ่งต่าง ๆ ก็สามารถเกิดขึ้นได้
- หากกำแพงถูกยิงมันจะถูกทำลายหลังจากยิงไปหลายนัดตั้งแต่ 1 ถึง 4
- ถ้าต้นไม้ถูกยิงมันจะถูกทำลายทันที
- หากหินถูกยิงที่การยิงจะผ่านมันและสร้างความเสียหายต่อสิ่งที่มันฮิต
เมื่อมีบางสิ่งถูกทำลายมันจะไม่อยู่บนแผนที่อีกต่อไป (จะถูกแทนที่ด้วยไม่มีอะไร) หากการยิงทำลายสิ่งกีดขวางมันจะถูกบล็อกและจะไม่สร้างความเสียหายใด ๆ เพิ่มเติมตามเส้นทางของมัน
พลศาสตร์รถถัง
แต่ละถังเริ่มต้นด้วยlife
= 100 แต่ละนัดที่รถถังจะลดลง 20-30 life
ตามระยะทาง นี้สามารถคำนวณได้ด้วยdelta_life=-30+(shot_distance*10/diagonal_map_length)
(ที่diagonal_map_length
เป็น(n-1)*sqrt(2)
) นอกจากนี้แต่ละรถถังจะสร้าง 1 life
เทิร์นละครั้ง
ย้อนกลับ
รอบจำนวนหนึ่งจะถูกเรียกใช้ (ฉันจะตัดสินใจเมื่อมีการส่ง) ในตอนต้นของทุกรอบแผนที่จะสร้างแบบสุ่มและรถถังจะถูกวางไว้ในตำแหน่งที่ว่างเปล่าแบบสุ่ม ในทุกรอบรถถังแต่ละคันจะได้รับเทิร์นตามลำดับโดยพลการใด ๆ หลังจากรถถังทุกคันได้รับเทิร์นพวกเขาจะได้รับผลัดกันในลำดับเดียวกัน รอบจะดำเนินต่อไปจนกว่าจะมีเพียงหนึ่งถังที่เหลือ รถถังนั้นจะเป็นผู้ชนะและพวกเขาจะได้รับ 1 คะแนน เกมจะดำเนินต่อไปในรอบต่อไป
เมื่อรอบหมดแล้วฉันจะโพสต์คะแนนในคำถามนี้
ในช่วงเทิร์นของรถถังมันอาจทำอย่างใดอย่างหนึ่งดังต่อไปนี้
- เลื่อนได้ถึง 3 ช่องว่างในทิศทางเดียวไม่ว่าจะเป็นแนวนอนหรือแนวตั้ง หากรถถังถูกกีดขวางโดยสิ่งกีดขวางหรือรถถังอื่นมันจะถูกเคลื่อนย้ายไปให้ไกลที่สุดโดยไม่ต้องผ่านสิ่งกีดขวางหรือรถถัง
- ถ่ายภาพในบางทิศทางโดยมีจุดลอยตัวเป็นองศา แกน x ของพื้นที่ท้องถิ่นของรถถังของคุณ (จากซ้ายไปขวาในแนวนอน, ตะวันออกหรือ
TurnAction.Direction.EAST
) คือ 0deg และมุมเพิ่มขึ้นทวนเข็มนาฬิกา ภาพไม่ถูกต้องและมุมจริงของภาพอาจสูงกว่าหรือน้อยกว่ามุมที่คุณเลือก 5 องศา - ไม่ทำอะไร.
การเปลี่ยนนั้นไม่ จำกัด ในเวลา แต่นี่ไม่ได้หมายความว่าคุณสามารถเสียเวลาในการแขวนทุกอย่าง
การส่ง / พิธีสาร
แต่ละโปรแกรมที่ส่งจะควบคุมรถถังหนึ่งคันบนสนาม โปรแกรมควบคุมอยู่ใน Java ดังนั้นโปรแกรมของคุณต้องอยู่ใน Java ตอนนี้ (ฉันอาจจะเขียน wrapper สำหรับภาษาอื่น ๆ ในบางจุดหรือคุณอาจเขียนของคุณเอง)
โปรแกรมของคุณจะใช้Tank
อินเทอร์เฟซซึ่งมีวิธีการดังต่อไปนี้:
public interface Tank {
// Called when the tank is placed on the battlefield.
public void onSpawn(Battlefield field, MapPoint position);
// Called to get an action for the tank on each turn.
public TurnAction onTurn(Battlefield field, MapPoint position, float health);
// Called with feedback after a turn is executed.
// newPosition and hit will be populated if applicable.
public void turnFeedback(MapPoint newPosition, FieldObjectType hit);
// Called when the tank is destroyed, either by another tank,
// or because the tank won. The won parameter indicates this.
public void onDestroyed(Battlefield field, boolean won);
// Return a unique name for your tank here.
public String getName();
}
Battlefield
ชั้นมีอาร์เรย์ 2 มิติของวัตถุ ( Battlefield.FIELD_SIZE
โดยBattlefield.FIELD_SIZE
) ซึ่งหมายถึงสิ่งที่อยู่ในสนามรบ Battlefield.getObjectTypeAt(...)
จะให้FieldObjectType
สำหรับวัตถุที่ระบุพิกัด (หนึ่งFieldObjectType.ROCK
, FieldObjectType.TREE
, FieldObjectType.TANK
, FieldObjectType.WALL
หรือFieldObjectType.NOTHING
) หากคุณพยายามทำให้วัตถุอยู่นอกขอบเขตของแผนที่ (พิกัด <0 หรือ> = Battlefield.FIELD_SIZE
) IllegalArgumentException
จะถูกส่งออกไป
MapPoint
เป็นคลาสสำหรับระบุจุดต่างๆบนแผนที่ ใช้MapPoint.getX()
และMapPoint.getY()
เพื่อเข้าถึงพิกัด
แก้ไข:บางวิธียูทิลิตี้ได้รับการเพิ่ม: MapPoint.distanceTo(MapPoint)
, MapPoint.angleBetween(MapPoint)
, Battlefield.find(FieldObjectType)
และTurnAction.createShootActionRadians(double)
แนะนำโดยWasmoo
ข้อมูลเพิ่มเติมสามารถพบได้ใน javadocs ดูส่วนด้านล่าง
ทั้งหมด (API สาธารณะ) zove.ppcg.tankwar
เรียนอยู่ภายใต้แพคเกจ
โปรแกรมควบคุม
แหล่งที่มาเต็มรูปแบบและ javadocs ของโปรแกรมควบคุมและถัง API สามารถพบได้บน repo GitHub ของฉัน: https://github.com/Hungary-Dude/TankWarControl
อย่าลังเลที่จะส่งคำขอดึงและ / หรือแสดงความคิดเห็นหากคุณเห็นข้อผิดพลาดหรือต้องการการปรับปรุง
ฉันได้เขียนโปรแกรมตัวอย่างสองโปรแกรมแล้วRandomMoveTank
และRandomShootTank
(ชื่อบอกมันทั้งหมด)
ในการใช้งานรถถังของคุณให้เพิ่มคลาสที่มีคุณสมบัติครบถ้วน (ชื่อแพ็คเกจ + ชื่อคลาส) ไปยังtanks.list
(หนึ่งคลาสต่อบรรทัด) แก้ไขการตั้งค่าตามที่จำเป็นในzove.ppcg.tankwar.Control
(เปิดการหน่วงเวลาไม่ว่าจะแสดงการเป็นตัวแทน GUI ของฟิลด์หรือไม่) และเรียกใช้zove.ppcg.tankwar.Control
และเรียกใช้ ตรวจสอบให้แน่ใจว่ามีรถถังอย่างน้อย 2 คันในรายการหรือผลลัพธ์ไม่ได้กำหนด (ใช้ถังตัวอย่างถ้าจำเป็น)
โปรแกรมของคุณจะทำงานบนเครื่องของฉันภายใต้โปรแกรมควบคุมนี้ ฉันจะรวมลิงก์ไปยังแหล่งข้อมูลเมื่อฉันเขียน อย่าลังเลที่จะแนะนำการแก้ไขแหล่งที่มา
กฎระเบียบ
- ข้อมูลที่คุณส่งจะต้องเป็นไปตามหลักเกณฑ์ด้านบน
- โปรแกรมของคุณไม่สามารถเข้าถึงระบบไฟล์เครือข่ายหรือพยายามโจมตีเครื่องของฉันในทางใดทางหนึ่ง
- โปรแกรมของคุณอาจไม่พยายามใช้ประโยชน์จากโปรแกรมควบคุมของฉันในการโกง
- ไม่มีการหมุนรอบ (เช่นทำให้โปรแกรมของคุณเสียเวลาในการแขวนทุกอย่าง)
- คุณอาจมีมากกว่าหนึ่งการส่ง
- พยายามที่จะสร้างสรรค์ด้วยการส่ง!
- ฉันขอสงวนสิทธิ์ในการอนุญาตหรือไม่อนุญาตโปรแกรมโดยพลการ
โชคดี!
UPDATE:หลังจากแก้ไขข้อผิดพลาดทางเทเลโฟโต้และติดตั้งระบบฟื้นฟูฉันได้ทำการส่งข้อมูลปัจจุบัน 100 รอบด้วยBattlefield.FIELD_SIZE = 30
อัปเดต 2:ฉันเพิ่มการส่งใหม่ RunTank หลังจากหลอก Groovy สักหน่อย ...
อัปเดตผลลัพธ์:
+-----------------+----+
| RandomMoveTank | 0 |
| RandomShootTank | 0 |
| Bouncing Tank | 4 |
| Richard-A Tank | 9 |
| Shoot Closest | 19 |
| HunterKiller 2 | 22 |
| RunTank | 23 |
| Dodge Tank | 24 |
+-----------------+----+
รถถังปัจจุบันสร้างใหม่ 1 ชีวิตต่อเทิร์น ที่ควรจะเพิ่มขึ้น?
MapPoint
'sx
และy
floats
? พวกเขาไม่ควรจะเป็นints
?