Cuộc săn lùng Wumpus vĩ đại


22

HOÀN THÀNH

Mùa Wumpus đã kết thúc, và với cuộc sống của nhiều Wumpus hung ác và Thợ săn dũng cảm. Cũng như một số Thợ săn hèn nhát, vô đạo đức và hết sức ngu ngốc. Nhưng vào cuối ngày, NrebHunter của Tiến sĩ Heckle đã ra đi với nhiều chiến lợi phẩm và vinh quang nhất. Chúng tôi chào bạn, oh dũng cảm ... lái xe?

Đây là mùa mở trên Wumpuses và các thợ săn từ khắp nơi trên thế giới đang đổ xô đến Hang Wumpus để cố gắng làm giàu từ Wumpus Pelts có giá trị.

Tro choi

Dựa trên trò chơi Hunt the Wumpus cổ điển , với một vài biến thể.

Bản đô

Một khối mười hai mặt . Có 20 phòng, mỗi phòng được kết nối với 3 phòng khác, cơ bản là 3 vòng với những cây cầu ở giữa.

Wumpus

Wumpus là một con thú thần bí. Không ai chắc chắn nó trông như thế nào, nhưng tất cả đều đồng ý rằng nó hung dữ. Wumpus sống trong các hang động và thích ăn những thứ chết chóc. Nếu có một xác chết trong một hang động bên cạnh Wumpus, anh ta sẽ di chuyển đến đó và ăn nó. Nếu Wumpus tình cờ di chuyển vào một hang động chứa thợ săn, anh ta cũng sẽ giết và ăn thịt chúng. Nếu Wumpus nghe thấy một mũi tên gần anh ta, anh ta sẽ hoảng loạn và chạy vào một căn phòng ngẫu nhiên.

Các đặc điểm tùy chọn : Hiện tại chúng được bao gồm để làm cho trò chơi thú vị hơn, nhưng có thể được xóa theo yêu cầu phổ biến nếu chúng thêm quá nhiều tính ngẫu nhiên.

Wumpus tức giận: Nếu Wumpus bị bắn, anh ta có 20% sống sót và hoành hành trong 3 ngày. Khi hung hăng, anh ta sẽ di chuyển ngẫu nhiên hai lần một ngày, nhưng vẫn bị thu hút bởi các xác chết. Sau 3 ngày, anh sẽ chết. Một mũi tên thứ hai cũng sẽ giết Wumpus.

Wumpus lang thang: Mỗi ngày, nếu không có gì khác kích hoạt Wumpus, anh ta có 25% cơ hội di chuyển.

Các thợ săn

Bốn thợ săn có thể vào hang cùng một lúc. Các hang động tối, vì vậy những người thợ săn không thể nhìn thấy, nhưng họ có thể sử dụng các giác quan khác của họ. Thợ săn có thể ngửi thấy Wumpus trong phòng liền kề, ngửi thấy xác chết ở phòng kế bên, nghe thấy những thợ săn khác di chuyển trong phòng liền kề và nghe thấy nếu một mũi tên bị bắn vào phòng kế bên.

Thợ săn có hai hành động: Bắn hoặc di chuyển. Một thợ săn có thể bắn một mũi tên vào một phòng bên cạnh hoặc phòng riêng của mình, và di chuyển tương tự.

Trò chơi

Trong mỗi vòng, các thợ săn trước tiên sẽ lưu ý đến môi trường xung quanh, sau đó thực hiện một động tác. Chuyển động xảy ra trước mũi tên, vì vậy nếu một mũi tên được bắn vào một căn phòng mà thợ săn đang di chuyển ra ngoài, thợ săn sẽ sống sót. Sau khi tất cả các động thái thợ săn đã được thực hiện, các mũi tên được đánh giá. Nếu một người cư ngụ và mũi tên ở trong cùng một phòng, người cư ngụ sẽ bị bắn chết. Nếu hai hoặc nhiều người ở chung một phòng, một người sẽ ngẫu nhiên bị đánh và chết. Lưu ý: Quân đoàn là người cư ngụ, vì vậy một xác chết có thể đóng vai trò là lá chắn một phần.

Sau khi tất cả các thợ săn di chuyển, Wumpus sẽ trả lời. Nếu một thợ săn đã chuyển vào phòng với Wumpus, Wumpus sẽ ăn anh ta / cô ta. Nếu Wumpus di chuyển, nó cũng sẽ ăn những người trong phòng mới.

Sau 100 ngày, nếu những người thợ săn không giết được Wumpus, hoặc nạn nhân bị ngã, họ sẽ chết vì đói trong các hang động.

Mật mã

Tất cả các mã nguồn có thể được tìm thấy ở đây . Tất cả các bài nộp phải bằng Java, trừ khi ai đó muốn viết cho tôi bộ điều hợp stdIn / stdOut;)

Bots nên mở rộng lớp Hunter. Để đặt tên cho Hunter của bạn, hãy thêm một hàm tạo không có tham số nào đặt trường tên. Trả lời, ghi đè chức năng getResponse. Trong chức năng này, mỗi lượt, bạn sẽ được thông qua một mảng gồm 5 booleans cho bạn biết về môi trường xung quanh.

trạng thái 0 = "Bạn ngửi thấy một cái bướu"

trạng thái 1 = "Bạn nghe thấy một thợ săn khác"

trạng thái 2 = "Bạn ngửi thấy một xác chết"

trạng thái 3 = "Bạn nghe thấy tiếng mũi tên kêu"

status 4 = "Bạn cảm thấy một thợ săn khác ở cùng phòng với bạn"

