Rocket Bots KOTH


11

บอทจรวด

ปีนี้คือปี 3024 ผู้คนขาดแคลนทรัพยากรที่จะเสี่ยงต่อสงครามมากเกินไปดังนั้นการต่อสู้จึงเปลี่ยนไปเป็นหุ่นยนต์ งานของคุณคือการสร้างบอทที่ไม่เหมือนใครจรวดของคุณจะถูกทำลายจากศัตรูของคุณและยิงการคุกคามที่เข้ามาทั้งหมด

เพลย์

บอท

การเล่นเกมเกิดขึ้นบนกริด 10x15 บอทของคุณอยู่นอกขอบด้านล่างและมีช่องสามช่องที่จุด 6,7 และ 8 ของตาราง คู่ต่อสู้ของคุณตั้งอยู่ที่ด้านบนของตารางโดยมีสามช่องตรงข้ามกับคุณ

จรวด

จากช่องเหล่านี้คุณสามารถยิงจรวดได้โดยสมมติว่าช่องนั้นไม่ถูกทำลาย จรวดประกอบด้วยรายการเส้นทางที่กำหนดให้เมื่อสร้างขึ้นและเมื่อยิงไปในทิศทางเหล่านี้จะไม่สามารถเปลี่ยนแปลงได้ จรวดจะหมุนไปด้านบนสุดของรายการและเคลื่อนที่ไปในทิศทางนั้น จรวดเคลื่อนที่พร้อมกัน หากจรวดทั้งสองจบลงในกระเบื้องเดียวกันพวกเขาทั้งสองจะระเบิด ถ้าจรวดหมดคำสั่งมันจะระเบิด หากจรวดหมดเชื้อเพลิงหลังจากผ่านไป 100 ครั้งมันจะระเบิด เมื่อจรวดระเบิดมันจะยังคงอยู่ในไทล์ 5 รอบทำให้เกิดจรวดอื่น ๆ ที่เคลื่อนที่ไปที่นั่นเพื่อระเบิดเช่นกัน

หมายเหตุ: เนื่องจากการเคลื่อนที่พร้อมกันทำให้จรวดสองลูกสามารถผ่านซึ่งกันและกันได้โดยไม่เกิดการระเบิดตราบใดที่พวกมันยังไม่จบเทิร์นในไทล์เดียวกัน

เป้าหมาย

เป้าหมายของการแข่งขันแต่ละครั้งคือการทำลายช่องของคู่ต่อสู้ในขณะที่รักษาชีวิตของคุณไว้ จรวดสามารถยิงได้จากช่องสดที่คุณมีและได้รับเส้นทางที่คุณกำหนดก่อนที่มันจะถูกยิง คุณยิงจรวดทุก ๆ เทิร์นที่ 2 หมายถึงจรวดจะเคลื่อนที่สองครั้งก่อนที่คุณจะยิงได้อีกหนึ่งครั้ง การดวลเป็นเวลา 200 รอบหรือจนกว่าจะหมดหนึ่งบ็อตสล็อตทั้งหมดจะถูกทำลาย

เกณฑ์การให้คะแนน

ในตอนท้ายของการแข่งขันคุณจะได้รับหนึ่งคะแนนสำหรับแต่ละสล็อตที่คุณมีอยู่และหนึ่งจุดสำหรับแต่ละคู่ต่อสู้ที่คุณทำลาย นี่หมายความว่ามันเป็นเกมที่ไม่มีผลรวมและจะมีการให้คะแนน 6 คะแนนในแต่ละนัด

โรบินกลมจะถูกเรียกใช้เพื่อให้บอทแต่ละคนหันหน้าไปทางบอทอีกครั้ง หากบอทใดใช้ RNG การแข่งขันแต่ละครั้งจะเป็น 1000 ดวลแทน

การดำเนินงาน

รหัสสำหรับการแข่งขันสามารถพบได้ที่นี่: https://github.com/Cain93/RocketBots

