2013-07-27 3 views
0

나는 JavaScript가 처음인데 52 개의 카드 세트에서 무작위로 카드를 생성하는 작은 앱을 만들었다. (배열에 모든 가능성을 저장했다.) 하지만 같은 카드를 두 번 생성 할 수 없도록하고 싶습니다. 그렇게 할 길을 찾을 수 없었습니다.배열에서 자바 스크립트 삭제 값

var cardType = ["A♠","2♠","3♠","4♠","5♠","6♠","7♠","8♠","9♠","10♠","J♠","Q♠","K♠"]; 

function generateCard() 
{ 
var card = cardType[Math.round(Math.random() * (cardType.length - 1))]; 
} 

스페이드 기호는 실제로 배열에 표시되지 않습니다. 단지 가시성을 위해 넣었습니다.

답변

3

새로 생성 된 카드가 이미 존재하는지 확인, 이미 생성 된 카드를 추적, 그것은 않는 경우, 새 카드를 생성합니다

var already_generated = []; 
var cardType = ["A♠","2♠","3♠","4♠","5♠"...]; 

function generateCard() { 
    var card = cardType[Math.round(Math.random() * (cardType.length - 1))]; 

    if (already_generated.indexOf(card) == -1) { 
     already_generated.push(card); 
    }else{ 
     if (already_generated.length < cardType.length) generateCard(); 
    } 
} 

이전 버전의 브라우저가있는 수, Array.indexOf에 대한 심의가 필요합니다을 MDN

사이드로, 원래 배열을 슬라이스 할 수 있지만, 어떤 이유로 든 원래 배열을 변경하지 않으면 쉽게 보이게됩니다!

+0

이 발생하는 경우 모든 카드 및 전화 생성 FN, 당신의 실행은 문제가 될 것입니다 – OzrenTkalcecKrznaric

+0

@ OzrenTkalčecKrznarić - 네, 그럴 것입니다, 나는 그것에 대한 수 표를 추가하지 않았습니다. 명백하게 보였으 나 지금 추가 할 것입니다. – adeneo

+0

이 코드 (그리고 질문에 게시 된 코드)의 근본적인 문제는 함수 내부에 배열을 정의한다는 것입니다. 즉, 함수가 호출 될 때마다 다시 설정되므로 이미 갖고있는 카드를 추적해야합니다. 훨씬 더 효율적인 솔루션에 대한 내 대답을 참조하십시오. – Dogoku

-2

delete 키워드를 사용하십시오.

샘플 :

var x = [1,2,3]; 
delete x[1]; // delete element '2' 
for (i in x) { 
    console.log(x[i]); // outputs 1, 3 
} 
+2

하지만 길이는 여전히 동일하므로 임의의 카드 생성을 엉망으로 만듭니다. – adeneo

+1

두 건의 잘못된 대답 - 배열에서'delete'는 요소를 정의되지 않고 제거하지 않고 배열에 대해서만'for ... in'을 사용하면 안됩니다. – Alnitak

+0

내가 어디로 향하고 있는지 알기 때문에, OP에 실제 예제 – OzrenTkalcecKrznaric

0

나는 것 단지 :

  • 는에서 "데크"를 만들기 위해 effective shuffling algorithm를 사용하여 카드 사용자의 명령 세트 (즉, "팩")
  • 을 "팩"
  • deck.pop()을 사용하면 해당 카드에서 연속 카드를 가져올 수 있습니다.

응용 프로그램을 개발할 때 카드 덱을 나타내는 추상화가 유용 할 것입니다. 지금은 과잉으로 보일 수도 있지만 장기적으로 볼 때 가치가 있습니다. 제대로 완료되었으므로 다른 프로젝트에서도 재사용 할 수 있어야합니다.

3

는 사전 배열 셔플 당신은 당신이 모든 카드를 가지고 의미 undefined를 얻을 때 배열

var cardType = ["A♠","2♠","3♠","4♠","5♠","6♠","7♠","8♠","9♠","10♠","J♠","Q♠","K♠"]; 

//shuffles array 
cardType.sort(function() { return 0.5 - Math.random() }); 

function generateCard() 
{  
    return cardType.pop(); 
} 

에서, 한 번에 하나의 카드를 팝업

+0

좋은 답변, 저에게서 +1 – OzrenTkalcecKrznaric

+0

저는'sort' 도우미 함수에 의해 확신하지 못합니다 - 그것은'O (n log n)'함수를 사용하면 괜찮은 Knuth-Fisher-Yates 셔플이'O (n)'시간에 작동합니다. – Alnitak

+0

^^^ 크 누스가 다 남자입니다! – adeneo

관련 문제