Lớp Hunter có 2 vị trí: nextMove và nextDirection, sử dụng enum Move và Direction tương ứng. Di chuyển có thể là M CHUYỂN hoặc GIÀY, sự khốc liệt có thể là TRÁI, PHẢI, TRỞ LẠI hoặc TẠI ĐÂY. Chỉ đường là nhất quán, có nghĩa là quay lại sẽ luôn đưa bạn trở lại phòng trước đó bạn đã ở và nếu vào từ cùng một phòng, TRÁI và PHẢI sẽ luôn giống nhau. Tuy nhiên, nếu bạn nhập từ một hướng khác, TRÁI và PHẢI sẽ đưa bạn đến các địa điểm khác nhau.

Hãy thực hiện các phương pháp của riêng bạn là tốt. Bộ nhớ là liên tục trong toàn bộ giải đấu, có nghĩa là thợ săn của bạn sẽ chỉ được xây dựng một lần. Tuy nhiên, vào đầu mỗi vòng, phương thức newGame () được gọi để cho thợ săn của bạn biết một trò chơi mới đã bắt đầu.

Chấm điểm

Bốn thợ săn cạnh tranh cùng một lúc. Nếu bị giết, con chó Wumpus có giá trị 60 điểm, chia đều cho tất cả các thợ săn còn sống. Kiểu vòng tròn đầy đủ, vì vậy mỗi sự kết hợp của 4 thợ săn sẽ chơi cùng nhau.

5 Thợ săn mẫu được bao gồm: 4 với chức năng rất cơ bản và một cho phép người dùng nhập liệu để chơi, cho mục đích thử nghiệm.

Nếu bạn có bất kỳ đề nghị / yêu cầu, xin vui lòng cho tôi biết!

Nơi cuối cùng trong tầm mắt!

Dân số Wumpus trên thế giới đang bị săn lùng với tốc độ đáng báo động. Đạo luật Bảo vệ Wumpuses của chúng tôi dự kiến ​​sẽ được thông qua vào Thứ Tư, ngày 17 tháng Sáu. Sau ngày này, không có thêm thợ săn nào được phép vào các hang động, và một người chiến thắng sẽ được chọn.

Bảng điểm

Lưu ý: Tôi xin lỗi, có một lỗi trong mã có thể khiến Thợ săn chết trong nhiều trò chơi. Đã sửa nó, nó không thay đổi thứ hạng tổng thể rất nhiều, nhưng phần lớn thay đổi số liệu thống kê.

Điểm số trong, chạy từng bộ thợ săn trong 1000 trò chơi mỗi. NrebHunter và FullCoverageHunter dẫn đầu gói, và mặc dù việc bổ sung AntiHunter đã giúp Wumpuses tăng khả năng sống sót 2%, họ vẫn run rẩy trong đôi chân bị hút với tỷ lệ sống sót 32%. Mũi tên từ thợ săn đồng bào là mối đe dọa lớn nhất trong các hang động.

1. NascarHunter : 16557175 (17.08)
2. FullCoverageHunter : 15195545 (15.68)
3. Trig : 14459385 (14.92)
4. Idomeneus : 13428570 (13.85)
5. Eats Shoots and Leaves : 12763945 (13.17)
6. WalkingIdiot : 12329610 (12.72)
7. NealHunter : 12287140 (12.68)
8. Unnamed : 11013720 (11.36)
9. MonsterHunter : 10686035 (11.02)
10. Pacer : 9187000 (9.48)
11. Badger : 9042570 (9.33)
12. Stay : 8721210 (9.0)
13. Emo Wumpus : 7831050 (8.08)
14. Paranoid : 7722965 (7.97)
15. Huddle : 7465420 (7.7)
16. ElmerFudd : 7245995 (7.47)
17. Laomedon : 6963845 (7.18)
18. Pacifist : 6944960 (7.16)
19. ScaredyCat : 6937370 (7.15)
20. Wumpus : 114170 (0.11)



Total rounds: 4845000
Humans killed by arrows: 5289674 (1.09)
Humans dead by starvation: 1046024 (0.21)
Humans killed by wumpus: 1887634 (0.38)
Wumpus victories: 1563372 (0.32)

1
Bạn có thể đánh một thợ săn khác bằng một mũi tên?
MegaTom

1
Yessir, hoặc chính bạn nếu bạn bắn một mũi tên vào ĐÂY
Cain

1
Thay vì một mảng cho 5 booleans, tại sao không vượt qua intgiá trị 0-31? Chúng tôi là những chàng trai lớn ở đây, chúng tôi có thể thực hiện các hoạt động bit :)
DoctorHeckle

1
@DoctorHeckle Chắc chắn là chúng tôi, nhưng vẫn thân thiện với dev hơn là có một mảng chứ không phải là một int ^^.
Katenkyo

1
Đối với mũi tên và xác chết, nếu một người ở cùng phòng với bạn, bạn sẽ có trạng thái giống như khi nó liền kề. Thợ săn là những người duy nhất bạn có thể phân biệt giữa việc ở cạnh phòng hoặc trong phòng.
Cain

Câu trả lời:


11

NrebHunter

Không có nhiều logic với nó. Quy tắc của nó rất đơn giản: rẽ trái, thiêu đốt đất, lặp lại. Và, hey, anh ấy có thể gặp may mắn!

Ngày 8 tháng 6 chỉnh sửa:

