Rock, Paper, Scissors Bot

Моят клас има състезание за ботове тази седмица и ние трябва да направим нашите ботове, за да спечелим всички останали ботове. Състезанието е камък, хартия, ножица, динамит, воден балон. Динамитът побеждава всичко освен водния балон, а водният балон побеждава само динамита. Учителят написа бойната арена и някои други ботове, интелигентен бот, бот за принтер (хартия), произволен бот и неговия бот, за да ни покаже някои примери. Хареса ми интелигентния бот и го използвах, за да създам своя и очевидно трябва да направя повече в моя бот. Не съм сигурен какво друго да добавя и как да направя моя бот този, който печели. Също така трябва да следя колко динамит имам.

Въпросите ми са следните: какво мога да добавя към бота, за да печели и как да следя динамита? Ето моят бот:

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