(Как манипулировать) Позиционирование в покере с использованием ENUM - PullRequest
3 голосов
/ 17 августа 2011

Допустим, я создал следующий класс:

public enum Position {

   Dealer(1), //1
   SB(2),     //2
   BB(3),     //3
   UTG(4),    //4
   UTG1(5),   //5
   UTG2(6),   //6
   UTG3(7),   //7
   HJ(8),     //8
   CO(9);     //9

   //Constructor
   int code;

   Position(int code) {
     this.code = code;
   }
}

Как мне манипулировать ENUM, используя числа в скобках?Например, в моем классе покера я начинаю новых игроков.Каждый игрок передает параметр Позиция.Итак, изначально,

player[1].getPosition() = Dealer  
player[2].getPosition() = SB  
player[3].getPosition() = BB   
etc etc etc 

После того, как рука закончена, все позиции должны быть сдвинуты на единицу.
Таким образом, игрок [1] ​​должен иметь позицию CO (9).
игрок [2] должен иметь позицию дилера (1).
игрок [3] должен иметь позицию SB (2).
и т. д.

Я понимаю, что могу просто сделатьцикл for с переменной, перебирающей числа от 1 до 9, но как мне получить доступ к позиции на основе целого числа внутри PositionENUM?


РЕДАКТИРОВАТЬ: У меня уже есть геттеры и сеттеры.

    public int getCode() {
        return code;
    }
    public void setCode(int code) {
        this.code = code;
    }

Однако геттеры и сеттеры не дают мне правильное изменение Позиции игроков в каждом раунде.

После каждого раунда ставок мне нужно менять Позицию каждого игрока, поэтому мне нужно выяснить, как менять позицию ENUM каждого игрока после каждого раунда ставок.

Ответы [ 6 ]

2 голосов
/ 17 августа 2011

Можно выбрать экземпляр enum, основываясь на значении его кода.Вы можете использовать статический Map<Integer, Position> для этого.Единственный недостаток заключается в том, что он должен находиться в статическом внутреннем классе:

public enum Position {

    ...

    Position(int code) {
        this.code = code;
        MapHolder.BY_CODE.put(code, this);
    }

    private static class MapHolder {
        private static final Map<Integer, Position> BY_CODE = new HashMap<Integer, Position>();
    }

    public static Position findByCode(int code) {
        return MapHolder.BY_CODE.get(code);
    }

Я бы также рекомендовал делегировать логику выбора следующей позиции для самого перечисления.Просто добавьте этот метод к перечислению Position:

public Position nextPosition() {
     return findByCode((this.code + 1) % Position.values().length);
}

Тогда ваш код клиента может просто пойти:

for (Player player : players) {
    player.setPosition(player.getPosition().nextPosition());
}
1 голос
/ 28 октября 2011

Посмотрите здесь онлайн-покер образец игры

    #include <iostream>
#include <stdlib.h>
#include <cctype>
#include <memory.h>
#include "logic.h"

using namespace std;
// & means location
// * value of location

struct Cards {

enum Value {Two = 2, Three, Four, Five, Six, Seven, Eight, Nine, Ten, Jack, Queen, King, Ace};
Value V;
int Suite;
enum Suite {Hearts, Diamonds, Clubs, Spades};
};

struct Hand {
Cards [5];

};

struct Deck {
Cards [52];

};

char * personsName [20]; //this means location with *
int numNames = 0;
char * Name;
char * search;
bool Continue;

int main ()
{
do {
for(int x = 0; x < 20; x++){
cout << "Enter a name, type END to stop: ";
Name = readString ();

if(strcmp (Name, "END") != 0){
personsName [x] = Name;
numNames++;
}
else{
Continue = (strcmp (Name, "END") != 0);
break;
}

}
cout << "Pre-sorted Names" << endl;
printNames(personsName,numNames);

bubbleSort(personsName,numNames);

cout << "Post-sorted Names" << endl;
printNames(personsName,numNames);

cout << "What would you like to find?" << endl;
search = readString();
cout << "The name is at index " << binarySearch(personsName,search,numNames) << endl;

} while (Continue);
delete [] * personsName;
return 0;
}
0 голосов
/ 17 августа 2011

Я не совсем уверен, если это ваше требование. Посмотрите, поможет ли приведенный ниже код:

public enum Position {

    Dealer(1), // 1
    SB(2), // 2
    BB(3), // 3
    UTG(4), // 4
    UTG1(5), // 5
    UTG2(6), // 6
    UTG3(7), // 7
    HJ(8), // 8
    CO(9); // 9

    // Constructor
    int code;

    Position(int code) {
        this.code = code;
    }

    private static Position[] currentPosition = Position.values();

    public static Position[] getCurrentPosition() {
        return currentPosition;
    }

    private static List<Position> positionWrap = Arrays.asList(currentPosition);

    public static void shiftPostion() {
        Collections.rotate(positionWrap, 1);
        updatePositions();
    }

    private static void updatePositions() {
        for (int i = 0; i < currentPosition.length; i++){
            currentPosition[i].code = i + 1;
        }
    }

    public static void main(String[] args) {
        Position[] pos = getCurrentPosition();
        System.out.println(Arrays.toString(pos));
        Position.shiftPostion();
        System.out.println(Arrays.toString(pos));
        Position.shiftPostion();
        System.out.println(Arrays.toString(pos));

    }

    @Override
    public String toString() {

        return this.name() + "(" + code + ")";
    }
}
0 голосов
/ 17 августа 2011

Вы можете просто использовать ординал () для позиции (начинается с 0, как подписки). также может быть проще, если бы перечисления были в обратном порядке (поскольку сделка переходит влево), как показано ниже. это не сработает в короткой игре (вам нужно сделать это по модулю количества игроков).

enum Position {
    Dealer, CO, HJ, UTG3, UTG2, UTG, BB, SS;
    Position next() {
        return values()[(ordinal() + 1) % values().length];
    }
}
class Player {
    Player(Position position) {
        this.position = position;
    }
    void next() {
        position = position.next();
    }
    Position position;
}
public class Main {
    public static void main(String[] args) {
        Player[] players = new Player[Position.values().length];
        for (Position position : Position.values())
            players[position.ordinal()] = new Player(position);
        for (Player player : players)
            System.out.println(player.position);
        for (int i = 0; i < Position.values().length; i++)
            for (Player player : players)
                player.next();
        for (Player player : players)
            System.out.println(player.position);
    }
}
0 голосов
/ 17 августа 2011

code - объем доступа к пакету.

Если вы звоните из пакета, вы можете сделать

Position.BB.code

Если вы звоните из-за пределов пакета, вам может потребоваться предоставить средство доступа внутри класса enum.

public int getCode(){
    return this.code;
}
0 голосов
/ 17 августа 2011

Я не уверен, правильно ли я понимаю ваш вопрос, но вы можете объявить getCode() метод для вашего перечисления:

public enum Position {

  Dealer(1), //1
  SB(2),     //2
  BB(3),     //3
  UTG(4),    //4
  UTG1(5),   //5
  UTG2(6),   //6
  UTG3(7),   //7
  HJ(8),     //8
  CO(9);     //9

  int code;

  //Constructor
  Position(int code) {
    this.code = code;
  }

  public int getCode() {
    return code;
  }
}
...