Büyük Wumpus Avı


22

TAMAMLAYINIZ

Wumpus mevsimi sona ermişti ve birçok kısır Wumpus ve cesur Hunter'ın hayatı ile birlikte. Bazıları korkakça, ahlaksız ve düpedüz aptal Avcılar. Ancak günün sonunda, Dr Heckle tarafından NascarHunter, en fazla yağma ve şan ile uzaklaştı. Sizi selamlıyoruz, oh cesur ... şoför?

Wumpuses'ta açık sezon ve dünyanın dört bir yanından gelen avcılar, değerli Wumpus Pelts'ten zengin olmak için Wumpus Mağaralarına akın ediyor.

Oyun

Klasik Hunt Wumpus oyunu, birkaç varyasyon ile.

Harita

Bir on iki yüzlü . Her biri diğer 3 odaya bağlı 20 oda var ve aralarında köprü bulunan 3 adet halka var.

Wumpus

Wumpus mistik bir canavardır. Hiçbiri nasıl göründüğünden emin değil, ancak hepsi vahşi olduğu konusunda hemfikir. Wumpus mağaralarda yaşar ve ölü şeyleri yemeyi sever. Wumpus'un yanındaki bir mağarada bir ceset varsa, oraya taşınacak ve onu yiyecektir. Wumpus avcıları içeren bir mağaraya girerse, onları da öldürecek ve yiyecektir. Wumpus yanında bir ok duyarsa, panikleyecek ve rastgele bir odaya girecektir.

İsteğe bağlı özellikler : Bunlar şu anda oyunu daha ilginç hale getirmek için dahil edilmiştir, ancak çok fazla rastgelelik eklerse popüler istek üzerine kaldırılabilir.

Öfkeli Wumpus: Wumpus vurulursa, 3 gün hayatta kalma ve azarlama oranının% 20'si vardır. Azarlarken, günde iki kez rastgele hareket eder, ancak yine de cesetlere çekilir. 3 gün sonra ölecek. İkinci bir ok atışı da Wumpus'u öldürür.

Dolaşan Wumpus: Her gün, başka hiçbir şey Wumpus'u tetiklemezse,% 25'lik bir hareket şansı vardır.

Avcılar

Aynı anda mağaralara dört avcı girebilir. Mağaralar karanlıktır, bu nedenle avcılar göremez, ancak diğer duyularını kullanabilirler. Avcılar Wumpus'u bitişik bir odada koklayabilir, bitişik bir odada bir ceset kokusunu alabilir, bitişik odalarda hareket eden diğer avcıları duyabilir ve bir okun bitişik odaya atılıp atılmadığını duyabilir.

Avcıların iki hareketi var: Vur ya da hareket et. Bir avcı bitişik bir odaya veya kendi odasına bir ok atabilir ve benzer şekilde hareket edebilir.

Oynanış

Her turda avcılar önce çevrelerini not eder ve sonra bir hamle yapar. Hareket, oklardan önce gerçekleşir, böylece bir ok bir avcının hareket ettiği bir odaya çekilirse, avcı hayatta kalır. Tüm avcı hamleleri yapıldıktan sonra oklar değerlendirilir. Tek bir yolcu ve ok aynı odada ise, yolcu vurulacak ve ölecektir. İki veya daha fazla kişi bir odayı paylaşırsa, rastgele biri vurulacak ve ölecektir. Not: Cesetler işgalcilerdir, bu nedenle ölü bir beden kısmi kalkan görevi görebilir.

Tüm avcı hareket ettikten sonra, Wumpus cevap verecektir. Eğer bir avcı Wumpus ile odaya taşınmışsa, Wumpus onu yer. Wumpus hareket ederse, yeni odanın sakinlerini de yer.

100 gün sonra, eğer avcılar Wumpus'u öldürmediyse ya da düşmüş kurban değilse, mağaralarda açlıktan öleceklerdir.

Kod

