King of the Hill - Liar's Dice


22

Liar's Dice è un gioco di dadi abbastanza semplice. Ho visto alcune diverse varianti delle regole, ma ecco la versione con cui ho più familiarità:

  • Ogni giocatore inizia con 5d6
  • Tranne quando si calcola il dado alla fine di un round, ogni giocatore può vedere i propri dadi, ma non quelli di qualsiasi avversario
  • All'inizio di un dato round, tutti i giocatori lanciano qualsiasi dado che abbiano attualmente
  • Quindi, un giocatore (di solito, questo è il vincitore del round precedente O il giocatore alla sinistra del giocatore che ha iniziato l'ultima volta; useremo il primo per questo KotH; con un giocatore a caso che inizia il primo round) fa un'ipotesi sul numero di un determinato numero sul tavolo (ONES ARE WILD)
  • Le offerte continuano a destra, andando sempre più in alto (per esempio; 3 cinque, 3 sei e 4 due sono tutti più alti di 3 quattro, ma 3 tre non lo sono; 4 uno è anche più alto, ma l'offerta su uno probabilmente ti metterà a un svantaggio); fino a quando un giocatore non lo chiama bugiardo
  • A questo punto, tutti i giocatori rivelano i loro dadi e contano il numero dell'ultima offerta numerica sul tavolo
  • Se il totale è inferiore all'offerta, il giocatore che ha fatto l'offerta deve dare un dado al giocatore che li ha definiti bugiardi, altrimenti il ​​giocatore che ha definito l'offerente un bugiardo deve dare un dado all'offerente (quindi l'offerente vince se il loro numero è almeno pari a quello che aveva offerto, non deve esserci il numero esatto)
  • Quando finisci i dadi, perdi
  • Vince l'ultimo giocatore in piedi

Per esempio:

Il giocatore uno ha 1,1,2,4,6
Il giocatore due ha 1,2,2,3,5
Il giocatore tre ha 1,3,3,4,6
Giocatore uno: tre sei.
Giocatore due: quattro due.
Giocatore tre: quattro tre.
Giocatore uno: cinque due.
Giocatore due: sei due.
Giocatore tre: sei tre.
Giocatore uno: sei quattro.
Giocatore due: bugiardo!
Rivelano i loro dadi e contano quelli (perché quelli sono selvaggi) e i quattro.
Si scopre che ci sono, in effetti, esattamente sei fours.
Quindi il giocatore due dà al giocatore uno un dado.
Ritirano e il giocatore uno inizia il round successivo.

Devi scrivere un bot per giocare a questo gioco. Deve implementare la seguente classe java astratta:

public abstract class Player {
    public Player() {}
    public String toString() {
        return this.getClass().getSimpleName();
    }
    public abstract String bid(int yourId, int[] diceEachPlayerHas, int[] yourDice, String[] bids);
}
  • È necessario implementare il metodo di offerta
    • Il primo argomento è la posizione corrente del tuo bot nell'ordine del turno, il secondo è un array che mostra quanti dadi ha attualmente ciascun giocatore (incluso te stesso), il terzo è un array che mostra i valori attualmente mostrati sui tuoi dadi, e il quarto è un array di tutte le offerte fatte dall'inizio del round corrente - avrà lunghezza 0 se stai facendo la prima offerta del round
    • L'output dovrebbe essere una stringa del formato "numero faccia" o la stringa "Bugiardo!" per chiamare bugiardo il precedente offerente.
    • Se il tuo output è formattato illegalmente, verrai eliminato.
  • È possibile ignorare il metodo toString, ma non è necessario. Tuttavia, non è possibile modificarlo in alcun modo che interferisca con la leggibilità dell'output del controller.
  • È consentito chiamare qualsiasi altro metodo pubblico del controller, ma non il suo metodo principale.
  • Puoi leggere e modificare solo i file nella directory in esecuzione con il prefisso del nome del tuo bot
  • Non è consentito ricevere input da qualsiasi altra fonte
  • Le variabili di istanza vengono ripristinate all'inizio di ogni nuovo gioco, ma non le variabili statiche.

punteggio

  • Un set di 1.000 giochi, con 3-5 giocatori ciascuno, verrà simulato ogni volta che viene aggiunto un bot (non appena sono stati inviati tre o più robot), segnato come mostrato nella fonte del controller (in ogni gioco, tu ottieni 1 all'inizio di ogni tuo turno, 10 ogni volta che catturi un dado e 1.000 bonus se vinci); imponendo un limite di 5.000 TURN (non round) per partita.
  • Il tuo bot verrà segnato dal suo punteggio dell'ultimo set di giochi; più dieci volte il suo punteggio di voto, se non negativo. (È improbabile che quest'ultimo abbia un effetto significativo sul punteggio)

La fonte del controller può essere trovata qui.

Partiture al 19/06/2015:

Badnomial: 434,924 + 6x10 = 424,984
Nobody: 282,329 + 6x10 = 282,389
StraightShooter: 265,205 + 5x10 = 265,255
MostlyHonestAbe: 158,958 + 4x10 = 158,998
The Pirate: 157,005 + 1x10 = 157,015
Statistician: 144,012 + 2x10 = 144,032
Fidelio: 49,973 + 2x10 = 49,993
Absurd Bot: 6,831
DrHouse: 2,638 + 3x10 = 2,668

1
Dovresti chiarire che l'output dovrebbe essere "2 3" e non "due tre" come mostra il tuo esempio. Inoltre, c'è un modo nel controller di guardare una singola partita?
Caino

Non nella versione ufficiale, ma posterò una versione alternativa che ti consente di farlo.
SuperJedi224,

@Geobits: se vuoi. Ti metterà un po 'in svantaggio se qualcuno ti chiama però.
SuperJedi224,

1
Presumo che gli indici delle matrici siano gli "ID" dei giocatori, quindi diceEachPlayerHas[yourId]= il tuo dado conta, ed bids[yourId]è la tua prima offerta (o nulla se è il tuo primo turno). È corretto?
Non che Charles l'

1
Ho visto giochi in cui alcuni contributi giocano più giochi di altri (nessuno: 414 giochi, Straight Shooter: 409 giochi). Non è giusto, puoi risolvere questo problema?
CommonGuy

Risposte:


6

Nessuno

Cerca di indovinare i dadi degli altri giocatori. Chiama altri bugiardi dei robot se non sa cosa fare.

Modifica: risolto un problema per cui nessuno avrebbe offerto per sempre, senza mai chiamare bugiardo.

public class Nobody extends Player{

    @Override
    public String bid(int myId, int[] diceEachPlayerHas, int[] myDice,
            String[] bids) {
        if (bids.length == 0)
            return "1 2";
        int wilds = 0;
        int players = Controller.numPlayers();
        double myKnowledge = (double)diceEachPlayerHas[myId]/Controller.diceInPlay();
        double previousKnowledge = (double)diceEachPlayerHas[(myId-1+players)%players] / Controller.diceInPlay();
        int[] dice = new int[5];
        for (int i = 0; i < myDice.length; i++) {
            if (myDice[i] == 1) {
                wilds++;
            } else {
                dice[myDice[i]-2]++;
            }
        }
        wilds = (int) (1/myKnowledge+wilds-1)+1;
        for (int i = 2; i <= 6; i++) {
            dice[i-2] += wilds;
        }
        String best = "0 0";
        for (int i = 2; i <= 6; i++) {
            if (Controller.isGreaterThan(dice[i-2] + " " + i, best)) {
                best = dice[i-2] + " " + i;
            }
        }
        if (Controller.isGreaterThan(best, bids[bids.length - 1])) {
            return best;
        }
        if (previousKnowledge > 0.4) {
            int prev = Integer.valueOf(bids[bids.length - 1].split(" ")[0]);
            int prevFace = Integer.valueOf(bids[bids.length - 1].split(" ")[1]);
            if (dice[prevFace - 2] +2 >= prev)
                return (prev+1) + " " + bids[bids.length - 1].split(" ")[1];
        }
        return "Liar!";
    }
}

La tua ultima serie di aggiornamenti sembra davvero averti aiutato.
SuperJedi224,

6

Badnomial, il bot che prende decisioni sbagliate basate su distribuzioni binomiali: Modifica: risolto uno stupido errore nei calcoli delle probabilità, ora conta sia per il prossimo offerente che per il precedente.

    public class Badnomial extends Player{
    public String toString() {return "Badnomial";}

  public String bid(int myId, int[] diceEachPlayerHas, int[] myDice, String[] bids) {
  int[] dieCounts = new int[7];
  for(int i:myDice)
   dieCounts[i]++;
  for(int i=2; i<7; i++)
   dieCounts[i] += dieCounts[1];

  if(bids.length > 0)
  {
   String[] lastBid = bids[bids.length - 1].split(" ");
   int bidCount = Integer.valueOf(lastBid[0]);
   int bidDie = Integer.valueOf(lastBid[1]);
   // Check if I hold a better bid
   boolean betterBid = false;
   int myBidDie;
   int myBidCount;
   int myHighestCount = 0;
   int myHighDie = bidDie +1;

   for(int i = 2; i < 7; i++) {
    if(dieCounts[i] >= myHighestCount) {
     myHighestCount = dieCounts[i];
     myHighDie = i;
    }
   } 
    if((myHighestCount > bidCount) || ((myHighestCount == bidCount) && (myHighDie > bidDie))) {
     betterBid = true;
     myBidDie = myHighDie;
     myBidCount = myHighestCount;
     }

   if(betterBid == false) {
    int unknownDice = Controller.diceInPlay() - myDice.length;
    int myDiceNeeded = bidCount - myHighestCount;
 if(myHighDie <= bidDie)
  myDiceNeeded++;
    int previousBidder = myId - 1;
    if(previousBidder < 0)
     previousBidder = Controller.numPlayers() -1;
    int bidderDiceNeeded = bidCount - dieCounts[bidDie] - (int)(diceEachPlayerHas[previousBidder]/3 +1);
    int bidderUnknown = Controller.diceInPlay() - diceEachPlayerHas[previousBidder] -myDice.length;
 int nextBidder = myId + 1;
 if(nextBidder == Controller.numPlayers())
  nextBidder = 0;
 int nbDiceNeeded = myDiceNeeded - (int)(diceEachPlayerHas[nextBidder]/3 +1);
    int nbUnknown = Controller.diceInPlay() - diceEachPlayerHas[nextBidder];
    //float myChances = (unknownDice/3 - myDiceNeeded)/((float)unknownDice/9);
    //float bidderChances = (bidderUnknown/3 - bidderDiceNeeded)/((float)bidderUnknown/9);
    double myChances = 1 - cumBinomialProbability(unknownDice, myDiceNeeded -1);
    double bidderChances;
    if(bidderDiceNeeded > 0)
     bidderChances = 1- cumBinomialProbability(bidderUnknown, bidderDiceNeeded -1);
    else bidderChances = 1.0;
    double nbChances;
    if(nbDiceNeeded > 0)
      nbChances = 1- cumBinomialProbability(nbUnknown, nbDiceNeeded -1 );
    else nbChances = 1.0;
    if(((myChances < .5) && (nbChances <.5)) || (bidderChances < .2))
     return "Liar!";
   }

   return (bidCount+1) + " " + myHighDie;
  }

  return 2 + " " + 2;
 } 

 private double cumBinomialProbability(int n, int k) {
   double sum = 0;
   for(int i = 0; i <=k; i++)
     sum += binomialProbability(n, i);
   return sum;
 }

 private double binomialProbability(int n, int k) {
   double nfact = 1;
   double dfact = 1;
   int greater;
   int lesser;
   if((n-k) > k) {
     greater = n - k;
     lesser = k;
   }
   else {
     greater = k;
     lesser = n-k;
   }
   for(int i = greater+1; i <= n; i++)
     nfact = nfact * i;
   for(int i = 2; i <= lesser; i++)
     dfact = dfact * i;
   return (nfact/dfact)*(Math.pow((1.0/3), k))*Math.pow(2.0/3, (n-k));
 }

}

Cerca di determinare se deve bluffare o chiamare Liar in base alle distribuzioni binomiali cumulative stimate per sé e per le probabilità degli offerenti precedenti e successivi di avere i dadi necessari presenti.

Fondamentalmente, chiama bugiardo se è molto probabile che il precedente offerente sia un bugiardo o se ritiene che sia lui che il prossimo offerente hanno più probabilità di mentire.


Con queste modifiche, Badnomial sembra in realtà remotamente competente rispetto agli altri robot.
InactionPotential

5

Tiratore dritto

Lo gioca dritto e non bluffa. È anche abbastanza ingenuo da pensare che lo facciano anche gli altri, quindi non chiama mai bugiardo a meno che l'offerta non superi il numero totale di dadi in gioco (meno i suoi dadi che non corrispondono all'offerta).

Per essere un po 'più conservatore del numero esatto previsto per ogni dado, non conta i propri jolly, ma presume che gli altri abbiano una distribuzione uniforme. Con gli attuali quattro giocatori, lui o MostlyHonestAbe sono arrivati ​​per primi ogni volta, con punteggi abbastanza vicini.

Suppongo che l'offerta minima sia 2 2. Se è consentita un'offerta di un dado (o di offerte), fammi sapere in modo da poter apportare tale modifica.

public class StraightShooter extends Player{
    public String toString(){return "Straight Shooter";}
    public String bid(int me, int[] numDices, int[] dice, String[] bids){
        int[] counts = new int[7];
        double[] expected = new double[7];
        int unknown = Controller.diceInPlay() - dice.length;
        for(int i:dice)
            counts[i]++;
        for(int i=2;i<7;i++)
            expected[i] = counts[i] + unknown / 3d;
        int bidCount = 2;
        int bidDie = 2;
        if(bids.length > 0){
            String[] lastBid = bids[bids.length-1].split(" ");
            bidCount = Integer.valueOf(lastBid[0]);
            bidDie = Integer.valueOf(lastBid[1])+1;
            int possible = Controller.diceInPlay();
            for(int i=2;i<7;i++)
                if(i != bidDie)
                    possible -= counts[i];
            if(bidCount > possible)
                return "Liar!";

            if(bidDie > 6){
                bidDie = 2;
                bidCount++;
            }
        }
        double best = Double.MAX_VALUE;
        int bestCount = bidCount;
        int bestDie = bidDie;
        for(int count=bidCount;count<=Controller.diceInPlay();count++){
            for(int die=bidDie;die<7;die++){
                double score = Math.abs(expected[die]-bidCount);
                if(score < best){
                    best = score;
                    bestCount = count;
                    bestDie = die;
                }
            }
            bidDie = 2;
        }   
        return bestCount + " " + bestDie;
    }
}

Questo e MostlyHonestAbe sono entrambi così esitanti a mentire o chiamare bugiardo, ci sono alcuni giochi che vanno a 2000 turni quando provo haha. : P
Caino l'

Lo stesso nel mio. Va bene, però, perché ogni turno è un punto in più verso il punteggio finale. Se faccio gli ultimi 2000 turni e non vinco, è meglio che vincere dopo 100 nel mio libro;)
Geobits l'

Ho dovuto andare di nuovo a vedere le regole del punteggio. Intero nuovo gioco XD
Caino l'

Sì, con questo punteggio sembra che la strategia ottimale potrebbe essere quella di essere il più conservatore possibile e accumulare punti. Forse c'è qualcosa di meglio, ma non riesco a vederlo.
Geobits,

1
Non sono sicuro che farebbe molta differenza. Essere conservatori sarebbe comunque un vantaggio, solo perché hai meno possibilità di perdere un dado. Il motivo per cui più persone non giocano così nella vita reale è perché è solo noioso, ma cos'è la noia per un robot?
Geobits,

4

MostlyHonestAbe

Abe fa morire le ipotesi prudenti sul resto degli avversari, quindi rimane onesto fino a quando non pensa che ci siano abbastanza dadi per battere l'offerta attuale. A questo punto bluffa una volta, poi chiama bugiardo la prossima volta.

import java.io.File;
import java.io.FileNotFoundException;
import java.io.PrintStream;

public class MostlyHonestAbe extends Player{

    final boolean debug = false;
    boolean bluffedOnce = false;
    PrintStream out;
    @Override
    public String bid(int myId, int[] diceEachPlayerHas, int[] myDice, String[] bids) {
        try {
            File f = new File("abe.log.txt");
            out = new PrintStream(f);
        } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
            //e.printStackTrace();
        }
        if(debug){
            out = System.out;
        }

        //reset bluff counter on the first round
        if(bids.length < diceEachPlayerHas.length){
            bluffedOnce = false;
        }

        //Is it the first bid?
        if(bids.length == 0){
            out.println("I go first");
            return lowestViableBid(1,1, myDice, diceEachPlayerHas, true);
        }

        out.println("Last bid = " + bids[bids.length - 1]);
        out.print("My Dice = ");
        for(int d : myDice){
            out.print(d + ", ");
        }
        out.println();

        //What was the last bid?
        String[] lastBid = bids[bids.length -1].split(" ");
        return lowestViableBid(Integer.parseInt(lastBid[1]), Integer.parseInt(lastBid[0]), myDice, diceEachPlayerHas, false);


    }

    //Lowest honest bid, or liar
    private String lowestViableBid(int highestVal, int highestCount, int[] myDice, int[] otherDice, boolean firstTurn){

        //Make a better array for the dice
        //Include what the other players probably have
        int wilds = numDie(1, myDice);
        int[] diceCount = new int[6];
        diceCount[0] = wilds;
        int otherPlayerExpectedValue = 0;
        for(int d : otherDice){
            otherPlayerExpectedValue += d;
        }
        otherPlayerExpectedValue -= myDice.length;
        out.println("Number of other dice = " + otherPlayerExpectedValue);
        otherPlayerExpectedValue = otherPlayerExpectedValue / 4;
        //Note: Other player expected value is biased low, counting wilds the number should be divided by 3.

        out.println("playerExpectedVal = " + otherPlayerExpectedValue);
        for(int i = 1; i < 6; i++){
            diceCount[i] = numDie(i + 1, myDice) + wilds + otherPlayerExpectedValue;
        }


        //What's my array look like?
        for(int i = 0; i < diceCount.length; i++){
            out.println("diceVal = " + (i + 1) + ", diceCount = " + diceCount[i]);
        }

        //Can I bid the same number, but higher dice val?
        for(int diceVal = highestVal + 1; diceVal <= 6; diceVal++){
            if(diceCount[diceVal - 1] >= highestCount){ 
                out.println("1.Returning " + highestCount + " " + diceVal);
                return highestCount + " " + diceVal; }  
        }

        //What about more dice?
        for(int diceNum = highestCount + 1; diceNum <= myDice.length; diceNum++){
            for(int diceVal = highestVal + 1; diceVal <= 6; diceVal++){
                if(diceCount[diceVal - 1] == diceNum){ 
                    out.println("2.Returning " + (diceNum) + " " + diceVal);
                    return (diceNum) + " " + diceVal; } 
            }
        }

        if(firstTurn){ return "1 2"; }
        //If this is the first time I'm out of my league, bluff a round before calling liar.
        if(!bluffedOnce){
            out.println("bluffing " + (highestCount + 1) + " " + highestVal);
            bluffedOnce = true;
            return (highestCount + 1) + " " + highestVal;
        }
        out.println("Returning Liar!");
        //Well, wouldn't want to lie
        return "Liar!";
    }

    private int numDie(int i, int[] myDice){
        int result = 0;
        for(int j : myDice){
            if(i == j){ result++; }
        }
        return result;
    }
}