การส่งแต่ละครั้งควรขยายBotชั้นเรียน คุณต้องแทนที่fireRocketวิธีการ วิธีนี้จะได้รับชุดข้อมูลแบบตารางของจรวดRocket[][]ซึ่งแสดงถึงเกมบอร์ด คุณอยู่เสมอที่ด้านล่างของตารางที่มีช่องเสียบที่จุด[-1][6], ,[-1][7] ในตารางจุดว่างจะถูกแทนด้วย[-1][8] nullหากมีจรวดอยู่ในแผ่นกระเบื้องคุณสามารถระบุได้ว่าใครเป็นเจ้าของจรวดด้วยการเข้าถึงdisฟิลด์ "^" เป็นจรวดของคุณและ "v" เป็นคู่ต่อสู้ของคุณ

คุณต้องส่งคืน LinkedList ของจำนวนเต็มที่ให้คำแนะนำสำหรับจรวดของคุณ หากต้องการเลื่อนขึ้นให้ใช้ 0 หากต้องการเลื่อนขึ้นและไปทางขวาให้ใช้ 1 ขวาใช้ 2 และอื่น ๆ จนถึง 7 สำหรับด้านบนและซ้าย จรวดจะเคลื่อนที่ตามลำดับที่คุณกดจำนวนเต็ม ตัวอย่างเช่นรหัสต่อไปนี้จะทำให้จรวดเคลื่อนที่ขึ้นไปสองสามรอบ, zig-zag เลี้ยวสองสามรอบแล้วจึงทำให้เกิดการระเบิด

LinkedList<Integer> moves = new LinkedList<Integer>();

moves.push(0);
moves.push(0);
moves.push(0);
moves.push(1);
moves.push(7);
moves.push(1);
moves.push(7);

หากต้องการเปลี่ยนช่องที่จะยิงจรวดให้เปลี่ยนcurSlotช่อง 0 คือช่องซ้ายสุดของคุณและ 2 คือขวาสุดของคุณ getSlot(int slotNumber)เพื่อตรวจสอบว่าช่องถูกทำลายใช้

ถ้าจรวดจบเทิร์นของสล็อตสล็อตนั้นจะถูกทำลาย คุณไม่จำเป็นต้องทำให้จรวดระเบิดด้วยตนเอง

หมายเหตุ:จรวดวางไข่ในตำแหน่งของช่องที่ยิงออกมา แต่จะเคลื่อนที่หนึ่งครั้งก่อนที่จะมีการชน ดังนั้นหากคุณยิงจรวดออกจากช่อง 0 และการเคลื่อนที่ครั้งแรกนั้นถูกต้อง (2) คุณจะทำลายช่องกลางของคุณเอง อย่างไรก็ตามการขึ้นและลง (1) เป็นการเคลื่อนที่ที่ปลอดภัย

หากคุณต้องการตั้งชื่อบอตของคุณให้แทนที่name()เมธอด

บอตจะถูกสร้างขึ้นใหม่สำหรับการต่อสู้แต่ละครั้งดังนั้นตัวแปรแบบคงที่ใด ๆ จะถูกรีเซ็ต

โชคดี!

ขอให้จรวดของคุณบินได้จริงและฝ่ายตรงข้ามของคุณจะเป็นเพียงเศษเหล็ก

คำแนะนำ:

การจุดระเบิดจรวดเพื่อสร้างการระเบิดเป็นวิธีที่ง่ายกว่าในการป้องกันมากกว่าการพยายามยิงจรวดของฝ่ายตรงข้าม

บอทตัวอย่าง

package bots;

import java.util.LinkedList;

import mechanics.*;




public class SimpleBot extends Bot {

    public String name(){
        return "Simple";
    }

    public LinkedList<Integer> fireRocket(Rocket[][] g){

        LinkedList<Integer> l = new LinkedList<Integer>();
        for(int i = 0; i < 12; i++){
            l.push(0);
        }
        return l;
    }

}

คะแนน

คะแนนจาก 6-24

Simple: 900
Zigzagoon: 3654
Wall-E: 3606
Tortoise: 2248
3 Shot: 2334
HatTrickBot: 4287
Sniper: 2973
SideShooter: 2491
Terminator: 4835
StraightShot: 3378
Defender: 4570
MoreDakka: 4324