Đã thêm vào logic bổ sung cho Nreb để giải thích sự phụ thuộc vào Wumpus so với lần di chuyển cuối cùng của nó. Hãy coi đó là một điểm dừng chân, để ở trong chủ đề. Nếu nó cảm nhận được một Wumpus sau khi bắn hạ hành lang, thì nó phải đến một trong hai phòng liền kề khác, vì nó sẽ chết vì phát súng mà thợ săn vừa bắn. Nó thực sự mang lại cho Wumpus 2 lượt sống nếu nó không di chuyển trở lại hoặc N Columbus 1 biến thành sống nếu anh ta đứng trên xác chết. Cũng chiếm một lựa chọn thứ ba nếu đó là lượt đầu tiên, nhưng chỉ một lần. Cuối cùng tôi sẽ chuyển sang FCH, bận rộn bận rộn.

package Hunters;

import Mechanics.*;

public class NascarHunter extends Hunter {

    private int state;
    private boolean shootHall;
    private boolean newGame;

    public NascarHunter(){

        name = "NascarHunter";
        state = 0;
        shootHall = true;
        newGame = true;

    }

    public void newGame(){

        state = 0;
        newGame = true;

    }

    public void getResponse(boolean[] status){

        // Wumpus about - stand and deliver
        if( status[0] ){

            nextMove = Move.SHOOT;

            switch( state ){

            case 0: // Must be in either Right or Back
                if(newGame){

                    // try Left if this is the first turn, just in case
                    nextDirection = Direction.LEFT;
                    newGame = false;

                }
                else if(shootHall) nextDirection = Direction.BACK;
                else               nextDirection = Direction.RIGHT;
                shootHall = !shootHall;
                break;
            case 2: // Must be in either Left or Back
                if(newGame){

                    // try Right if this is the first turn, just in case
                    nextDirection = Direction.RIGHT;
                    newGame = false;

                }
                else if(shootHall) nextDirection = Direction.BACK;
                else               nextDirection = Direction.LEFT;
                shootHall = !shootHall;
                break;
            default: // Must be in either Left or Right
                if(newGame){

                    // try Back if this is the first turn, just in case
                    nextDirection = Direction.BACK;
                    newGame = false;

                }
                else if(shootHall) nextDirection = Direction.RIGHT;
                else               nextDirection = Direction.LEFT;
                shootHall = !shootHall;
                break;

            }

        }else{

            // disregard state, shove out and light 'em up!
            switch( state ){

            case 0: // move out
                nextMove = Move.MOVE;
                nextDirection = Direction.LEFT;
                state++;
                break;
            case 1: // shoot right
                nextMove = Move.SHOOT;
                nextDirection = Direction.RIGHT;
                state++;
                break;
            case 2: // shoot behind
                nextMove = Move.SHOOT;
                nextDirection = Direction.BACK;
                state++;
                break;
            case 3: // shoot left
                nextMove = Move.SHOOT;
                nextDirection = Direction.LEFT;
                state = 0;
                break;

            }

        }

    }

}

FullCoverageHunter

Theo cùng một sự tín nhiệm của NrebHunter, nhưng xen kẽ con đường của anh ta, được đảm bảo để tạo thành một vòng lặp dài 10 phòng duy nhất. Vì mỗi phòng là duy nhất và chúng tôi bắn theo mọi hướng trên mỗi phòng, tất cả các phòng đều bị bắn vào. Điều này đúng với bất kỳ phòng bắt đầu nào (được đăng bởi Neal, bạn thân của tôi, cảm ơn Neal!). Dodecahedra khá tuyệt như thế!

Tôi muốn chỉ ra rằng điều này khác với người bạn của chúng tôi, MonsterHunter, vì anh ta không thử bất kỳ mánh khóe hay bất kỳ "chiến thuật" thực sự nào. Sức mạnh của điều này là thực tế là mọi phòng đều bị bắn vào, một lần nữa: giải pháp vũ phu. Điều này có một lý thuyết về chân lý thuyết trên NrebHunter, vì Nreb sẽ chỉ đánh 10 trong số 20 phòng, chỉ chiếm một nửa diện tích.

Ngày 11 tháng 6 chỉnh sửa:

Đã thêm vào mẫu logic phát hiện Wumpus từ NrebHunter. Nên khách quan cải thiện điểm số.

package Hunters;

import Mechanics.*;

public class FullCoverageHunter extends Hunter {

    private int state;
    private boolean headLeft;
    private boolean shootHall;
    private boolean newGame;

    public FullCoverageHunter(){

        name = "FullCoverageHunter";
        state = 0;
        headLeft = false;
        shootHall = true;

    }

    public void newGame() {
        state = 0;
        headLeft = false;
        newGame = true;
    }


    public void getResponse(boolean[] status){

        // Wumpus about - stand and deliver
        if( status[0] ){

            nextMove = Move.SHOOT;

            switch( state ){

            case 0: // Must be in either Right or Back
                if(newGame){

                    // try Left if this is the first turn, just in case
                    nextDirection = Direction.LEFT;
                    newGame = false;

                }
                else if(shootHall) nextDirection = Direction.BACK;
                else               nextDirection = Direction.RIGHT;
                shootHall = !shootHall;
                break;
            case 2: // Must be in either Left or Back
                if(newGame){

                    // try Right if this is the first turn, just in case
                    nextDirection = Direction.RIGHT;
                    newGame = false;

                }
                else if(shootHall) nextDirection = Direction.BACK;
                else               nextDirection = Direction.LEFT;
                shootHall = !shootHall;
                break;
            default: // Must be in either Left or Right
                if(newGame){

                    // try Back if this is the first turn, just in case
                    nextDirection = Direction.BACK;
                    newGame = false;

                }
                else if(shootHall) nextDirection = Direction.RIGHT;
                else               nextDirection = Direction.LEFT;
                shootHall = !shootHall;
                break;

            }

        }else{

            // disregard state, shove out (in an alternating fashion!) and light 'em up!
            switch( state ){

            case 0: // move out, change alternation state
                nextMove = Move.MOVE;
                if(headLeft) nextDirection = Direction.LEFT;
                else         nextDirection = Direction.RIGHT;
                state++;
                headLeft = !headLeft;
                break;
            case 1: // shoot into non-exit path
                nextMove = Move.SHOOT;
                if(headLeft) nextDirection = Direction.RIGHT;
                else         nextDirection = Direction.LEFT;
                state++;
                break;
            case 2: // shoot behind
                nextMove = Move.SHOOT;
                nextDirection = Direction.BACK;
                state++;
                break;
            default: // shoot into next room,
                nextMove = Move.SHOOT;
                if(headLeft) nextDirection = Direction.LEFT;
                else         nextDirection = Direction.RIGHT;
                state = 0;
                break;

            }

        }

    }

}