1
Ma stai scherzando? Ero a meno di cinque minuti dalla pubblicazione di HonestAbe . Ora devo pensare a un nuovo nome: P
Geobits l'

1
Non si può giocare con Liar nel nome senza un riferimento ad Abraham Lincoln da qualche parte.
Caino l'

4

Dr. House

Tutti mentono!

public class DrHouse extends Player
{   
  public String bid(int yourId, int[] diceEachPlayerHas, int[] yourDice, String[] bids)
  {
    return "Liar!";
  }
}

1
Suggerisco di aggiungere una logica speciale per quando hai la prima offerta del round.
SuperJedi224,

4
@ SuperJedi224 Immagino che il bot consideri quindi il controller che gli dice che è il suo turno di essere un bugiardo
Nathan Merrill,

Made my day lol
Rohan Jhunjhunwala,

2

Fidelio

Questo robot sa che solo il suo valore più ricorrente lo porterà alla vittoria, quindi rimane fedele. Suppone che ci sia una parte dei dadi di tutti uguali ai suoi, se qualcuno offre più di quella porzione, presume di essere un bugiardo.

public class Fidelio extends Player
{
    final String LIAR ="Liar!";
    @Override
    public String bid(int yourId, 
            int[] diceEachPlayerHas, 
            int[] yourDice,
            String[] bids) 
    {
        int[] myDices = new int[6];
        int valueToBid=1;
        for(int i : yourDice)
            myDices[i-1]++;
        for(int i=2;i<myDices.length;i++)
            if(myDices[i]>=myDices[valueToBid])
                valueToBid=i;
        if(bids.length==0)
            return 2+" "+valueToBid;
        int sum=0;
        String[] lastBidString=bids[bids.length-1].split(" ");
        int[] lastBid = new int[2];
        lastBid[0] = Integer.parseInt(lastBidString[0]);
        lastBid[1] = Integer.parseInt(lastBidString[1])-1;
        for(int i : diceEachPlayerHas)
            sum+=i;
        sum-=yourDice.length;
        if(lastBid[0]>sum/3+myDices[lastBid[1]]+myDices[0])
            return LIAR;
        if(lastBid[1]>= valueToBid)
        {
            if(lastBid[0]>=myDices[0]+myDices[valueToBid]+sum*2/5)
                return LIAR;
            return (lastBid[0]+1)+" "+myDices[valueToBid];
        }
        return lastBid[0]+" "+valueToBid;
    }
}