แก้ไขคำสั่งไม่สำคัญถ้าบอตใดใช้ RNG ของฉันจะเพิ่มการวิ่งเป็น 1,000 ครั้งต่อนัด
Cain

1
มีวิธีการตรวจสอบว่าช่องของฝ่ายตรงข้ามถูกทำลายหรือไม่? getSlot (int) สำหรับช่องของเราเท่านั้นใช่ไหม
Katenkyo

1
@ Cain มันน่าสนใจที่จะไม่สามารถยิงจรวดไปยังช่องที่ถูกทำลาย: 3
Katenkyo

1
@Manu ไม่ใช่ข้อผิดพลาดคุณกำลังมองไปที่บอร์ดจากด้านข้างของคุณดังนั้นช่องด้านซ้ายจึงสัมพันธ์กัน
Katenkyo

1
ฉันขอโทษที่แก้ไขข้อผิดพลาดนั้นแล้วฉันลืมที่จะผลักดันมัน!
คาอิน

คำตอบ:


3

ผู้ปกป้อง

Defender ใช้รูปแบบการป้องกันแบบใหม่: จรวดกำลังลาดตระเวนตรงหน้าสล็อต นี่เป็นข้อได้เปรียบอย่างใหญ่หลวงเนื่องจากจรวดมีชีวิตอยู่ถึง 100 รอบแทนที่จะเป็น 5 รอบ (เช่นการระเบิด)

package bots;

import java.util.LinkedList;
import mechanics.*;

public class Defender extends Bot {
    int turn = 0;

    @Override
    public String name() {
        return "Defender";
    }

    @Override
    public LinkedList<Integer> fireRocket(Rocket[][] grid) {
        LinkedList<Integer> command = new LinkedList<Integer>();
        for (int i = 0; i < 3; i++) {
            if ((grid[0][6+i] == null || grid[0][6+i].getDis().equals("v")) && (grid[1][6+i] == null || grid[1][6+i].getDis().equals("v")) && getSlot(i)) {
                curSlot = i;
                command.push(0);
                for (int j = 0; j < 50; j++) {
                    command.push(0);
                    command.push(4);
                }
                break;
            }
        }

        if (command.isEmpty()) {
            if ((grid[0][9] == null || grid[0][9].getDis().equals("v")) && (grid[0][10] == null || grid[0][10].getDis().equals("v")) && (grid[1][10] == null || grid[1][10].getDis().equals("v")) && getSlot(2)) {
                curSlot = 2;
                command.push(1);
                command.push(1);
                command.push(4);
                for (int i = 0; i < 50; i++) {
                    command.push(6);
                    command.push(2);
                }
            } else if ((grid[0][5] == null || grid[0][5].getDis().equals("v")) && (grid[0][4] == null || grid[0][4].getDis().equals("v")) && (grid[1][4] == null || grid[1][4].getDis().equals("v")) && getSlot(0)) {
                curSlot = 0;
                command.push(7);
                command.push(7);
                command.push(4);
                for (int i = 0; i < 50; i++) {
                    command.push(2);
                    command.push(6);
                }
            }

        }

        if (command.isEmpty()) {
            if (turn % 2 == 0 && getSlot(0)){
                curSlot = 0;
                command.push(7);
                command.push(7);
                for (int i = 0; i < 7; i++) {
                    command.push(0);
                }
                command.push(2);
                for (int i = 0; i < 2; i++) {
                    if (Math.random() < 0.2) command.push(2);
                }
                command.push(1);
            } else {
                curSlot = 2;
                command.push(1);
                command.push(1);
                for (int i = 0; i < 7; i++) {
                    command.push(0);
                }
                command.push(6);
                for (int i = 0; i < 2; i++) {
                    if (Math.random() < 0.5) command.push(6);
                }
                command.push(7);
            }
        }

        turn++;
        return command;
    }
}

ว้าว +1 บอทที่น่ากลัว แต่อย่างที่คุณพูดไม่สามารถเล่นได้ดีเมื่อบอทอยู่ฝั่งตรงข้าม
Spikatrix

