The Great Wumpus Hunt


22

สมบูรณ์

ฤดูกาลของ Wumpus ได้สิ้นสุดลงแล้วและด้วยชีวิตของ Wumpus และนักล่าผู้กล้าหาญ เช่นเดียวกับบาง Hunters ที่ขี้ขลาดไร้ศีลธรรมและจริงจัง แต่ในตอนท้ายของวันนั้น NascarHunter โดย Dr Heckle ก็ออกมาพร้อมกับของขวัญและสง่าราศีมากที่สุด เราขอคำนับคุณโอผู้กล้า ... ผู้ขับขี่?

เป็นฤดูเปิดของ Wumpuses และนักล่าจากทั่วโลกต่างพากันไปที่ถ้ำ Wumpus เพื่อพยายามที่จะกำจัด Wumpus Pelts อันมีค่า

เกม

ขึ้นอยู่กับเกมHunt the Wumpusคลาสสิกที่มีรูปแบบไม่กี่

แผนที่

เฟ มีห้องทั้งหมด 20 ห้องแต่ละห้องเชื่อมต่อกับอีก 3 ห้องทำให้เป็นวงแหวน 3 วงโดยมีสะพานเชื่อมระหว่างกัน

The Wumpus

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

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

Enraged Wumpus: ถ้า Wumpus ถูกยิงเขาจะมีชีวิตรอด 20% และอาละวาดเป็นเวลา 3 วัน เมื่ออาละวาดเขาจะเคลื่อนที่แบบสุ่มวันละสองครั้ง แต่ก็ยังถูกดึงดูดไปยังศพ หลังจาก 3 วันเขาจะตาย ลูกธนูลูกที่สองจะฆ่า Wumpus ด้วย

พเนจร Wumpus: ในแต่ละวันหากไม่มีสิ่งใดกระตุ้น Wumpus เขามีโอกาส 25% ที่จะเคลื่อนไหว

นักล่า

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

นักล่ามีสองการกระทำ: ยิงหรือเคลื่อนย้าย นักล่าสามารถยิงธนูเข้าไปในห้องที่อยู่ติดกันหรือในห้องของเขาเองและเคลื่อนที่ไปในทำนองเดียวกัน

เพลย์

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

หลังจากนักล่าทุกคนเคลื่อนไหวแล้ว Wumpus จะตอบสนอง หากนักล่าได้ย้ายเข้ามาในห้องพร้อมกับ Wumpus Wumpus จะกินเขา / เธอ หาก Wumpus เคลื่อนไหวก็จะกินผู้อยู่ในห้องใหม่ด้วย

หลังจาก 100 วันหากนักล่าไม่ได้ฆ่า Wumpus หรือตกเป็นเหยื่อพวกเขาจะตายจากความอดอยากภายในถ้ำ

รหัส

รหัสที่มาทั้งหมดสามารถพบได้ที่นี่ การส่งทั้งหมดควรอยู่ใน Java ยกเว้นบางคนต้องการเขียนอะแดปเตอร์ stdIn / stdOut;)

บอตควรขยายคลาส Hunter ในการตั้งชื่อฮันเตอร์ของคุณให้เพิ่มคอนสตรัคเตอร์โดยไม่มีพารามิเตอร์ที่ตั้งค่าฟิลด์ชื่อ ไม่ตอบสนองแทนที่ฟังก์ชัน getResponse ในฟังก์ชั่นนี้ในแต่ละตาคุณจะถูกส่งผ่าน 5 บูลีนที่จะบอกคุณเกี่ยวกับสภาพแวดล้อมของคุณ

สถานะ 0 = "คุณได้กลิ่น wumpus"

สถานะ 1 = "คุณได้ยินนักล่าคนอื่น"

สถานะ 2 = "คุณได้กลิ่นศพ"

สถานะ 3 = "คุณได้ยินเสียงลูกศรกระทบกัน"

สถานะ 4 = "คุณรู้สึกว่าเป็นนักล่าคนอื่นในห้องเดียวกับคุณ"

คลาส Hunter มี 2 สล็อต: nextMove และ nextDirection ที่ใช้ enums Move และ Direction ตามลำดับ ย้ายสามารถย้ายหรือยิงการเร่าร้อนอาจเป็นซ้ายขวาย้อนกลับหรือที่นี่ เส้นทางมีความสอดคล้องความหมายย้อนกลับจะนำคุณกลับไปที่ห้องก่อนหน้าที่คุณอยู่เสมอและหากเข้ามาจากห้องเดียวกันซ้ายและขวาจะเหมือนเดิมเสมอ อย่างไรก็ตามหากคุณเข้ามาในทิศทางที่แตกต่างซ้ายและขวาจะนำคุณไปยังที่ต่างๆ

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

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

