Камень, Бумага, Ножницы Бот

На этой неделе в моем классе будет соревнование ботов, и мы должны сделать так, чтобы наши боты победили всех остальных ботов. Соревнование: камень, ножницы, бумага, динамит, воздушный шар. Динамит бьет все, кроме водяного шара, а водяной шар бьет только динамит. Учитель написал боевую арену и несколько других ботов, умного бота, бота-принтера (бумагу), случайного бота и своего бота, чтобы показать нам несколько примеров. Мне понравился умный бот, и я использовал его для создания своего, и, видимо, мне нужно сделать больше в своем боте. Я не знаю, что еще добавить и как сделать так, чтобы мой бот выигрывал. Мне также нужно следить за тем, сколько у меня динамита.

У меня такие вопросы: что добавить в бота, чтобы он выигрывал и как следить за динамитом? Вот мой бот:

public class herro1cb extends Bot {

public herro1cb(int dynamiteQuantity) {
    super(dynamiteQuantity);
    _dynamiteLeft = dynamiteQuantity;
    setName("Chelsea");
}

@Override
public Move doMove(Move opponentsPrior, int points) {


    switch( opponentsPrior ){
    case Dynamite:
        return _dynamiteLeft > 0 ? Move.Dynamite : Move.WaterBalloon;
    case WaterBalloon:
        return Move.Scissors;
    case Scissors:
        return Move.Rock;
    case Paper:
        return Move.Scissors;
    case Rock:
        return Move.Paper;
    default:
        return _dynamiteLeft > 0 ? Move.Rock : Move.Dynamite;
    }


}

}

Вот что расширено:

public abstract class Bot implements Comparable<Bot> {

private String _name;
protected int _dynamiteLeft = 0;

public Bot( int dynamiteQuantity ){
    _dynamiteLeft = dynamiteQuantity;
}


public String getName(){
    return this._name;
}
public void setName(String value){
    this._name = value;
}

public abstract Move doMove(Move opponentsPrior,int points);

public void reset(int dynamiteRenewal){
    _dynamiteLeft = dynamiteRenewal;
}


@Override
public int compareTo(Bot o) {
    return +Integer.compare( this.hashCode() , o.hashCode() );
}
}

Заранее спасибо!


person CBH    schedule 08.12.2013    source источник


Ответы (1)


Если все пытаются сделать бота, который «думает дальше соперника», то стоит постараться вести историю выбранных ходов. Попробуйте узнать, сколько итераций продумывает другой бот. Ничто не мешает вам оценивать всю историю ходов каждый ваш ход.

Говоря думает дальше оппонента, я имею в виду что-то вроде:

Я просто выбрал ножницы, но противник выбрал камень, поэтому он победил меня. Чтобы победить, я должен переодеться в бумагу, но противник узнает об этом и выберет ножницы. Чтобы превзойти его «умный» ход, выберите камень.

Если другие боты основаны на этом алгоритме, вы могли бы победить их, если бы узнали, на сколько итераций они думают вперед.

Я предполагаю, что вы не можете сделать что-то достаточно умное, чтобы победить случайного бота.

Примечание: Ваша логика прямо сейчас в коде в основном превосходит предыдущий ход противника.

person Martijn Courteaux    schedule 08.12.2013
comment
Я предполагаю, что вы не можете сделать что-то достаточно умное, чтобы победить случайного бота. Как можно победить случайного бота в традиционной RPS? Я понимаю, что в этой игре есть некоторые неслучайные компоненты (динамит/водяной шар), но можно ли победить случайного бота в RPS? - person graviton; 09.12.2013
comment
Так ты говоришь, что играй, каким бы ни был их последний ход. То есть, если они качают, я качаю в следующем раунде, и они играют в ножницы, а я играю в ножницы? - person CBH; 09.12.2013
comment
@CBH: Зависит от того, сколько итераций вы планируете впереди. Вы можете продолжать мыслить в том же духе. - person Martijn Courteaux; 09.12.2013