Tüm kaynak kodlarını burada bulabilirsiniz . Birisi bana bir stdIn / stdOut bağdaştırıcısı yazmak istemiyorsa, tüm gönderimler Java ile yazılmalıdır.

Botlar, Hunter sınıfını genişletmelidir. Hunter'ınızı adlandırmak için ad alanını ayarlayabilecek parametrelere sahip olmayan bir yapıcı ekleyin. Yanıtlamak için, getResponse işlevini geçersiz kılın. Bu fonksiyonda, her turda size çevreniz hakkında bilgi veren 5 boolean dizisinden geçirileceksiniz.

status 0 = "Bir wumpus kokuyorsun"

status 1 = "Başka bir avcı duyuyorsun"

status 2 = "Bir ceset kokuyorsun"

status 3 = "Bir ok takırtı duyarsınız"

status 4 = "Sizinle aynı odada başka bir avcı hissediyorsunuz"

Hunter sınıfı 2 yuvaya sahiptir: nextMove ve nextDirection, sırasıyla enums Move ve Direction değerlerini kullanır. Taşı, MOVE veya SHOOT olabilir, sayma SOL, SAĞ, GERİ veya BURAYA olabilir. Yol tarifleri tutarlıdır, yani geri dönüş sizi her zaman içinde bulunduğunuz önceki odaya döndürür ve aynı odadan girerseniz, SOL ve SAĞ her zaman aynı olur. Ancak, farklı bir yönden girerseniz, SOL ve SAĞ sizi farklı yerlere götürür.

Kendi yöntemlerinizi de uygulamaktan çekinmeyin. Tüm turnuva boyunca hafıza kalıcıdır, yani avcınız yalnızca bir kez oluşturulur. Ancak, her turun başında, avcınıza yeni bir oyun başladığını bildirmek için newGame () yöntemi çağrılır.

puanlama

Bir seferde dört avcı yarışıyor. Öldürülürse, Wumpus pelt'i hayatta kalan tüm avcılar arasında eşit olarak bölünmüş 60 puan değerindedir. Tam tur robin tarzı, bu yüzden 4 avcının her kombinasyonu birlikte oynayacak.

5 örnek Avcı dahil edilmiştir: 4'ü çok temel işlevselliğe sahip ve bir tanesi test amacıyla kullanıcı girdisinin oynamasını sağlayan.

Herhangi bir öneriniz / talebiniz varsa, lütfen bana bildirin!

Son görünürde!

Dünyalar Wumpus popülasyonu endişe verici bir oranda avlanıyor. Wumpuse'larımızı Koruma Yasası'nın 17 Haziran Çarşamba günü kabul edilmesi bekleniyor. Bu tarihten sonra mağaralarda daha fazla avcıya izin verilmeyecek ve bir kazanan seçilecektir.

sayı tahtası

Not: Özür dilerim, kodda Hunters'ın birden fazla oyunda ölü kalmasına neden olabilecek bir hata vardı. Bunu düzelttikten sonra, genel sıralamayı çok fazla değiştirmez, ancak istatistikleri büyük ölçüde değiştirir.

Skorlar, her avcı setini 1000 oyunda kullanıyor. NascarHunter ve FullCoverageHunter pakete liderlik ediyor ve AntiHunter'ın eklenmesi Wumpuses'a% 2'lik bir hayatta kalma artışı sağlasa da, hala en az 32% hayatta kalma oranlarıyla engebeli ayaklarında sallanıyor. Avcı dostlarımdan gelen oklar, mağaralardaki en büyük tehdit.

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
Ok ile başka bir avcıya vurabilir misin?
MegaTom

1
Yessir, ya da BURAYA bir ok vurursanız kendiniz
Cain

1
5 boolean dizisi yerine, neden yalnızca int0-31 değerinde bir iletiyi geçmiyor ? Biz burada koca
oğlanız,