Spero che farà un buon lavoro :).


Ricevo un IndexOutOfBoundsException sulla linea 13. Ricorda che gli array sono indicizzati a 0 in Java.
SuperJedi224,

Ora ne sto ottenendo uno all'altro capo della linea 19, per un indice di -1. Sembrerebbe che stesse cercando di leggere l'ultimo elemento da un array vuoto, dovresti includere un controllo per quello.
SuperJedi224,

Risolto, il controllo se (bids.length == 0) veniva eseguito dopo aver usato le offerte ...
Katenkyo,

Oh, avevo appena proposto un'altra possibile soluzione, ma probabilmente funzionerà anche questo.
SuperJedi224,

Ah, quindi questa modifica suggerita non è più necessaria?
mbomb007,

2

esperto di statistica

Hai 1/3 di possibilità di avere qualsiasi numero diverso dagli assi. Un ragazzo una volta mi ha detto che non controllare i tuoi dadi e juste sapendo che le probabilità possono farti vincere questa partita. EDIT: l'offerta era troppo alta. Ma non migliora molto il punteggio.

public class Statistician extends Player{
    public String toString(){return "Statistician";}
    public String bid(int me, int[] numDices, int[] dice, String[] bids){
        int totalDices = 0;
        int currentBid, max;
        for (int i : numDices)
            totalDices += i;
        max = totalDices/3;
        if(bids.length>0){
            currentBid = Integer.valueOf(bids[bids.length-1].split(" ")[0]);
            if(currentBid>max)
                return "Liar!";
        }
        return max+" 6";
    }
}