นักล่าสี่คนแข่งขันกันทีละคน หากถูกฆ่าตาย Wumpus pelt จะมีค่า 60 คะแนนโดยแบ่งให้เท่ากันในหมู่นักล่าที่รอดชีวิตทั้งหมด โรบินเต็มรูปแบบสไตล์ดังนั้นการรวมกันของนักล่า 4 คนจะเล่นด้วยกัน

มีตัวอย่าง Hunters 5 รายการ: 4 พร้อมฟังก์ชันการทำงานขั้นพื้นฐานและหนึ่งที่อนุญาตให้ผู้ใช้ป้อนเพื่อเล่นสำหรับการทดสอบ

หากคุณมีข้อเสนอแนะ / คำขอโปรดแจ้งให้เราทราบ!

อวสานอยู่ในสายตา!

ประชากรโลกของ Wumpus กำลังถูกล่าด้วยอัตราที่น่าตกใจ พระราชบัญญัติการป้องกันของเรา Wumpuses คาดว่าจะผ่านในวันพุธที่ 17 มิถุนายน หลังจากวันที่นี้จะไม่อนุญาตให้นักล่าสัตว์เข้ามาในถ้ำอีกแล้วจะมีการเลือกผู้ชนะ

ป้ายบอกคะแนน

หมายเหตุ:ฉันขอโทษมีข้อผิดพลาดในรหัสที่อาจทำให้ Hunters อยู่ตายผ่านเกมหลายเกม การแก้ไขมันไม่ได้เปลี่ยนการจัดอันดับโดยรวมเป็นอย่างมาก แต่ส่วนใหญ่จะเปลี่ยนสถิติ

คะแนนอยู่ในการทำงานของนักล่าแต่ละชุดในแต่ละเกม 1,000 NascarHunter และ FullCoverageHunter เป็นผู้นำและแม้ว่า AntiHunter ที่เพิ่มขึ้นจะให้ Wumpuses เพิ่มอัตราการเอาชีวิตรอด 2% พวกเขายังคงสั่นอยู่ที่เท้าดูดที่อัตราการรอดตาย 32% ของพวกเขา ลูกศรจากนักล่าเพื่อนเป็นภัยคุกคามที่ยิ่งใหญ่ที่สุดในถ้ำ

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
คุณสามารถยิงธนูด้วยธนูได้หรือไม่?
MegaTom

1
Yessir หรือตัวคุณเองถ้าคุณยิงธนูที่นี่
ดัมและอีฟ

1
แทนที่จะเป็นอาร์เรย์สำหรับ 5 บูลีนทำไมไม่เพียงแค่ส่งintค่า 0-31 เราเป็นเด็กชายตัวใหญ่ที่นี่เราสามารถทำการบิตได้ :)
DoctorHeckle

1
@DoctorHeckle แน่นอนว่าเราเป็น แต่ก็ยังเป็นมิตรกับนักพัฒนามากกว่าที่จะมีอาร์เรย์มากกว่า int ตัวเดียว ^^
Katenkyo

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

คำตอบ:


11

NascarHunter

ตรรกะไม่มากไป กฎของมันเรียบง่าย: เลี้ยวซ้ายดินเกรียมทำซ้ำ และเฮ้เขาอาจโชคดี!

8 มิถุนายนแก้ไข:

เพิ่มลอจิกเพิ่มเติมให้กับ Nascar เพื่อบัญชีการติดกับ Wumpus ที่สัมพันธ์กับการเคลื่อนไหวครั้งสุดท้าย คิดว่ามันเป็นจุดแวะพักเพื่อให้อยู่ในรูปแบบ ถ้ารู้สึกถึงวูปัสหลังจากยิงไปตามโถงทางเดินมันจะต้องมาถึงหนึ่งในสองห้องที่อยู่ติดกันเพราะมันจะตายจากการยิงของนักล่า มันช่วยให้ Wumpus 2 หันมาใช้ชีวิตอย่างมีประสิทธิภาพถ้ามันไม่เคลื่อนไหวอีกครั้งหรือ Nascar 1 หันกลับมาใช้ชีวิตถ้าเขายืนอยู่บนศพ นอกจากนี้ยังพิจารณาตัวเลือกที่สามหากเป็นเทิร์นแรก แต่เพียงครั้งเดียว ในที่สุดฉันจะย้ายไปที่ FCH ไม่ว่าง

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