1
@DoctorHeckle Elbette öyleyiz, ancak hala tek bir int ^^ yerine bir diziye sahip olmak daha da uygun.
Katenkyo

1
Oklar ve cesetler için, eğer biriyle aynı odadaysanız, bitişiğindeki ile aynı durumu elde edersiniz. Avcılar odanın yanında ya da odanın içinde olmayı ayırt edebileceklerinizdir.
Cain

Yanıtlar:


11

NascarHunter

Çok mantıklı değil. Kuralları basit: sola dönün, kavurucu dünya, tekrarlayın. Ve, hey, şanslı olabilir!

8 Haziran düzenleme:

Son hamlesine göre bir Wumpus'a komşu olduğunu hesaba katarak Nascar'a ek bir mantık içinde eklendi. Temada kalmak için bir pit stop düşünün. Koridordan aşağı vurduktan sonra bir Wumpus hissederse, avcının yeni çektiği atıştan ölmüş olacağından diğer iki bitişik odadan birine girmiş olmalı. Etkin bir şekilde tekrar hareket etmezse Wumpus 2 dönüşlerini ya da bir ceset üzerinde durursa Nascar 1 dönüşlerini etkili bir şekilde verir. Ayrıca, ilk sırayı, ancak bir kez ise üçüncü bir seçenek için hesaplar. Sonunda FCH'ye geçeceğim, meşgulüm.

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'ın aynı inancını izler, ancak 10 benzersiz oda uzunluğunda bir döngü oluşturması garanti olan pattasını değiştirir. Her oda benzersiz olduğundan ve oda başına her yöne ateş ettiğimiz için tüm odalar ateşlenir. Bu, herhangi bir başlangıç ​​odası için geçerlidir (arkadaşım Neal tarafından kabul edilir, teşekkürler Neal!). Dodecahedra bu şekilde oldukça havalı!

Herhangi bir hile veya herhangi bir gerçek "taktikleri" denemediği için bunun arkadaşımız MonsterHunter'dan farklı olduğunu belirtmek isterim. Bunun gücü, her odanın tekrar ateşlenmesi gerçeğidir: kaba kuvvet çözümü. Bunun NascarHunter'da teorik bir ayağı var, çünkü Nascar 20 odadan sadece 10'unu vuracak ve bu alanın sadece yarısını kaplayacak.

11 haziran düzenleme:

NascarHunter'dan Wumpus saptama mantığı düzenine eklendi. Objektif olarak skoru arttırmalı.

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;

            }

        }

    }

}

Herhangi bir hata varsa bana bildirin, paket IDE :( ile güzelce oynamadı


1
Bunun MadMaxHunter olarak adlandırılması gerektiğinden eminim, çünkü araçlar arasında silah sesi içeren çok fazla NASCAR yarışını hatırlamıyorum. İyi görünüyor!
Ralph Marshall,

FullCoverageHunter'ın çalışabilmesi için ifLifrlerinde baş farının etrafına parantez koymak zorunda kaldım. Her iki botunuz da çok iyi iş yapıyor- NascarHunter biraz daha iyi
euanjt

FullCoverageHunter'daki newGame değişkeni asla bildirilmemiş gibi görünüyor. Özel bir boolean newGame ekledim ve bunu newGame () yönteminde true olarak ayarladım.
Cain

@Cain boğmaca! Evet benden büyük nezaket, ben burada düzenleyeceğim, benim kötü.
DoktorHeckle

7

Porsuk

Ziyaretçileri sevmiyor.

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

"Şşşt. Sessiz ol vedala, wumpus avladım"

Elmer avına sabitlenir ve cesetler ve Wumpus hariç her şeyi görmezden gelir. Bir ceset bulmaya çalışır, sonra geri çekilir ve ateş etmeye başlar. Bir Wumpus kokusu alırsa geri çekilir ve onu hala koklarsa vurur.

Java programcılarından özür dilerim, bu muhtemelen son derece çirkin, sözdizimi hataları dolu ve muhtemelen mantığımı mahvetti.

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

    }
}

