2013-09-06 3 views
2

블랙 잭 게임을 만들기 위해 CPP를 사용하고 있지만 순서를 반복하지 않고 무작위로 [4] [13] 배열에서 요소를 선택하는 방법에 대해 고심하고 있습니다. 배열의. VisualStudio에서 작업하기. 지금까지 1-D 배열로이 작업을 수행하는 방법에 대한 해답을 찾을 수 있습니다. 아무도 제안이 없나요?반복하지 않고 2 차원 배열에서 무작위로 선택

+0

2D 배열이 필요한 이유가 있습니까? – shuttle87

+0

다음은 배열을 랜덤 화하는 방법에 대한 좋은 토론입니다. http://stackoverflow.com/questions/6127503/shuffle-array-in-c –

+0

답변 수락하기! – jlars62

답변

1

글쎄, 한 가지 방법은 배열 요소에 bool 필드를 추가하는 것이고, 배열 요소가 선택되면 true로 설정하는 것입니다. 그런 다음 장래 선택 사항에서 booltrue인지 확인하고, 그렇다면 다른 임의의 요소를 생성하십시오. 가장 효율적인 것은 아니지만 간단합니다.

이렇게하면 배열을 반복하고 모든 bool 필드를 false로 설정하여 임의 재생을 시뮬레이트하는 메서드를 쉽게 만들 수 있습니다.

+0

나는 "가장 효율적이지 않다"는 말은 삼가면서 말하는 것입니다. 값이 많이 사용될수록 사용되지 않는 다른 값을 찾으려는 시도가 많아집니다. –

+0

일정한 횟수 (예 : 10 개 정도)가 지나면 모든 bool을 false로 설정하는 셔플 방법이 있어야합니다. 이렇게하면이 문제가 어느 정도 완화됩니다. – user2366842

+0

이것은 실제로 자바 스크립트에서 블랙 잭 게임을 만드는 데 사용 된 방법입니다. – smac89

3

2D 배열은 1D 배열로 쉽게 간주 될 수 있습니다. 당신은 단지 약간의 수학을 할 필요가 있습니다.

52 개 요소 1D 배열 (임의로 정렬 된 값이 0-51 인 새 배열)에 사용할 수있는 솔루션이있는 경우. 다음을 수행하십시오

  1. 이 임의 요소를 생성, R (0 ~ 51)를 호출 할 수 있습니다.
  2. 이제 해당 숫자를 2D 배열 시스템으로 변환하십시오. (X 형태, Y)
    1. x = R/13
    2. y = R % 13
+1

그리고 1d 배열에 대한 해결책은 다음과 같습니다. 1-52의 숫자를 가진 무작위 배열을 만든 다음 반복합니다. 반복 없음, 성능 저하 없음. –

+0

피셔 예테 (Fisher-Yates)를 답변에 추가하여 완성시키지 않는 이유는 무엇입니까? "https://en.wikipedia.org/wiki/Knuth_shuffle" –

+0

@ IngoBürk 빙고! –

0

한 방법 I 차원 배열을 교체 한 다음 2 개 좌표를 생성 하였다 언제나처럼. n 횟수만큼 수행 한 다음 일부 for loops을 사용하여 2D 배열을 반복 할 수 있습니다.

0

나는 모든 카드가 들어있는 목록을 사용하고 싶습니다. 당신이 [4] suites [13] 숫자를 가진 2 차원 배열을 고집한다면, 답은 간단하다. 그러나 배열 변수를 Boolean으로 만들어라.

ill 의사 코드를 작성하십시오.

initialize cardsselected to zero 

Choose Card 
     Randomly select 2 numbers 1 will be 0-3 and the other 0-12. 
     If the array at [random suite][random number] is not false 
      choose it 
      increment cardsselected 
      set value to false 
      return true 
     else if cardsselected equals 52 return false 
     else 
      run chooseCard() 
      return true 

이건 그냥 솔루션입니다. 그것은 이 아니고 매우 최적화되어 있습니다. 영원히 걸릴 수 있습니다.

최적화하려면.

2d 어레이는 난수를 생성하는 카드를 보관할 수 있습니다. 난수 생성을 최적화하기 위해 난수 1-52의 목록을 만들어 무작위로 선택하면됩니다. 그런 다음 목록에서 선택한 번호를 제거하십시오.

+0