ทำตามลัทธิความเชื่อที่เหมือนกันของ NascarHunter แต่สลับเส้นทางของเขาซึ่งรับประกันว่าจะสร้างเป็นวงยาว 10 ห้องที่ไม่เหมือนใคร เนื่องจากทุกห้องมีความเป็นเอกลักษณ์และเรายิงได้ทุกทิศทางต่อห้องทุกห้องจึงถูกยิงเข้า นี่เป็นเรื่องจริงสำหรับห้องเริ่มต้นใด ๆ (อ้างโดยโอนีลเพื่อนของฉันขอบคุณโอนีล!) Dodecahedra นั้นเท่มาก

ฉันต้องการจะชี้ให้เห็นว่านี่คือสิ่งที่แตกต่างจาก MonsterHunter เพื่อนของเราเนื่องจากเขาไม่ได้ใช้เล่ห์เหลี่ยมหรือ "ยุทธวิธี" ที่แท้จริง ความแข็งแกร่งของสิ่งนี้คือความจริงที่ว่าทุกห้องถูกยิงเข้ามาอีกครั้ง: วิธีการแก้ปัญหากำลังดุร้าย นี่เป็นเพียงทฤษฎีใน NascarHunter เนื่องจาก Nascar จะโจมตีเพียง 10 จาก 20 ห้องซึ่งครอบคลุมพื้นที่เพียงครึ่งเดียวเท่านั้น

11 มิถุนายนแก้ไข:

เพิ่มในรูปแบบตรรกะการตรวจสอบ Wumpus จาก NascarHunter ควรปรับปรุงคะแนนอย่างเป็นกลาง

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;

            }

        }

    }

}

แจ้งให้เราทราบหากมีข้อผิดพลาดใด ๆ แพ็คเกจไม่เล่นกับ IDE ของฉันได้ดี :(


1
ฉันค่อนข้างแน่ใจว่าสิ่งนี้ควรเรียกว่า MadMaxHunter เนื่องจากฉันไม่จำเชื้อชาตินาสคาร์ที่เกี่ยวข้องกับการยิงปืนระหว่างยานพาหนะมากเกินไป ดูเหมือนจะทำได้ดี!
Ralph Marshall

ฉันต้องใส่วงเล็บไปรอบ ๆ หัวซ้ายในคำสั่ง if เพื่อให้ FullCoverageHunter ทำงาน บอทของคุณทั้งคู่ทำได้ดีมาก - NascarHunter ดีกว่าเล็กน้อย
euanjt

ตัวแปร newGame ใน FullCoverageHunter ดูเหมือนจะไม่ถูกประกาศ ฉันเพิ่มบูลีน newGame ส่วนตัวและตั้งค่าเป็นจริงในเมธอด newGame () นั่นคือสิ่งที่คุณต้องการหรือไม่
Cain

@Cain อ้าว! ใช่การกำกับดูแลใหญ่จากฉันฉันจะแก้ไขมันในที่นี่ไม่ดีของฉัน
DoctorHeckle

7

รบกวน

เขาไม่ชอบผู้เยี่ยมชม

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

"Shhh. ต้อง vewy vewy เงียบฉันกำลังตามล่า"

เอลเมอร์ถูกจับจ้องอยู่ที่เหยื่อและไม่สนใจทุกสิ่งยกเว้นศพและ Wumpus เขาพยายามที่จะหาศพแล้วถอยออกมาและเริ่มยิง หากเขามีกลิ่นของ Wumpus เขาจะถอยออกไปและถ้าเขายังมีกลิ่นเขาจะยิง

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

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;
        }

    }
}

ผู้รักความสงบ

ผู้ชายคนนี้มีศีลธรรมกับกีฬาประเภทใดก็ตามและสงสัยว่าเขาจะปรากฏตัวในสถานการณ์เช่นนี้ได้อย่างไร เขาจะวิ่งหนีจากการติดต่อใด ๆ และจะไม่ยิง

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
ฉันคิดว่ามันอาจใช้ได้ สิ่งที่คุณต้องทำในเกมคือหวังว่าใครบางคนจะได้รับ wumpus ก่อนที่มันจะทำให้คุณได้รับและคุณจะได้รับเครดิตเต็ม
Ralph Marshall

1
นั่นคือความคิดทั่วไป ปล่อยให้คนอื่นทำงานหนัก :-)
MickyT

1
นั่นเป็นสาเหตุที่ฉันรอให้คุณเขียนโค้ดถึงแม้ว่าฉันจะคิดถึงมันเป็นครั้งแรก :-)
Mawg

5

MonsterHunter