Hãy cho tôi biết nếu có bất kỳ lỗi nào, gói không hoạt động tốt với IDE của tôi :(


1
Tôi khá chắc chắn rằng cái này nên được gọi là MadMaxHunter, vì tôi không nhớ quá nhiều cuộc đua NASCAR liên quan đến tiếng súng giữa các phương tiện. Có vẻ để làm tốt!
Ralph Marshall

Tôi đã phải đặt dấu ngoặc quanh headLeft trong câu lệnh if để FullCoverageHunter hoạt động. Cả hai bot của bạn đều hoạt động rất tốt- NrebHunter khá hơn một chút
euanjt

Biến newGame trong FullCoverageHunter dường như không bao giờ được khai báo. Tôi đã thêm một newGame boolean riêng và đặt nó thành true trong phương thức newGame (), đó có phải là những gì bạn dự định không?
Cain

@Cain xin lỗi! Vâng, sự giám sát lớn từ tôi, tôi sẽ chỉnh sửa nó ở đây, cái xấu của tôi.
DoctorHeckle

7

Con lửng

Anh ấy không thích du khách.

package Hunters;

import Mechanics.*;

public class Badger extends Hunter {

    public Badger(){
        name = "Badger";
    }

    @Override
    public void getResponse(boolean[] status){
        nextMove = Move.SHOOT;
        nextDirection = Direction.values()[((int) (Math.random() * 3))];
    }
}

6

Elmer Fudd

"Suỵt. Hãy im lặng vewy yên tĩnh, tôi đang săn lùng bướu"

Elmer được gắn vào con mồi và bỏ qua mọi thứ trừ xác chết và Wumpus. Anh ta cố gắng tìm một xác chết sau đó lùi lại và bắt đầu bắn. Nếu anh ta ngửi thấy một Wumpus, anh ta sẽ lùi lại và nếu anh ta vẫn ngửi thấy anh ta, anh ta sẽ bắn.

Tôi xin lỗi tất cả các lập trình viên java, điều này có lẽ cực kỳ xấu xí, đầy lỗi cú pháp và tôi có lẽ đã làm rối logic của tôi.

package Hunters;

import Mechanics.*;

public class ElmerFudd extends Hunter {

    private state int;
    private previousDir int;

    public ElmerFudd(){
        name = "ElmerFudd";
    }

    public void newGame() {
        state=0;
        previousDir = Direction.LEFT;
    }

    public void getResponse(boolean[] status){

        nextMove = Move.MOVE;
        switch (previousDir) {
            case Direction.LEFT:
                nextDirection = Direction.RIGHT;
                break;
            case Direction.RIGHT:
                nextDirection = Direction.LEFT;
                break;
        }   

        if(status[2]&&state==0) {
            state = 1;
            return;
        }

        if(state==1){
            if(status[2]){
                state=2;
            };
            nextDirection = Direction.BACK;
            return;
        }

        if(state==2){
            nextMove = Move.SHOOT;
            nextDirection = Direction.BACK;
            return;
        }

        if(state==3&&status[0])
            nextMove = Move.SHOOT;
            nextDirection = Direction.BACK;
            return;
        }

        if(state==3) {
            state = 0;
        }

        if(status[0]){
            state=3;
            nextDirection = Direction.BACK;
        }

    }
}

Hòa bình

Anh chàng này có đạo đức chống lại bất kỳ loại thể thao máu nào và tự hỏi làm thế nào anh ta trở nên trong tình huống này. Anh ta sẽ chạy trốn khỏi mọi liên lạc và không bao giờ bắn.

package Hunters;

import Mechanics.*;

public class Pacifist extends Hunter {


    public Pacifist(){
        name = "Pacifist";
    }

    public void getResponse(boolean[] status){
        nextMove = Move.MOVE;
        if(status[0]||status[1]||status[2]||status[3]||status[4]){
            nextDirection = Direction.values()[((int) (Math.random() * 3))];
            return;
        }
        nextDirection = Direction.HERE;
    }
}

1
Tôi nghĩ rằng điều này có thể làm việc. Tất cả những gì bạn phải làm trong một trò chơi là hy vọng ai đó có được cái bướu trước khi nó có được bạn và bạn có được tín dụng đầy đủ.
Ralph Marshall

1
Đó là ý tưởng chung. Hãy để những người khác làm việc chăm chỉ :-)
MickyT

1
Đó là lý do tại sao tôi chờ bạn viết mã này, mặc dù tôi nghĩ đến nó đầu tiên :-)
Mawg

5

Kẻ săn quái vật

Chúng tôi đang săn một con quái vật và chúng tôi là 4 ... Nó làm tôi nhớ đến trò chơi yêu thích của tôi! Thợ săn này sẽ đi bộ trên hầu hết bản đồ bằng cách di chuyển sang trái phải, và nếu Wumpus ở gần, anh ta sẽ dụ dỗ anh ta bằng cách đi lùi để có thể xác định chính xác đó là gì.