1

Bot assurdo

Afferma che tutti i dadi sono 6, a meno che non sia possibile. Se il bot non può farlo, significa che si tratta di una situazione impossibile o quasi impossibile. Per questo motivo, chiama bugiardo. Sono curioso di sapere quanto sarà efficace questo bot.

public class AbsurdBot extends Player {
    @Override
    public String bid(int yourId, int[] diceEachPlayerHas,int[] yourDice,String[] bids)
    {
        String[] lastbid;
        int a, b, d;
        d = 0;
        for (int dice : diceEachPlayerHas)
            d += dice;
        if (bids.length != 0)
            {
                lastbid = bids[bids.length-1].split(" ");
                a = Integer.parseInt(lastbid[0]);
                b = Integer.parseInt(lastbid[1]);
                if (a > d || a == d && b == 6)
                    return "Liar!";
            }
        return d + " 6";
    }
}

Per quanto riguarda l'efficacia: la sua funzione principale sembra quella di consegnare i dadi a qualunque giocatore la segua: P
Geobits

@Geobits ho corretto il codice. Questo è ciò che accade quando provi a saltare in un linguaggio di programmazione che non hai programmato prima ...
Federico

@Geobits Grazie per tutto l'aiuto. Penso che questo finalmente funzioni correttamente ora. Vero? (Java è confuso)
Federico,