เรากำลังตามล่าสัตว์ประหลาดและเราคือ 4 ... มันทำให้ฉันนึกถึงเกมที่ฉันชอบ! นายพรานคนนี้จะเดินไปตามแผนที่ส่วนใหญ่โดยเลื่อนไปทางซ้ายหรือขวาและถ้า Wumpus อยู่ใกล้ ๆ เขาจะล่อลวงเขาโดยย้อนกลับเพื่อให้สามารถระบุได้อย่างแม่นยำว่าเป็นอย่างไร

ฉันสามารถกำจัด lastDirection แต่ฉันเก็บความหมายและการอ่าน :) จริงๆแล้วมันตายไปเยอะมาก แต่ผู้ควบคุมมักจะวางนักล่า 2/3 ไว้ในห้องเดียวกันในตอนเริ่มต้นและบ่อยครั้งที่ Wumpus ใกล้ ๆ (อาจอยู่ในห้องเดียวกัน) ... ดังนั้น insta death ^^ '

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];
    }
}

ขอบคุณสำหรับการชี้ให้เห็นว่าตัวควบคุมได้รับการแก้ไขเพื่อให้ผู้โดยสารแต่ละคนมีการเริ่มต้นที่ไม่ซ้ำกัน
Cain

4

PacingHunter

ไปมาระหว่างห้องไป ถ้ามันมีกลิ่น Wumpus หรือได้ยินผู้เล่นมันจะยิงไปทางซ้าย ถ้า Wumpus อยู่ข้างๆเขาเริ่มต้นจากที่เขายิงห้องเขาจะย้ายไป

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 กลัวทุกอย่าง ถ้ามันมีกลิ่นปากหรือศพหรือได้ยินลูกศรหรือนักล่ามันจะวิ่งไปในทิศทางที่สุ่ม ไม่เช่นนั้นมันจะทำให้ลูกศรยิงในทิศทางที่สุ่ม

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
ฮ่า ๆ ๆ ฉันไม่รู้ว่านี่เป็นการจงใจหรือไม่ แต่เขาจะทำให้เขากลัวโดยการยิงธนูแล้ววิ่ง
Cain

4

กินหน่อและใบ

นักล่าตัวนี้ไม่ได้กินอะไรเลย แต่เราจะยิงถ้า Wumpus เป็นเรื่องเกี่ยวกับหรือเราทิ้งไว้บนเส้นทางที่หวังว่าจะป้องกันเราไม่ให้เดินเป็นวงกลม

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 นั้นค่อนข้างง่าย - ถ้า Wumpus หรือนักล่าคนอื่นอยู่ใกล้ ๆ เขาก็ยิงไฟไปทุกที่และสวดภาวนาว่าเทพีแห่งการล่าอยู่ข้างๆ ถ้าเขาอยู่ใกล้ศพเขาก็รอคอย Wumpus อยู่ เขาไม่ชอบนักล่าคนอื่นและจะหนีไปถ้าพวกเขาเริ่มยิงธนูใกล้เขาหรือถ้าพวกเขาอยู่ในห้องเดียวกับเขา ในที่สุดถ้าเขารู้สึกเบื่อเขาจะสุ่มเดินไปตามทางเดินนิรันดร์

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(){}



}

ระวัง: ตาม @Cain คุณสามารถยิงตัวเองถ้าคุณยิงเข้าไปในห้องของคุณเอง
DoctorHeckle

3

Emo Wumpus (ฮันเตอร์)

Emo Wumpuses (เกี่ยวข้องกับEmo Wolvesซึ่งบางครั้งใช้ปืนและเครื่องบินบิน ) เกลียดทุกอย่าง (โดยเฉพาะ Java) พวกเขาไม่แยกความแตกต่างระหว่าง Hunters และ Wumpuses และพยายามยิงพวกมันเหมือนกันทั้งหมด พวกเขายังเกลียดคนขับนาสคาร์และจะยิงถูกต้องเสมอ หากไม่มีใครอยู่ใกล้ที่จะยิงพวกเขาก็จะย้ายไปทางขวา แต่จะทำสิบสามครั้งติดต่อกันก่อนที่พวกเขาจะรู้สึกหดหู่มากขึ้นเกี่ยวกับการอยู่คนเดียวและพยายามที่จะยิงตัวเอง ในระดับ 99 หากพวกเขายังมีชีวิตอยู่พวกเขาจะพยายามยิงตัวเองเพราะความอดอยากเป็นวิธีที่ทำให้ตายได้

