আসুন একটি ট্যাঙ্ক যুদ্ধ আছে!
আংশিকভাবে লেজারদের সাথে তাদের ধ্বংস করুন দ্বারা অনুপ্রাণিত
উদ্দেশ্য
আপনার কাজটি একটি ট্যাঙ্ক নিয়ন্ত্রণ করা। 2D রণক্ষেত্রে ঘুরুন এবং অন্যান্য ট্যাঙ্ক এবং প্রতিবন্ধকতাগুলি গুলি করুন। সর্বশেষ ট্যাঙ্কে দাঁড়িয়ে বিজয়ী হবেন!
মানচিত্র বিন্যাস
আপনার ট্যাংক একটি উপর ভিত্তি করে একটি 2D ক্ষেত্রের উপর হতে হবে n
দ্বারা n
ইউনিট বর্গের গ্রিড। n
জমা দেওয়ার সংখ্যার উপর ভিত্তি করে আমি সিদ্ধান্ত নেব । প্রতিটি স্কোয়ারে একটির মধ্যে একটি থাকতে পারে:
- একটি চৌবাচ্চা
- একটি গাছ
- একটি শিলা
- একটি প্রাচীর
- কিছু না
সমস্ত প্রতিবন্ধকতা এবং ট্যাঙ্কগুলি তাদের স্থান পুরোপুরি পূরণ করে এবং তারা এমন সমস্ত শট ব্লক করে যা তাদের আরও ক্ষতিকারক জিনিসগুলি থেকে নিচে আঘাত করে।
এখানে #
= ট্যাঙ্ক সহ একটি ক্ষেত্রের উদাহরণ ; 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 দিয়ে শুরু হয় । একটি ট্যাঙ্কের প্রতিটি শট life
দূরত্বের ভিত্তিতে 20-30 হ্রাস করবে । এটি delta_life=-30+(shot_distance*10/diagonal_map_length)
(যেখানে diagonal_map_length
রয়েছে (n-1)*sqrt(2)
) দিয়ে গণনা করা যায় । অতিরিক্তভাবে, প্রতিটি ট্যাঙ্ক life
প্রতি টার্নে 1 টি পুনরায় জেনারেট করে।
পালা
কয়েকটি রাউন্ড চালানো হবে (একবার জমা দেওয়ার পরে আমি সিদ্ধান্ত নেব)। প্রতিটি রাউন্ডের শুরুতে, এলোমেলোভাবে একটি মানচিত্র তৈরি করা হবে এবং এলোমেলোভাবে ফাঁকা জায়গায় ট্যাঙ্কগুলি স্থাপন করা হবে। প্রতিটি রাউন্ড চলাকালীন, প্রতিটি ট্যাঙ্ককে যে কোনও স্বেচ্ছাচারিত ক্রমে একটি পালা দেওয়া হবে। প্রতিটি ট্যাঙ্কে একটি পালা দেওয়ার পরে, একই ক্রমে তাদের আবার পালা দেওয়া হবে। রাউন্ডটি অব্যাহত থাকে যতক্ষণ না কেবল একটি মাত্র ট্যাঙ্ক অবশিষ্ট থাকে। এই ট্যাঙ্কটি বিজয়ী হবে এবং তারা 1 পয়েন্ট পাবে। খেলাটি পরবর্তী রাউন্ডে চলে যাবে।
সমস্ত রাউন্ড একবার চালানো হয়ে গেলে, আমি এই প্রশ্নে স্কোরগুলি পোস্ট করব।
ট্যাঙ্কের পালা চলাকালীন, এটি নিম্নলিখিতগুলির মধ্যে একটি করতে পারে
- অনুভূমিকভাবে বা উল্লম্বভাবে একক দিকে 3 স্পেসে সরান। যদি ট্যাঙ্কটি কোনও বাধা বা অন্য কোনও ট্যাঙ্কের দ্বারা অবরুদ্ধ থাকে তবে বাধা বা ট্যাঙ্কের মধ্যে দিয়ে না গিয়ে এটিকে যতদূর সম্ভব সরানো হবে।
- কিছু দিকের দিকে অঙ্কুর, ডিগ্রিগুলিতে একটি ভাসমান পয়েন্ট কোণ দ্বারা প্রতিনিধিত্ব করা। আপনার ট্যাঙ্কের স্থানীয় স্থানের এক্স-অক্ষগুলি (অনুভূমিকভাবে বাম থেকে ডানদিকে, পূর্ব দিকে বা পূর্ব দিকে
TurnAction.Direction.EAST
) 0 ডিগ্রি এবং কোণগুলি ঘড়ির কাঁটার বিপরীতে বাড়িয়ে তোলে। শটগুলি সঠিক নয়, এবং শটের আসল কোণটি আপনি পছন্দ করেন এমন কোণ থেকে 5 ডিগ্রি বেশি বা কম হতে পারে। - কিছু করনা.
টার্নগুলি সময়ের মধ্যে সীমাবদ্ধ নয় তবে এর অর্থ এই নয় যে আপনি ইচ্ছাকৃতভাবে সমস্ত কিছু আটকে দেওয়ার জন্য সময় নষ্ট করতে পারেন।
জমা / প্রোটোকল
জমা দেওয়া প্রতিটি প্রোগ্রাম মাঠে একটি ট্যাঙ্ক নিয়ন্ত্রণ করবে। কন্ট্রোল প্রোগ্রাম জাভাতে রয়েছে, সুতরাং আপনার প্রোগ্রামগুলি আপাতত জাভাতে থাকা উচিত (আমি সম্ভবত অন্য ভাষার জন্য একটি মোড়ক লিখব, অথবা আপনি নিজের লেখা লিখতে পারেন)।
আপনার প্রোগ্রামগুলি 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
শ্রেণী (অবজেক্টের একটি 2D অ্যারে রয়েছে 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 ।
জাভাডোকগুলিতে আরও তথ্য পাওয়া যাবে, নীচের অংশটি দেখুন।
সমস্ত (সর্বজনীন এপিআই) শ্রেণি প্যাকেজের অধীনে zove.ppcg.tankwar
।
নিয়ন্ত্রণ প্রোগ্রাম
কন্ট্রোল প্রোগ্রামের সম্পূর্ণ উত্স এবং জাভাদোকগুলি আমার গিটহাব রেপোতে পাওয়া যাবে: https://github.com/Hungary-Dude/TankWarControl
আপনি যদি বাগ দেখতে পান বা উন্নতি চান তবে টানুন অনুরোধগুলি এবং / অথবা মন্তব্য প্রেরণে নির্দ্বিধায় যোগাযোগ করুন।
আমি দুটি নমুনা ট্যাঙ্ক প্রোগ্রাম লিখেছি, RandomMoveTank
এবং RandomShootTank
(নামটি সব বলে)
আপনার ট্যাঙ্ক চালানোর জন্য, আপনার সম্পূর্ণ যোগ্যতাযুক্ত (প্যাকেজের নাম + শ্রেণীর নাম) ট্যাঙ্ক শ্রেণিতে tanks.list
(প্রতি লাইনে এক শ্রেণি) যুক্ত করুন, প্রয়োজনীয় ক্ষেত্রে সেটিংস সম্পাদনা করুন zove.ppcg.tankwar.Control
(দেরি করুন, ক্ষেত্রের কোনও জিইউআই প্রতিনিধিত্ব দেখাবেন কিনা ইত্যাদি), এবং চালান zove.ppcg.tankwar.Control
। নিশ্চিত করুন যে তালিকায় কমপক্ষে 2 টি ট্যাঙ্ক রয়েছে বা ফলাফল অপরিজ্ঞাত। (প্রয়োজনে স্যাম্পল ট্যাঙ্ক ব্যবহার করুন)।
আপনার প্রোগ্রামগুলি এই মেশিনে এই নিয়ন্ত্রণ প্রোগ্রামের অধীনে চালিত হবে। আমি উত্সটির লিঙ্কটি একবার লিখে ফেললে তা অন্তর্ভুক্ত করব। উত্স এডিট প্রস্তাব নির্দ্বিধায়।
বিধি
- আপনার সাবমিশনগুলি অবশ্যই উপরের নির্দেশিকাগুলি অনুসরণ করবে
- আপনার প্রোগ্রামগুলি ফাইল সিস্টেম, নেটওয়ার্ক অ্যাক্সেস করতে পারে না বা কোনওভাবেই আমার মেশিনকে আক্রমণ করার চেষ্টা করতে পারে
- আপনার প্রোগ্রামগুলি প্রতারণার জন্য আমার নিয়ন্ত্রণ প্রোগ্রামটি কাজে লাগানোর চেষ্টা করতে পারে না
- কোনও ট্রোলিং হয় না (যেমন ইচ্ছাকৃতভাবে সমস্ত কিছু হ্যাং করার জন্য আপনার প্রোগ্রামকে নষ্ট করা)
- আপনার একাধিক জমা থাকতে পারে
- জমা দিয়ে সৃজনশীল হওয়ার চেষ্টা করুন!
- আমি নির্ধারিতভাবে প্রোগ্রামগুলিকে অনুমতি বা না দেওয়ার অধিকার সংরক্ষণ করি
শুভকামনা!
আপডেট: ওয়াল টেলিপোর্টেশন বাগটি ঠিক করার পরে এবং পুনর্জন্ম বাস্তবায়নের পরে, আমি বর্তমান জমাগুলি 100 রাউন্ডের সাথে চালিয়েছিBattlefield.FIELD_SIZE = 30
আপডেট 2: আমি গ্রোভির সাথে কিছুটা বোকা বানানোর পরে রানট্যাঙ্ক নতুন জমাটি যুক্ত করেছি ...
আপডেট ফলাফল:
+-----------------+----+
| 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
?