1
การเล่นที่สมบูรณ์แบบไร้ที่ติขอแสดงความยินดี
Cain

6

Zigzagoon

ช่องด้านนอกกว้าง (เล็กน้อย) จากนั้นมุ่งหน้าไปข้างหน้าและกลับเข้ามาในช่องศัตรู ช่องตรงกลางถ่ายลวดลายซิกแซกขึ้นตรงกลาง

รอบอื่น ๆ (3 รอบ) มันจะเข้าสู่โหมดป้องกันและระเบิดจรวดที่อยู่ใกล้กับสล็อตของฉัน จรวดโหมดโจมตีจะไปรอบ ๆ พวกมัน ไม่มีอะไรแฟนซีเกินไปเป็นเพียงสิ่งที่จะทำให้การแข่งขันดำเนินไปได้

package bots;import java.util.*;import mechanics.*;

public class Zigzagoon extends Bot{
    String[] evenMoves = {"7000000001","0170710170","1000000007"};
    String[] oddMoves = {"0","00","0"};
    boolean even = true;
    public String name(){return "Zigzagoon";}

    public LinkedList<Integer> fireRocket(Rocket[][] g){
        curSlot = (curSlot+1)%3;
        if(curSlot<1)even=!even;
        String[] moves = even?evenMoves:oddMoves;
        LinkedList<Integer> command = new LinkedList<Integer>();
        for(int i=0;i<moves[curSlot].length();i++)
            command.push(moves[curSlot].charAt(i)-'0');
        return command;
    }
}

คงที่ความแตกต่างส่วนใหญ่มาจากที่ไม่ว่าจะเริ่มเป็นจริงหรือเท็จ บอตจะสร้างใหม่ก่อนการแข่งขันแต่ละครั้ง
Cain

อ่านั่นสมเหตุสมผลแล้ว ฉันไม่เคยนึกถึงตัวแปรที่ไม่ได้รีเซ็ต ขอบคุณ :)
Geobits

5

Terminator

ฉันภูมิใจนำเสนอ Terminator !!!

จรวดแต่ละอันเคลื่อนไปทางซ้าย / ขวาจากกลางและย้อนกลับไปที่ช่องศัตรู จรวดทุกตัวจะถูกเปิดใช้งานตรงและระเบิดใกล้กับสล็อตเพื่อป้องกัน

package bots;

import java.util.LinkedList;
import mechanics.Bot;
import mechanics.Rocket;

public class Terminator extends Bot {

    int n = 0;
    String[] moves = {"000", "0111107777", "00", "0077700111", "00", "0777701111"};

    public String name() {
        return "Terminator";
    }

    @Override
    public LinkedList<Integer> fireRocket(Rocket[][] g) {
        curSlot = (n+1) % 3;

        LinkedList<Integer> commands = loadCommands(moves[n % moves.length]);
        n++;

        return commands;
    }

    protected LinkedList<Integer> loadCommands(String commands) {
        LinkedList<Integer> linkedList = new LinkedList<Integer>();

        for (int i = 0; i < commands.length(); i++) {
            linkedList.push(commands.charAt(i) - 48);
        }

        return linkedList;
    }

}

3

HatTrickBot

ฉันมี DoubleTapBot สำหรับ CodeBot 3 ผู้ซึ่งตีสองครั้งในที่นี่ HatTrickBot มาที่นี่: กดจุดทั้ง 3 จุดพร้อมกัน!

มันเป็นไปได้เสมอที่จะป้องกันไม่ให้จรวดชนถ้าคุณรู้ว่ามันจะตกลงไปที่ไหน แต่ฉันไม่คิดว่าจะมีบอทมากมายที่จะสามารถปกป้องช่องของพวกเขาจากการโจมตีด้วยจรวด 3 ครั้ง

โดยวิธีการที่ใช่มันน่ากลัวที่จะเห็นอย่างอื่นด้วยสวิตช์ซ้ำ ฉันสามารถสร้าง var เพื่อเปิดด้วยค่าที่ไม่ซ้ำกันสำหรับการรวมกันของสถานะของช่องและ turnConter แต่ละชุด แต่มันยากที่จะอ่าน (ฉันจะต้องรักษาความหมายของค่าในความคิดเห็น ... น่าเบื่อ!) :)