Wumpuses มีขนาดใหญ่ (และหนักกว่า) มากกว่า Wolves แต่อันนี้ยังคงอดอาหารอยู่ที่ 424 ไบต์ (เมื่อเทียบกับ NascarHunter ขนาดหนัก 2.72 kb ของ NascarHunter)

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++;}}

ทำไมไม่ฆ่าตัวตายตั้งแต่แรกล่ะ? Emo Wumpuses เชื่อว่าการกระทำที่ดีอย่างหนึ่งที่ทำได้คือยุติความทุกข์ของผู้อื่นก่อนที่จะฆ่าตัวตาย ดังนั้นพวกเขาจะฆ่าทุกสิ่งที่ทำได้ก่อนถึงเวลาที่จะตาย

Wumpus? (anti-Hunter)

อืม, Wumpus กำลังทำอะไรกับนักล่าชื่อ? ผู้ชายคนนี้โกรธมากที่มนุษย์ฆ่าญาติของเขาดังนั้นเขาจึงตัดสินใจที่จะแต่งตัวเป็นหนึ่งในนั้นและเข้าร่วมในการตามล่า เป้าหมายหลักของเขาคือการฆ่านักล่า เขาพยายามที่จะซ่อนตัวอยู่ใกล้ศพซึ่งจะทำให้เขามีโอกาสที่โล่จากนักล่า หากไม่มีนักล่าอยู่ใกล้ ๆ เขาจะเคลื่อนที่ไปในทิศทางหนึ่งจนกว่าจะได้รับการตรวจจับจากนักล่าซึ่งในกรณีนี้เขาจะพยายามฆ่าพวกเขาก่อนที่จะเคลื่อนที่ไปในทิศทางอื่น

น่าเสียดายที่ Wumpuses ส่วนใหญ่นั้นโง่และยังคงพยายามฆ่าเขา เขาคำนึงถึงการเสียสละที่จำเป็นเพื่อประโยชน์ของ Wumpuses ทุกแห่ง

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;
    }
}

}



สิ่งที่ดีนี่ไม่ใช่รหัสกอล์ฟ สงสัยว่ามันจะนานแค่ไหนจนกระทั่งบอทของ Emo ปรากฏขึ้นฮ่า ๆ
DoctorHeckle

@Martin โปรดทราบว่านี่ไม่ใช่แค่การฆ่าตัวตาย จากบอตที่พร้อมสำหรับการทดสอบมันไม่ได้อันดับสุดท้าย
Michael Brandon Morris

1
EmoSolution ตลกเสมอ !
Mawg

2

Laomedon

Laomedon เดินอย่างไร้จุดหมายเพื่อค้นหาศพ เมื่อเขาพบแล้วพบว่ามันอยู่ที่ไหนเขาก็อยู่ในที่เดียวกันถัดจากศพ เมื่อเขาได้กลิ่น Wumpus เขาก็ยิงธนูเข้าไปในห้องของศพ

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;
    }
}

โชคไม่ดีสำหรับเขานักล่าคนอื่น ๆ ไม่ชื่นชมทักษะของเขาและดูเหมือนว่าจะยิงเขามาก ...


2

NealHunter

หลังจากพูดถึงเรื่องนี้กับ DoctorHeckle เพื่อนของฉันฉันคิดว่ามันคงจะสนุกถ้าได้ลองด้วยตัวเอง ใช้ความคิดในการสลับซ้ายและขวาเพื่อครอบคลุมพื้นที่ส่วนใหญ่แล้วตัดสินใจเพิ่มการตอบสนองต่อรัฐเล็กน้อย แต่มีเพียง 0 และ 1 - ไม่ว่าจะมี Wumpus หรือนักล่าอยู่ใกล้ ๆ หรือไม่ ไม่ทำงานเช่นเดียวกับ NascarHunter ซึ่งทำให้ฉันประหลาดใจในตอนแรก หลังจากคิดมาบ้างแล้วฉันก็ตระหนักว่าการยิงลูกศรไปในทิศทางที่สุ่ม (เช่นนี้) หลังจากได้ยินนักล่า / การดมกลิ่นวูมัสจะไม่ทำอะไรเลยถ้าพวกมันเคลื่อนที่แบบนั้นเนื่องจากลูกธนูถูกยิงเข้าห้อง จะดำเนินการก่อนที่มันจะฆ่าพวกเขา ไม่ค่อยมีประสิทธิภาพเท่าที่ฉันคิด ... ยังคงทำงานได้ดี!

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

WalkingIdiot

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

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;
    }
}

เข้าพัก

อยู่ไม่ชอบเดิน มันจะยิงไปรอบ ๆ และจำได้ถ้าเขายิงนักล่า

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