Tôi có thể thoát khỏi LastDirection, nhưng tôi giữ cho ngữ nghĩa và khả năng đọc :). Trên thực tế, nó chết khá nhiều, nhưng bộ điều khiển thường đặt 2/3 thợ săn vào cùng một phòng khi bắt đầu và thường có Wumpus ở gần (cũng có thể ở trong cùng một phòng) ... vì vậy insta cái chết ^^ '.

package Hunters;

import Mechanics.*;

public class MonsterHunter extends Hunter 
{
    private Direction lastDirection=Direction.HERE;
    private boolean[] lastStatus=new boolean[5];
    private int   shooted=0;
    private boolean   walkMode=true;
    private int         turnStayed=0;

    public MonsterHunter(){
        super();
        name = "MonsterHunter";
    }

    @Override
    public void getResponse(boolean[] status)
    {
        if(status[0])
        {
            if(!lastStatus[0]||shooted==0)
            {
                nextDirection=(walkMode)?Direction.RIGHT:Direction.LEFT;;
                nextMove=Move.SHOOT;
            }
            else if(lastStatus[0]&&shooted==1)
            {
                nextDirection=Direction.BACK;
                nextMove=Move.MOVE;
            }
            else
            {
                nextDirection=Direction.BACK;
                nextMove=Move.SHOOT;
            }
        }

        else if(status[2])
        {
            nextMove=Move.MOVE;
            if(Math.random()*6<turnStayed)
            {
                nextDirection=Direction.HERE;
                turnStayed++;
            }
            else
                nextDirection=(walkMode)?Direction.RIGHT:Direction.LEFT;
        }
        else
        {
            nextMove=(!status[1]&&Math.random()<0.5)?Move.MOVE:Move.SHOOT;
            nextDirection=(walkMode)?Direction.RIGHT:Direction.LEFT;
        }

        if(nextMove==Move.MOVE)
        {
            if(shooted>0)
                walkMode=walkMode^(shooted>0);
            if(lastStatus[0]&&shooted==1)
                shooted++;
            else
                shooted=0;
            lastDirection=nextDirection;
        }
        else
            shooted++;
        for(int i=0;i<status.length;i++)
            lastStatus[i]=status[i];
    }
}

Cảm ơn bạn đã chỉ ra rằng, bộ điều khiển đã được sửa để mỗi người cư ngụ có một khởi đầu duy nhất
Cain

4

PacesHunter

Qua lại, giữa các phòng. nếu nó ngửi thấy một Wumpus hoặc nghe thấy một người chơi, nó sẽ bắn sang trái rồi phải. nếu một Wumpus ở bên cạnh anh ta bắt đầu bằng việc anh ta bắn vào phòng anh ta sẽ chuyển đến.

package Hunters;

import Mechanics.Direction;
import Mechanics.Hunter;
import Mechanics.Move;

public class PacingHunter extends Hunter {

    int state = 0;//Pacing
    int turn = 0;

    public PacingHunter() {
        name = "Pacer";
    }

    public void newGame() {
        turn =  0;
        state = 0;
    }

    public void getResponse(boolean[] status){
        turn += 1;
        if(state == 0 && status[0] && turn == 1){
            nextMove = Move.SHOOT;
            nextDirection = Direction.BACK;
            return;
        }
        if(state == 0 &&(status[0] || status[1])){
            nextMove = Move.SHOOT;
            nextDirection = Direction.LEFT;
            state = 1;
            return;
        }
        if(state == 1 && (status[0] || status[1])){
            nextMove = Move.SHOOT;
            nextDirection = Direction.RIGHT;
            state = 0;
            return;
        }
        if(status[1] && state == 0){
            nextMove = Move.SHOOT;
            nextDirection = Direction.BACK;
            state = 0;
            return;

    }
    nextMove = Move.MOVE;
    nextDirection = Direction.BACK;
}

}


4

ScaredyCat

ScaredyCat sợ mọi thứ. Nếu nó ngửi thấy một cái bướu hoặc xác chết hoặc nghe thấy một mũi tên hoặc thợ săn, nó chạy đến một hướng ngẫu nhiên. Mặt khác, nó chỉ đơn giản là giữ mũi tên bắn theo hướng ngẫu nhiên.

package Hunters;

import Mechanics.*;

public class ScaredyCat extends Hunter {

    public ScaredyCat(){
        name = "ScaredyCat";
    }

    @Override
    public void getResponse(boolean[] status){

        for(int i=0; i<status.length; i++)
            if(status[i])
            {
                nextMove = Move.MOVE;
                nextDirection = Direction.values()[((int) (Math.random() * 3))];
                return;
            }

        nextMove = Move.SHOOT;
        nextDirection = Direction.values()[((int) (Math.random() * 3))];
    }
}

6
Tôi không biết đây có phải là cố ý hay không, nhưng anh ta sẽ sợ mình bằng cách bắn mũi tên rồi chạy.
Cain

4

Ăn chồi và lá

Không giống như danh tiếng của Panda of grammar, thợ săn này thực sự không ăn bất cứ thứ gì, nhưng chúng tôi sẽ bắn nếu Wumpus sắp hoặc chúng tôi đi trên một con đường mà hy vọng sẽ không cho chúng tôi đi theo vòng tròn.

package Hunters;

import java.util.Random;

import Mechanics.Hunter;
import Mechanics.Move;
import Mechanics.Direction;
import Mechanics.Room;

public class EatsShootsAndLeaves extends Hunter {

    private static Direction [] allDirections = { Direction.LEFT, Direction.RIGHT, Direction.BACK, Direction.HERE };
    private static Direction [] movePath = { Direction.LEFT, Direction.RIGHT, Direction.LEFT, Direction.BACK, Direction.RIGHT, Direction.BACK };