사실 각 셀에 연속 번호를 할당하여이를 수행하려고 생각했지만 교수는 빌드를 원합니다. 초기 값 ""을 가지는 char로서의 「데크」 이것은 우리가 나중에 어떤 카드가 어떤 플레이어에게 갔는지 출력리스트를 생성 할 수 있도록하기 위해서입니다. 주어진 셀을 그 카드가 처리 된 플레이어의 수로 업데이트하면됩니다. 내가 말했듯이, 그것이 가장 효율적인 방법이 아닐 수도 있습니다. 나는 지시를 따르려고하고있다. -/ – user2755333

+0

@ user2755333 이것은 여전히 ​​효과가있을 것이다. 문자 배열이 맞습니까? 2 개의 어레이 또는 2 개의 데크가 있습니다. 하나는 "깨끗한 데크"이고 "사용 가능한 데크"입니다. 클린 데크의 값은 항상 완벽하게 유지됩니다. 사용 가능한 데크와 동일하지만, 선택할 때마다 값을 기본 char (null)로 설정하게됩니다. 거짓 대신에. 그런 다음 내 코드와 동일한 논리를 따르고 작동해야합니다. 그런 다음 다시 섞기를 원할 때마다 깨끗한 덱의 값을 사용 가능한 덱으로 던지십시오. – progrenhard

0

std::deque<T> 컨테이너를 사용할 것을 적극 권장합니다. 갑판 자체를 나타 내기위한 이중 종료 대기열을 사용하면 상대방을 처리 할 때 '카드'를 누를 수 있습니다.

2

사용 std::random_shuffle 무작위 0-51에서 vector (말 vector<int> v) 셔플한다. random_shuffle이 주어진 벡터를 뒤섞기 때문에, v은 임의로 뒤섞인 벡터입니다.

v.back()은 벡터의 마지막 요소를 반환합니다. 따라서 다음 코드는 벡터에서 마지막 요소 (k)를 반환 한 다음 제거합니다. 또한 double으로 변환하여 k/13을 계산할 수 있습니다. 하여 행렬 4x13이기 때문에

double k = static_cast<double>(v.back()); 
v.pop_back(); 

이제 k 번째 요소는 (주 행)은 행 및 열 floor(k/13)k%13이다.

0

사이드 노트 : 숫자 52를 하드 코드하지 마세요. 같은 어레이에 여러 개의 덱을 셔플 할 가능성이 있습니다. 블랙 잭 게임에서 카지노는 종종 블랙 잭 "신발"에서 여러 개의 데크를 사용합니다. 특히 신발 당 4 개의 데크가 상당히 일반적입니다. 이것은 조건부 확률에 중요한 의미를 갖는다 : 앞면 위로 향한 카드와 뒤집힌 얼굴 사이의 상관 관계가 적다. 52 장 카드 덱을 따로 섞어서는 안되며, N * 52 카드 끈 전체를 섞어 야합니다. 다른 대답에서 제안 된 알고리즘은 사소한 수정만으로 2-D 어레이뿐만 아니라 3-D 어레이에서도 작동합니다.

0

소수를 사용하는 간단한 해결책이 있습니다. 배열에서 무작위 초기 색인을 취하면 (단순성을 위해 1D 배열로 함) 배열 길이보다 큰 소수로이 색인을 증가시키고 배열 길이로 나눈 후 알림 만 취하면 무작위 반복되지 않는 색인의 순서. 이 같은

뭔가 : N 후

#include <cstdlib> 
#include <iostream> 
#include <time.h> 

const int Cols = 4; 
const int Rows = 13; 
const int N = Cols * Rows; 

const int NPrimes = 12; 
const int primes[NPrimes] = {59, 61, 67, 71, 73, 79, 83, 89, 97, 101, 103, 107}; 

int prime = primes[0]; 
int index = 0; 

void shuffle() 
{ 
    srand(time(NULL)); // Random seed 
    prime = primes[rand() % NPrimes]; // Get random prime number 
    index = rand() % N; // Get random first index 
} 

// Compute next index in sequence 
int nextIndex(int index) 
{ 
    return (index + prime) % N; 
} 

int _tmain(int argc, _TCHAR* argv[]) 
{ 
    shuffle(); 

    for (int i = 0; i < N; i++) { 
     int col = index/Rows; 
     int row = index % Rows; 
     std::cout << "[" << col << ", " << row << "] "; 
     index = nextIndex(index); 
    } 
    std::cout << std::endl; 
    return 0; 
} 

는 순서가 분명히 자신을 반복합니다 반복.

관련 문제