package bots;
import java.util.LinkedList;
import mechanics.*;
/*
 * HatTrickBot always tries to destroy all the enemy slots at once
 * In order to achieve this, each slot needs extrem concentration and coordination
 * It explain why they need some turns to re-synchronized the rockets after one of them dies.
 */
public class HatTrickBot extends Bot
{
    // Default moves are at [0]
    // moves at [1] are used when there's only 2 slots remaining
    // moves  [2-4] are here for when there's only 1 slot remaining
    // it panicks, and can't establish how to fire to do a hat trick.
    // So he will just spamm every ennemy position, one at a time
    String[] rightSlot = {  "770002000020",
                            "0000000001",
                            "0000000000",
                            "0000000001",
                            "0000000011"};
    String[] midSlot   = {  "0000000000",
                            "11000060000",
                            "0000000000",
                            "0000000010",
                            "0000000700"};
    String[] leftSlot  = {  "11000060007",
                            "777702000020",
                            "0000000000",
                            "0000007000",
                            "0000077000"};
    int turnCounter=-1;
    public String name(){return "HatTrickBot";}
    public LinkedList<Integer> fireRocket(Rocket[][] g)
    {
        turnCounter=(turnCounter+1)%3;
        String[][] moves = {rightSlot,midSlot,leftSlot};
        LinkedList<Integer> ll = new LinkedList<Integer>();
        boolean slotL=getSlot(0),slotM=getSlot(1),slotR=getSlot(2);
        int movePoint=0;
        if(slotL&&slotM&&slotR)
        {
            switch(turnCounter)
            {
            case 0: curSlot=0;
                break;
            case 1: curSlot=2;
                break;
            case 2: curSlot=1;
                break;
                default:break;
            }
            movePoint=0;

        }
        else if(!slotM&&slotL&&slotR)
        {
            switch(turnCounter)
            {
            case 0: curSlot=0;
                    movePoint=0;
                break;
            case 1: curSlot=2;
                    movePoint=0;
                break;
            case 2: curSlot=0;
                    movePoint=1;
                break;
                default:break;
            }
        }
        else if(!slotL&&slotM&&slotR)
        {
            switch(turnCounter)
            {
            case 0: curSlot=0;
                    movePoint=0;
                break;
            case 1: curSlot=1;
                    movePoint=1;
                break;
            case 2: curSlot=0;
                    movePoint=1;
                break;
                default:break;
            }
        }
        else if(!slotR&&slotM&&slotL)
        {

            switch(turnCounter)
            {
            case 0: curSlot=2;
                    movePoint=1;
                break;
            case 1: curSlot=1;
                    movePoint=1;
                break;
            case 2: curSlot=1;
                    movePoint=0;
                break;
                default:break;
            }
        }
        else
        {
            if(slotR)curSlot=0;
            if(slotM)curSlot=1;
            if(slotL)curSlot=2;
            movePoint = 2+turnCounter;
        }
        for(int i=0;i<moves[curSlot][movePoint].length();i++)
            ll.push(Integer.parseInt(moves[curSlot][movePoint].charAt(i)+""));
        return ll;
    }
}

จรวดจะยิงกันทุกครั้งดังนั้นนี่จะไม่ทำให้การยิง Hat Trick เต็ม ยังคงมีประสิทธิภาพมากแม้ว่า
ดัมและอีฟ

@Cain Ho เสียใจที่มันเปลี่ยนทุก 2 รอบ: / อย่างไรก็ตามผมจะเห็นผลของรอบแรกแล้วปรับเปลี่ยนที่จะทำจริง Hattrick ถ้าฉันคิดว่ามันสามารถปรับปรุงได้ :)
Katenkyo

จรวดเคลื่อนที่สองครั้งระหว่างทุกครั้งที่มีการเรียกใช้ fireRocket () ดังนั้นในตอนนี้พวกมันทั้งหมดถูกหักล้างกันโดยการเลี้ยว คุณสามารถใช้ไฟล์ทดสอบในคอนโทรลเลอร์เพื่อดูการแสดงภาพของการแข่งขัน
Cain