    private static int numGames = 0;
    private static int totalLife = 0;

    private static class RoomInfo  {

        public boolean hasWumpus = false;
        public boolean hasLocalHunter = false;
        public boolean hasNeighborHunter = false;
        public boolean hasCorpse = false;
        public boolean hasArrow = false;
        public RoomInfo(Room r) {
            boolean [] status = r.getInfo();
            hasWumpus = status[0];
            hasNeighborHunter = status[1];
            hasCorpse = status[2];
            hasArrow = status[3];
            hasLocalHunter = status[4];
        }

        public String toString() {
            return new String("Status: "
                              + (hasWumpus ? "Wumpus " : "")
                              + (hasNeighborHunter ? "Close Hunter " : "")
                              + (hasCorpse ? "Corpse " : "")
                              + (hasArrow ? "Arrow " : "")
                              + (hasLocalHunter ? "Local Hunter " : ""));
        }
    }

    int turnsAlive = 0;
    int shots = 0, moves = 0;

    public EatsShootsAndLeaves(){
        name = "Eats Shoots and Leaves";
    }

    public void newGame() {

        totalLife += turnsAlive;
        numGames++;

        turnsAlive = shots = moves = 0;
    }

    public void getResponse(boolean[] status){

        turnsAlive++;

        RoomInfo info = new RoomInfo(this.getRoom());
        if (info.hasNeighborHunter || info.hasWumpus) {
            nextMove = Move.SHOOT;
            nextDirection = allDirections[shots++ % 3];
        } else {
            nextMove = Move.MOVE;
            nextDirection = movePath[moves++ % movePath.length];
        }
    }
}

3

Idomeneus

Idomeneus khá đơn giản - nếu Wumpus hoặc một thợ săn khác ở gần đó, anh ta bắn ra khắp nơi và cầu nguyện rằng nữ thần săn bắn đứng về phía anh ta. Nếu anh ta ở gần một xác chết, anh ta nằm chờ Wumpus. Anh ta không thích những thợ săn khác và sẽ chạy trốn nếu họ bắt đầu bắn những mũi tên gần anh ta, hoặc nếu họ ở cùng phòng với anh ta. Cuối cùng, nếu anh ta cảm thấy buồn chán, anh ta ngẫu nhiên bước đi trên các hành lang vĩnh cửu.

package Hunters;
import Mechanics.Direction;
import Mechanics.Hunter;
import Mechanics.Move;
import java.util.Random;



public class Idomeneus extends Hunter
{
    int direction;
    Random r;
    public Idomeneus()
    {
        super();
        name = "Idomeneus";
        direction = 0;
        r = new Random();
    }

    @Override
    public void getResponse(boolean[] status){
        boolean wumpusNear = status[0];
        boolean hunterNear = status[1];
        boolean corpseNear = status[2];
        boolean arrowNear = status[3];
        boolean hunterHere = status[4];
        direction++;

        if(wumpusNear)
        {
            //ATTACK!!!
            nextMove = Move.SHOOT;
            nextDirection = Direction.values()[direction%3];
        }
        else if(hunterHere || arrowNear)
        {
            //Run away
            nextMove = Move.MOVE;
            nextDirection = Direction.values()[r.nextInt(3)];
        }
        else if(hunterNear)
        {
            //ATTACK!!!
            nextMove = Move.SHOOT;
            nextDirection = Direction.values()[direction%3];
        }
        else if(corpseNear)
        {
            //Stay and wait...
            nextMove = Move.MOVE;
            nextDirection = Direction.HERE;
        }
        else
        {
            //wander around
            nextMove = Move.MOVE;
            nextDirection = Direction.values()[r.nextInt(3)];
        }

    }

    public void newGame(){}



}

Hãy cẩn thận: Theo @Cain, bạn có thể tự bắn mình nếu bạn bắn vào phòng riêng của mình.
DoctorHeckle

3

Emo Wumpus (Thợ săn)

Emo Wumpuses (liên quan đến Emo Wolves đôi khi sử dụng súngmáy bay ) ghét mọi thứ (đặc biệt là Java). Chúng không phân biệt giữa Thợ săn và Wumpuses, và cố gắng bắn chúng như nhau. Họ cũng ghét các tài xế Nreb, và sẽ luôn bắn đúng. Nếu không có ai xung quanh để bắn, họ di chuyển đúng, nhưng sẽ chỉ làm điều này mười ba lần liên tiếp trước khi họ càng chán nản hơn về việc ở một mình và cố gắng tự bắn mình (mười ba là một con số không may mắn). Đến lượt 99, nếu họ vẫn còn sống, họ sẽ cố gắng tự bắn mình vì chết đói là một cách khập khiễng như vậy.

Wumpuses lớn hơn (và nặng hơn) so với Wolves, nhưng con này vẫn bị bỏ đói tới 424 byte (trái ngược với con số khổng lồ 2,72 kb của NrebHunter).

package Hunters;import Mechanics.*;public class EmoWumpus extends Hunter{private int c, t;public EmoWumpus(){name="Emo Wumpus";this.c=0;this.t=0;}public void newGame(){this.c=0;this.t=0;}public void getResponse(boolean[] status){nextMove=Move.SHOOT;if(c<13 && t<100){if(status[0]||status[1]){nextDirection=Direction.RIGHT;}else{nextMove=Move.MOVE;nextDirection=Direction.RIGHT;c++;}}else{nextDirection=Direction.HERE;}t++;}}

Tại sao không chỉ tự tử ngay từ đầu? Emo Wumpuses tin rằng một hành động tốt có thể làm là chấm dứt sự đau khổ của người khác trước khi tự sát. Do đó, họ sẽ giết tất cả những gì họ có thể trước khi đến lúc chết.

