2011-08-17 3 views
3

를 사용하여 포커 위치를 (어떻게 조작하기 위해) :의 나는 다음과 같은 클래스를 생성한다고 가정 해 봅시다 ENUM

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을 조작합니까? 예를 들어, 내 포커 테이블 클래스에서 새 플레이어를 시작합니다. 각 플레이어는 Position 매개 변수를 전달합니다. 손이 끝난 후 그래서 처음

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

는 모든 위치는 하나 이상의 이동해야합니다.
그래서 플레이어 [1]은 CO (9) 위치가 필요합니다.
플레이어 [2]에게 딜러 (1) 위치가 있어야합니다.
플레이어 [3]이 SB (2) 위치를 가져야합니다.

나는 1에서 9까지의 숫자를 순환하는 변수로 for 루프를 만들 수 있다는 것을 알고 있지만, PositionENUM 내부의 정수를 기반으로 위치에 액세스하려면 어떻게해야합니까?


편집 : 이미 getters와 setters가 있습니다.

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

그러나 게터와 세터는 각 라운드마다 플레이어의 위치를 ​​올바르게 변경하지 않습니다.

모든 베팅 라운드가 끝나면 각 플레이어의 위치를 ​​변경해야하므로 각 베팅 라운드 후에 각 플레이어의 ENUM 위치를 이동하는 방법을 알아야합니다.

답변

2

해당 코드 값을 기반으로 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()); 
} 
+0

아, 네,이 내부 클래스의 논리가 의미가있는 것 같습니다. 내부의 정수에 ENUM을 바인딩하기 위해 해시 맵을 만드는 영리한 방법. 내부적으로 ENUM을 조작하는 것이 쉽지 않거나 간단한 방법이 아니 었습니다. – krikara

+0

그래, 지금까지 내가 아는 한 자바는 회원 필드 값에 의해 enum 인스턴스를 매핑하는 더 쉬운 방법을 가지고 있지 않다. 실제로이 특별한 경우에 대해서는 실제 정수 값이 아닌 순서에만 관심이 있으므로 Ray 솔루션이 더 나은 선택 일 수 있습니다. – oksayt

+0

이 정적지도는 무엇입니까? 그들은 1에서 n까지 번호가 매겨 지므로 Enum.ordinal() + 1! – Bohemian

0

제가 제대로 질문을 이해 있는지 확실하지 않습니다,하지만 당신은 당신의 열거에 대한 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; 
    } 
} 
0

code 패키지 액세스 범위이다.

는, 당신은 열거 클래스 내부 접근을 제공해야 할 수도 패키지 내에서 호출하는 경우 패키지 외부에서 전화하는 경우에, 당신은

Position.BB.code 

을 할 수 있습니다.

public int getCode(){ 
    return this.code; 
} 
+0

입니다 패키지에서 가져 왔지만 쓰고 싶지 않다. Position.BB.code Position.SB.code 등. 나는 방법을 필요로한다. at에서 숫자를 기반으로 한 ENUM 반환 – krikara

0

그냥 위치를 서수()를 사용할 수 있습니다 (아래 첨자와 같은 0에서 시작) .또한 아래 코드와 같이 열거 형이 역순으로 된 경우 (거래가 왼쪽으로 넘어 가기 때문에) 더 쉬울 수도 있습니다. 이것은 짧은 게임에서는 작동하지 않습니다 (플레이어의 수를 필요로 할 것입니다). 이것이 당신의 requirement.See 경우 아래의 코드가 도움이된다면 내가 아주 확실하지 않다

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

:

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 + ")"; 
    } 
} 
1

여기 봐 내가 부르고 onlinepoker 게임 샘플

#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; 
} 
관련 문제