@Cain ผมอยู่ที่การทำงานเมื่อผมเขียนบอทเหล่านั้นเพื่อให้ฉันตามพวกเขาเพียง แต่ในรายละเอียด :)
Katenkyo

ว้าวฉันประทับใจที่คุณสามารถเขียนได้โดยไม่ต้องทำการทดสอบใด ๆ ขอแสดงความยินดี ฉันปรับปรุงรายละเอียดที่จะทำให้มันชัดเจนมากขึ้น
อดัม

2

เต้า

ถ้าฉันปกป้องฐานทั้งหมดของฉันฉันมี 3 คะแนน ฐานสามารถถูกโจมตีได้จาก 5 ตำแหน่งเท่านั้นหากฉันได้รับกริดอย่างดี Rocket เปิดใช้งานได้ 5 ครั้งบนสนาม ...

บอทนี้ใช้ทั้งหมดนี้เพื่อให้ตรงกับเป้าหมาย: รอดชีวิตด้วยคะแนนอย่างน้อย 50% ในกระเป๋า มันยิงจรวด 3 ลูกออกมา

package bots;

import java.util.LinkedList;

public class Tortoise extends Bot
{
    int turnCounter=-1;
    boolean attacked=false;
    int[] moves={7,0,0,0,1};
    public String name(){return "Tortoise";}
    public LinkedList<Integer> fireRocket(Rocket[][] g)
    {
         LinkedList<Integer> rocket = new LinkedList<Integer>();
         turnCounter++;
         if(!attacked)
         {
             curSlot=turnCounter;
             for(int i=0;i<11;i++)
                 rocket.push(0);
             if(turnCounter==2)
                 attacked=true;
             return rocket;
         }
         turnCounter%=5;
         switch(turnCounter)
         {
         case 0:
         case 1:curSlot=0;break;
         case 2:curSlot=1;break;
         case 3:
         case 4:curSlot=2;break;
            default:break;
         }
         rocket.push(moves[turnCounter]);
         return rocket;
    }
}

จรวดยิงไปทุก ๆ ทางเท่านั้นดังนั้นคุณสามารถดูแลกำแพงได้เพียงครึ่งเดียวเท่านั้น
Cain

@Cain โอ้ดังนั้นฉันจะปรับเปลี่ยนให้มีที่อยู่อาศัยเป็นจริง :)
Katenkyo

2

SIDESHOOTER

ยิงครั้งแรกผ่านป้อมปืนแรก (ขวาสุด) ในหนึ่งในสองวิธีที่แตกต่างกัน จากนั้นมันจะยิงผ่านป้อมปราการสุดท้าย (ซ้ายสุด) ในหนึ่งในสองวิธีที่แตกต่างกัน จากนั้นมันจะสร้าง "กำแพง" พร้อมป้อมปืนที่สอง (กลาง) โดยการระเบิดจรวดที่ด้านหน้าของแต่ละป้อมปืน กระบวนการนี้ซ้ำแล้วซ้ำอีก

หากเกมมีระยะเวลานานกว่า 30 รอบ SideShooter จะเพิ่มความน่าเบื่อและเปลี่ยนแปลงเล็กน้อย แทนที่จะสร้าง "กำแพง" ด้วยป้อมปืนที่สอง (กลาง) มันยิงตรง ป้อมปืนที่เหลือจะทำงานในลักษณะเดียวกัน

import java.util.LinkedList;

public class SideShooter extends Bot {

    int[] launcher = new int[]{1, 3, 2, 2, 2};
    String[] right = {"1100000077", "100000007"};
    String[] left  = {"7700000011", "700000001"}; 
    int position = -1;
    int turns = 0;

    public String name(){
        return "SideShooter";
    }