Wumpus? (Chống thợ săn)

Ừm, một Wumpus đang làm gì trong danh sách thợ săn? Anh chàng này đã rất tức giận vì con người đang giết chết người thân của mình, vì vậy anh ta quyết định hóa trang thành một trong số họ và tham gia vào cuộc săn lùng. Mục tiêu chính của anh ta là chỉ để giết thợ săn. Anh ta cố gắng trốn gần các xác chết, điều này sẽ cho anh ta cơ hội với một lá chắn từ những người thợ săn. Nếu không có thợ săn nào ở gần, anh ta sẽ di chuyển theo hướng cho đến khi phát hiện ra thợ săn, trong trường hợp đó anh ta sẽ cố gắng giết họ trước khi di chuyển theo hướng khác.

Thật không may, hầu hết các Wumpuses đều ngu ngốc, và vẫn sẽ cố gắng giết anh ta. Bất kể, anh ta coi sự hy sinh của mình là cần thiết cho lợi ích của Wumpuses ở mọi nơi.

package Hunters;

import Mechanics.*;

public class AntiHunter extends Hunter {

private boolean left;

public AntiHunter() {
    name = "Wumpus";
    this.left = true;
}

public void newGame() {
    this.left = true;
}

public void getResponse(boolean[] status) {
    if(status[4]) {
        nextMove = Move.SHOOT;
        nextDirection = Direction.HERE;
    }
    else if(status[2] || status[1]) {
        nextMove = Move.SHOOT;
        if(this.left) {
            this.left = false;
            nextDirection = Direction.LEFT;
        }
        else {
            this.left = true;
            nextDirection = Direction.RIGHT;
        }
    }
    else {
        nextMove = Move.MOVE;
        if(this.left)
            nextDirection = Direction.LEFT;
        else
            nextDirection = Direction.RIGHT;
    }
}

}



Điều tốt là đây không phải là mã golf. Đã tự hỏi sẽ mất bao lâu cho đến khi một bot Emo xuất hiện, lol.
DoctorHeckle

@Martin Lưu ý rằng đây không chỉ là tự tử. Trong số các bot có sẵn để thử nghiệm, nó không xếp hạng cuối cùng.
Michael Brandon Morris

1
EmoSolution luôn hài hước!
Mawg

2

Hoa cúc

Laomedon lang thang cố tình tìm kiếm một xác chết. Khi anh ta tìm thấy một cái và tìm ra nơi anh ta ở cùng một chỗ bên cạnh xác chết. Khi anh ta ngửi thấy Wumpus, anh ta bắn những mũi tên vào phòng của Corpse.

package Hunters;
import Mechanics.Direction;
import Mechanics.Hunter;
import Mechanics.Move;
public class Laomedon extends Hunter {
    private enum status
    {
        START,
        SEARCHED_LEFT,
        SEARCHED_RIGHT,
        INITIAL_CORPSE_LEFT,
        INITIAL_CORPSE_RIGHT,
        SMELT_CORPSE,
        CORPSE_BEHIND,
        CORPSE_LEFT
    }

    status myState;
    public Laomedon() {
        this.name = "Laomedon";
    }
    @Override
    public void getResponse(boolean[] status) {
        boolean wumpusNear = status[0];
        boolean hunterNear = status[1];
        boolean corpseNear = status[2];
        boolean arrowNear = status[3];
        boolean hunterHere = status[4];
        switch (myState) {
        case CORPSE_BEHIND:
            if(wumpusNear)
            {
                this.nextDirection = Direction.BACK;
                this.nextMove = Move.SHOOT;
            }
            else
            {
                this.nextDirection = Direction.HERE;
                this.nextMove = Move.MOVE;
            }
            break;
        case CORPSE_LEFT:
            if(wumpusNear)
            {
                this.nextDirection = Direction.LEFT;
                this.nextMove = Move.SHOOT;
            }
            else
            {
                this.nextDirection = Direction.HERE;
                this.nextMove = Move.MOVE;
            }
            break;
        case INITIAL_CORPSE_LEFT:
            if(corpseNear)
            {
                this.nextDirection = Direction.RIGHT;
                this.nextMove = Move.MOVE;
                this.myState = Laomedon.status.INITIAL_CORPSE_RIGHT;
            }
            else
            {
                this.nextDirection = Direction.BACK;
                this.nextMove = Move.MOVE;
                this.myState = Laomedon.status.SEARCHED_LEFT;
            }
            break;
        case INITIAL_CORPSE_RIGHT:
            if(corpseNear)
            {
                this.nextDirection = Direction.LEFT;
                this.nextMove = Move.MOVE;
                myState = Laomedon.status.INITIAL_CORPSE_LEFT;
            }
            else
            {
                this.nextDirection = Direction.BACK;
                this.nextMove = Move.MOVE;
                this.myState = Laomedon.status.SEARCHED_LEFT;
            }
            break;
        case SEARCHED_LEFT:
            if(corpseNear)
            {
                this.nextDirection = Direction.LEFT;
                this.nextMove = Move.MOVE;
                this.myState = Laomedon.status.SMELT_CORPSE;
            }
            else
            {
                this.nextDirection = Direction.RIGHT;
                this.nextMove = Move.MOVE;
                this.myState = Laomedon.status.SEARCHED_RIGHT;
            }
            break;
        case SEARCHED_RIGHT:
            if(corpseNear)
            {
                this.nextDirection = Direction.LEFT;
                this.nextMove = Move.MOVE;
                this.myState = Laomedon.status.SMELT_CORPSE;
            }
            else
            {
                this.nextDirection = Direction.LEFT;
                this.nextMove = Move.MOVE;
                this.myState = Laomedon.status.SEARCHED_LEFT;
            }
            break;
        case SMELT_CORPSE:
            if(corpseNear)
            {
                this.nextDirection = Direction.BACK;
                this.nextMove = Move.MOVE;
                this.myState = Laomedon.status.CORPSE_BEHIND;
            }
            else
            {
                this.nextDirection = Direction.BACK;
                this.nextMove = Move.MOVE;
                this.myState = Laomedon.status.CORPSE_LEFT;
            }
            break;
        case START:
            if(corpseNear)
            {
                this.nextDirection = Direction.LEFT;
                this.nextMove = Move.MOVE;
                this.myState = Laomedon.status.INITIAL_CORPSE_LEFT;
            }
            else
            {
                this.nextDirection = Direction.LEFT;
                this.nextMove = Move.MOVE;
                this.myState = Laomedon.status.SEARCHED_LEFT;
            }
            break;
        }
    }