barışsever

Bu adam ahlaki olarak her türlü kan sporuna karşı ve bu durumda nasıl ortaya çıktığını merak ediyor. Her türlü temastan kaçacak ve asla çekim yapmayacak.

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
Bence bu işe yarayabilir. Bir oyunda yapmanız gereken tek şey, birisinin size ulaşmadan önce wumpusu alabilmesi ve tam kredi alabilmesidir.
Ralph Marshall,

1
Genel fikir buydu. Başkalarının zor işi yapmasına izin ver :-)
MickyT

1
Bu yüzden, önce onu düşünmeme rağmen, bunu
kodlamanızı bekledim

5

Canavar avcısı

Bir canavarı avlıyoruz ve 4'üz ... Bana en sevdiğim oyunu hatırlatıyor! Bu avcı, haritanın çoğuna alternatif olarak sol-sağa hareket ederek yürüyecek ve Wumpus yakındaysa, tam olarak öyle olduğunu tespit edebilmek için geriye doğru giderek onu cezbedecektir.

LastDirection'dan kurtulabilirim, ama anlambilim ve okunabilirlik için saklarım :). Aslında, çok fazla ölüyor, ancak kontrolör başlangıçta aynı odaya sık sık 2/3 avcı koydu ve sıklıkla Wumpus ile birlikte (aynı odada da olabilir) ... yani insta ölümü ^ ^ '.

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

Buna dikkat çektiğiniz için teşekkürler, her bir yolcunun benzersiz bir başlangıcı olacak şekilde kontrolör sabitlendi
Cain

4

PacingHunter

Odaların arasında ileri geri. Bir Wumpus kokuyorsa veya bir oyuncuyu duyarsa sola ve sağa vurur. Eğer bir Wumpus onunla başlamak için yanına gelirse, o odaya ateş eder.

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

Korkak kedi

ScaredyCat her şeyden korkuyor. Bir wumpus veya bir ceset kokuyorsa veya bir ok ya da avcı duyarsa, rastgele bir yöne koşar. Aksi takdirde, okları rasgele yönlere doğru çekerek tutar.

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
Lol Bunun kasıtlı olup olmadığını bilmiyorum ama okları vurarak kendini korkutacak ve kaçacak.
Cain

4

Sürgünler ve Yapraklar Yiyor

Dilbilgisi kitap ününün Panda'sından farklı olarak, bu avcı aslında hiçbir şey yemiyor, ancak ya Wumpus'un üzerindeyse ateş ediyoruz ya da bizi çevrelerden yürümemizi engelleyecek bir iz bırakıyoruz.

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 oldukça basittir - Wumpus ya da başka bir avcı yakındaysa, her yere ateş açar ve av tanrıçasının kendi tarafında olduğunu söyler. Bir ceset yakınındaysa Wumpus'u bekler. Diğer avcıları sevmez ve yanına ok atmaya başlarlarsa veya onunla aynı odada kalırlarsa kaçarlar. Sonunda sıkılıyorsa, ebedi koridorları rasgele hızlandırır.

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



}

Dikkatli olun: @Cain'e göre, kendi odanıza ateş açarsanız kendinizi vurabilirsiniz.
DoctorHeckle

3

Emo Wumpus (Avcı)

Emo Wumpuses ( bazen silah kullanan ve uçakları uçan Emo Kurtları ile ilgili) ) her şeyden (özellikle Java) nefret ediyor. Avcılar ve Wumpuslar arasında ayrım yapmıyorlar ve hepsini aynı şekilde çekmeye çalışıyorlar. Ayrıca Nascar sürücülerinden nefret ediyorlar ve her zaman doğru atış yapacaklar. Eğer kimse ateş etmek için etrafta dolaşmıyorsa, doğru hareket ederler, ancak bunu yalnız üst üste binmek için daha fazla depresyona girmeden ve kendilerini vurmaya çalışmadan önce sadece on üç kez yaparlar (on üçü şanssız bir sayıdır). 99 yaşındayken, eğer hala hayattalarsa, kendilerini vurmaya çalışacaklar çünkü açlık ölmek için çok topal bir yol.