    public LinkedList<Integer> fireRocket(Rocket[][] g){
      LinkedList<Integer> directions = new LinkedList<Integer>();

      if(getSlot(0) || getSlot(1) || getSlot(2))      
          do{
              position = (position + 1) % 5;
              curSlot = launcher[position] - 1;
          }while(!getSlot(curSlot));

      if(position == 0)
      {
          String shoot = left[((int) (Math.random() * left.length))];
          for(int i=0; i < shoot.length(); i++)
              directions.push(shoot.charAt(i)-'0');
      }else if(position == 1)
      {
          String shoot = right[((int) (Math.random() * right.length))];
          for(int i=0; i < shoot.length(); i++)
              directions.push(shoot.charAt(i)-'0');
      }else
      {
          if(turns < 30)
          {
            if(position == 2 )
                directions.push(0);
            else if(position == 3)
                directions.push(1);
            else if(position == 4)
                directions.push(7);
          }else
              for(int i=0; i < 10; i++)
                  directions.push(0); 
      }
      turns ++;
      return directions;
    }

}

do...whileงบทำห่วงอนันต์ ...
guy777

@ guy777 ไม่เลย มันวนซ้ำจนกว่าจะพบป้อมปืนที่ไม่แตก
Spikatrix

ตกลง ! สองครั้งแรกที่ฉันเปิดตัวโค้ดที่มีบอตทั้งหมด SideShooter และบอทอื่น ๆ (ฉันไม่รู้ว่าไหน) ไม่สามารถจบเกมได้ !!!
guy777

เกมบางเกมไม่สามารถปรุงแต่งได้ ตัวควบคุมควรมีการ จำกัด การเลี้ยว
guy777

1
@CoolGuy ฉันลงคะแนนให้อนุมัติการแก้ไขของเขา ตรวจสอบให้แน่ใจว่าได้ตรวจสอบ / ทดสอบด้วยตัวเอง
mbomb007

2

นกปากซ่อม

Sniper ปิดกั้นสองด้านก่อนจากนั้นจึงเริ่มยิงตรง

import java.util.LinkedList;

public class Sniper extends Bot {

    int[] launcher = new int[]{1, 3, 1, 2, 3};
    String[] moves = {"7", "1", "0000000000", "0000000000", "0000000000"}; 
    int position = -1, move = 0;

    public String name(){
        return "Sniper";
    }

    public LinkedList<Integer> fireRocket(Rocket[][] g){
        LinkedList<Integer> directions = new LinkedList<Integer>();

        if(getSlot(0) || getSlot(1) || getSlot(2))
        do{
            position = (position + 1) % launcher.length;
            curSlot = launcher[position] - 1;
        }while(!getSlot(curSlot));

        for(int i=0; i < moves[move].length(); i++)
            directions.push(moves[move].charAt(i)-'0');

        move = (move + 1) % moves.length;

        return directions;
    }

}

ดูความคิดเห็นเกี่ยวกับ SideShooter ปัญหาเดียวกันที่นี่
Cain

2

สามช็อต

เราได้ภาพแปลก ๆ ที่บินได้ ไม่มีการป้องกันที่แท้จริง แต่รูปแบบนั้นยากที่จะได้รับการยิงผ่านลูกเห็บพิศวงที่แปลกประหลาดนี้ (หรือนั่นคือความคิดมันมักจะไม่ทำงาน)

package bots;import java.util.*;import mechanics.*;

public class ThreeShot extends Bot{
    public String name(){state = 0;return "3 Shot";}
    private int state;

    public LinkedList<Integer> fireRocket(Rocket[][] g){
        LinkedList<Integer> command = new LinkedList<Integer>();
        if(state < 2){
           state++;
           return fireLeft();
        }
        if(state < 4){
           state++;
           return fireCenter();
        }
        state=(state+1)%6;
        return fireRight();
    }
    LinkedList<Integer> fireCenter(){
        LinkedList<Integer> command = new LinkedList<Integer>();
        curSlot = 1;
        while(command.size()<90){
            command.push(1);
            command.push(7);
            command.push(6);
            command.push(1);
        }
        return command;
    }
    LinkedList<Integer> fireRight(){
        LinkedList<Integer> command = new LinkedList<Integer>();
        curSlot = 2;
        command.push(1);
        for(int i=0;i<8;i++){
            command.push(0);
        }
        command.push(7);
        return command;
    }
    LinkedList<Integer> fireLeft(){
        LinkedList<Integer> command = new LinkedList<Integer>();
        curSlot = 0;
        command.push(7);
        for(int i=0;i<8;i++){
            command.push(6);
            command.push(1);
        }
        command.push(1);
        return command;
    }
}