    @Override
    public void newGame() {

        super.newGame();
        myState = status.START;
    }
}

Thật không may cho anh ta, những thợ săn khác không đánh giá cao kỹ năng của anh ta và họ dường như bắn anh ta rất nhiều ...


2

NealHunter

Sau khi nói chuyện này với bạn của tôi, DoctorHeckle, tôi nghĩ sẽ rất vui nếu tự mình thử nó. Đã sử dụng ý tưởng để xen kẽ trái và phải để bao phủ hầu hết khu vực, và sau đó quyết định thêm một chút phản hồi cho các trạng thái, nhưng chỉ 0 và 1 - có hay không một Wumpus hoặc thợ săn đang ở gần đó. Không hoạt động tốt như NrebHunter, điều làm tôi ngạc nhiên lúc đầu. Sau khi suy nghĩ, tôi nhận ra rằng bắn một mũi tên theo hướng ngẫu nhiên (như thế này) sau khi nghe một thợ săn / ngửi một con Wumpus sẽ không làm gì nếu chúng di chuyển theo hướng đó, vì mũi tên được bắn vào phòng, nhưng chuyển động được thực hiện trước khi nó giết chết họ. Không hoàn toàn hiệu quả như tôi nghĩ ... vẫn hoạt động tốt!

package Hunters;

import Mechanics.*;
import java.util.Random;

public class NealHunter extends Hunter {

    private boolean goLeft;

    public NealHunter(){
        name = "NealHunter";
        goLeft = false;
    }

    public void newGame() {
        goLeft = false;
    }

    public void getResponse(boolean[] status){

        Random rand = new Random();

        if(status[0] || status[1]){
            nextMove = Move.SHOOT;

            switch ( rand.nextInt(3) ){
                case 0:
                    nextDirection = Direction.LEFT;
                    break;
                case 1:
                    nextDirection = Direction.BACK;
                    break;
                case 2:
                    nextDirection = Direction.RIGHT;
                    break;
            }
        } else {
            nextMove = Move.MOVE;
            if (goLeft) {
                nextDirection = Direction.LEFT;
            } else {
                nextDirection = Direction.RIGHT;
            }

            goLeft = !goLeft;
        }
    }
}

1

Đi bộ

Người này đi bộ cho đến khi anh ta tìm thấy cái bướu. Sau đó, anh bắn ngay. Nếu wumpus vẫn còn đó, nó phải ở bên trái, vì vậy hãy bắn một lần nữa. Trên đường đi, anh ta không quan tâm đến những thợ săn hoặc xác chết khác, do đó có tên.

package Hunters;

import Mechanics.*;

public class WalkingIdiot extends Hunter {
    private boolean wumpusNear = false;

    @Override
    public void newGame() {
        wumpusNear = false;
    }

    public WalkingIdiot(){
        name = "WalkingIdiot";
    }

    @Override
    public void getResponse(boolean[] status){
        boolean wumpusWasNear = wumpusNear;
        wumpusNear = status[0];
        if (status[0]) {
            nextMove = Move.SHOOT;
            if (wumpusWasNear) {
                nextDirection = Direction.LEFT;
            } else {
                nextDirection = Direction.RIGHT;
            }
            return;
        }
        nextMove = Move.MOVE;
        nextDirection = Math.random() < 0.5 ? Direction.LEFT : Direction.RIGHT;
    }
}

Ở lại

Ở lại không thích đi bộ. Nó chỉ đơn giản là bắn xung quanh và nhớ nếu anh ta bắn một thợ săn.

package Hunters;

import Mechanics.*;

public class Stay extends Hunter {
    private Direction lastShot = Direction.LEFT;
    private Direction corpse = null;
    private boolean hunterNear = false;

    public Stay(){
        name = "Stay";
    }

    @Override
    public void newGame() {
        corpse = null;
        hunterNear = false;
        lastShot = Direction.LEFT;
    }

    @Override
    public void getResponse(boolean[] status){
        nextMove = Move.SHOOT;//always
        boolean hunterWasNear = hunterNear;
        hunterNear = status[1];

        if (hunterWasNear && status[2] && !status[1]) {
            corpse = lastShot;
        }

        if (status[0]) {
            if (corpse != null) {
                nextDirection = corpse;
                return;
            }
        }
        if ((status[1] && !status[4]) || status[0]) {
            switch (lastShot) {
                case LEFT: lastShot = nextDirection = Direction.RIGHT; break;
                case RIGHT: lastShot = nextDirection = Direction.BACK; break;
                case BACK: lastShot = nextDirection = Direction.LEFT; break;
            }
            return;
        }

        //default
        lastShot = nextDirection = Direction.LEFT;
    }
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.