Sì, ora funziona. La strategia è follemente suicida, però. Segna solo il 2% circa del giocatore più basso successivo.
Geobits,

@Geobits Non ho mai provato a eseguirlo contro gli altri giocatori. L'hai lanciato contro gli altri?
Federico,

1

Il pirata

Ho fatto alcuni semplici robot mentre testavo il controller, e questo è l'unico che va davvero bene.

Sarà probabilmente migliorato in seguito.

import java.util.Arrays;
import java.util.Scanner;

public class Pirate extends Player{
    public Pirate() {
    }
    public String toString(){
        return "The Pirate";
    }
    private String bid(int[] t,int tol){
        int[]z=t.clone();
        Arrays.sort(z);
        int j=0;
        for(int i=0;i<6;i++){
            if(t[i]==z[5]){j=i;break ;}
        }
        return (tol+t[j])+" "+(j+1);
    }
    @Override
    public String bid(int yourId, int[] diceEachPlayerHas, int[] yourDice,
            String[] bids) {
        int[] t=new int[6];
        for(int i=0;i<yourDice.length;i++){
            t[yourDice[i]-1]++;
        }
        for(int i=1;i<t.length;i++)t[i]+=t[0];
        int tol=(Controller.diceInPlay()-yourDice.length)/4;
        if(bids.length==0)return bid(t,1);
        Scanner i=new Scanner(bids[bids.length-1]);
        int x=i.nextInt(),y=i.nextInt();
        i.close();
        if(t[y-1]>x)return (t[y-1]+2)+" "+y;
        int nd=Controller.diceInPlay();
        if(x>nd+t[y-1]-yourDice.length)return "Liar!";
        if(Controller.isGreaterThan(bid(t,tol), bids[bids.length-1])){
            int z=Controller.valueOf(bids[bids.length-1]);
            for(int j=1;j<=tol;j++)if(Controller.valueOf(bid(t,j))>z)return bid(t,j);
        }
        return "Liar!";
    }
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.