บันทึก


2

MoreDakka

MoreDakka ทำการยิงในห้าทิศทางโดยไม่หยุด (จนกว่าป้อมปราการจะถูกทำลายโดยขีปนาวุธอื่น ๆ )

import java.util.LinkedList;

public class MoreDakka extends Bot
{
    String[] moves={"70000000001", "0000000000", "0000000000", "0000000000", "1000000007"};
    int[] launcher = new int[]{0, 0, 1, 2, 2};
    int position = -1;

    public String name(){
        return "MoreDakka";
    }

    public LinkedList<Integer> fireRocket(Rocket[][] g)
    {
         LinkedList<Integer> directions = new LinkedList<Integer>();

         if(getSlot(0) || getSlot(1) || getSlot(2))
            do{
                position = (position + 1) % launcher.length;
                curSlot = launcher[position];
            }while(!getSlot(curSlot));

         for(int i=0; i < moves[position].length(); i++)
            directions.push(moves[position].charAt(i)-'0');

         return directions;
    }
}

1

StraightShot

เพียงแค่ยิงใส่พวกเขา

package bots;import java.util.*;import mechanics.*;

public class StraightShot extends Bot{
    public String name(){return "StraightShot";}

    public LinkedList<Integer> fireRocket(Rocket[][] g){
        LinkedList<Integer> command = new LinkedList<Integer>();
        curSlot = (curSlot+1)%3;
        for(int i=0;i<100;i++)
            command.push(0);
        return command;
    }
}

1
ในกรณีที่คุณไม่ทราบว่านี่เป็นเหมือนกันกับWaveBotซึ่งเป็นหนึ่งในบอทตัวอย่างที่มาพร้อมกับคอนโทรลเลอร์
Geobits

@Geobits ฉันไม่รู้ว่ามีบอทตัวอย่างอยู่
MegaTom

ฉันไม่ดีที่จะไม่วางบอตตัวอย่างในที่ที่ง่ายต่อการดู ฉันแค่จะลบ WaveBot และปล่อยให้รายการนี้ยืน
Cain

1

นี่คือรายการของฉันเอง

Walle

ยิงจรวดออฟเซตและสร้างกำแพงบนขอบและกึ่งกลางของเขา หลังจากผ่าน 100 รอบเริ่มกำหนดเป้าหมายที่ช่องกลาง

package bots;

import java.util.LinkedList;
import java.util.Random;

import mechanics.*;


public class WallE extends Bot {

    int turn = 2;

    public String name(){
        return "Wall-E";
    }

    public LinkedList<Integer> fireRocket(Rocket[][] g){
        turn++;
        LinkedList<Integer> moves = new LinkedList<Integer>();
        curSlot = 1;
        switch(turn%4){
        case 0: 
            //Check the right wall
            if(getSlot(2)){
                curSlot = 2;
                moves.push(1);
                return moves;
            }
        case 1:
            //Check the left wall
            if(getSlot(0)){
                curSlot = 0;
                moves.push(7);
                return moves;
            }
        case 2:
            //Check the center wall
            if(getSlot(1)){
                curSlot = 1;
                moves.push(0);
                return moves;
            }
            break;
        default:
            //Fire a sneaky rocket
            Random rand = new Random();
            int direction = rand.nextInt(2);
            int back = 0;
            if(direction == 0 && getSlot(2)){ direction = 1; back = 7; curSlot = 2;}
            else{ direction = 7; back = 1; curSlot = 0; }
            moves.push(0);
            moves.push(direction);
            moves.push(direction);
            for(int i = 0; i < 5; i++){
                moves.push(0);
            }

            //Go for the center after turn 100
            if(turn > 104){
                moves.pop();
                moves.push(back);
            }
            moves.push(back);
            moves.push(back);


        }

        return moves;










    }

}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.