Wumpuslar Kurtlardan daha büyük (ve daha ağır), fakat bu hala 424 bayta aç kaldı (ağır 2.72 kb NascarHunter'ın aksine).

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

Neden sadece ilk olarak intihar etmiyorsun? Emo Wumpus'lar yapabilecekleri iyi olanın, kendilerini öldürmeden önce başkalarının acı çekmesine son vermek olduğuna inanıyor. Bu nedenle, ölme zamanı gelmeden önce ellerinden geleni öldürürler.

Wumpus? (Anti-Hunter)

Wumpus avcı listesinde ne yapıyor? Bu adam insanların akrabalarını öldürdüğü için çok sinirlendi, bu yüzden onlardan biri olarak giyinmeye ve avlanmaya katılmaya karar verdi. Asıl amacı sadece avcıları öldürmektir. Avcılardan kalkanlara şans tanıyacak cesetlerin yakınında saklanmaya çalışıyor. Yakında avcı yoksa, avcılar tespit edilinceye kadar bir yöne doğru hareket eder, bu durumda diğer yöne hareket etmeden önce onları öldürmeye çalışır.

Ne yazık ki, çoğu Wumpus aptaldır ve hala onu öldürmeye çalışacaktır. Her halükarda, Wumpus'ların iyiliği için her yerdeki fedakarlıklarını gerekli görüyor.

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

}



İyi ki bu kod golf değil. Bir Emo botu ortaya çıkana kadar ne kadar süreceğini merak ediyordum, lol.
DoctorHeckle

@Martin Bunun sadece intihar olmadığını unutmayın. Test için uygun olan botlardan, en son sırada yer almadı.
Michael Brandon Morris

1
EmoSolution her zaman eğlencelidir!
Mawg

2

Laomedon'un

Laomedon amaçsızca bir ceset bulmaya çalışırken dolaşıyor. Bir tanesini bulup, cesedinin yanında aynı yerde kaldığı yerde çalışır. Wumpus'u kokladığında, okları Ceset'in odasına fırlatır.

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

Maalesef onun için, diğer avcılar yeteneklerini takdir etmiyor ve onu çok vuruyor gibi görünüyorlar ...


2

NealHunter

Bu konuda arkadaşım DoctorHeckle ile konuştuktan sonra, kendim denemenin eğlenceli olacağını düşündüm. En fazla alanı kaplamak için sola ve sağa dönme fikrini kullandı ve sonra durumlara bir miktar cevap vermeye karar verdi, ancak sadece 0 ve 1 - yakınlarda bir Wumpus veya avcı olsun. İlk başta beni şaşırtan NascarHunter kadar iyi değil. Bazı düşüncelerden sonra, bir okuyucuyu rastgele bir yönde (bu şekilde olduğu gibi) okutmanın, bir Wumpus'u kokladığında bir avcıyı duyduktan sonra okları odalara vurdukları için hareket ediyorlarsa hareket ederse hiçbir şey yapmayacağını fark ettim. onları öldürmeden önce gerçekleştirilir. Düşündüğüm kadar etkili değil ... yine de iyi performans gösteriyor!

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

Bu, wumpusu bulana kadar yürüyor. Sonra doğru vuruyor. Wumpus hala oradaysa, solda olmalıdır, bu yüzden bir kez daha ateş edin. Yolda, diğer avcıları ya da cesetleri umursamıyor, dolayısıyla adı.

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

Kalmak

Kalmak yürümeyi sevmez. Basitçe vuruyor ve bir avcıyı vurup vurmadığını hatırlıyor.

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;
    }
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.