2015-02-04 5 views
1

저는 JS 수를 계산하고 각 플레이어의 이름, 플레이어가 딜러인지 여부를 선택하여 시작하는 간단한 게임을 만들고 싶습니다. 각 게임마다 단 하나의 딜러 만있을 수 있습니다.중첩 된 'for'루프 배열이 정의되지 않았습니다.

function player(playerName, playerDealer) { 
    this.playerName = playerName; 
    this.playerDealer = playerDealer; 

} 
var playerNumber = prompt('Nr of players?'); 
var playersArray = []; 
for (i = 0; i < playerNumber; i++) { 
     var j = i + 1;  

     var dealerAssigned = false; // control variable to check whether dealer has been assigned 
     var inputName = prompt('Name of player nr ' + j); 
     var inputDealer = prompt('Is player ' + inputName + ' also a dealer? (yes/no)'); 
     playersArray[i] = new player(inputName, inputDealer); 

     for (k=0;k<playerNumber;k++){ // I want to go through the players array to check if dealer has been assigned 
     if (playersArray[k].playerDealer == 'yes') { 
       dealerAssigned=true;  
       break; 
       };  
      }; 

     if(dealerAssigned){ //if dealer has been assigned, don't add the current player to the array and continue with the next iteration 
     alert("already assigned"); 
     continue; 
      }; 

    }; 

딜러가 임명되었는지 확인하는 간단한 테스트를 루프에 포함시켜야합니다. 그렇다면 스크립트를 '이미 할당 됨'으로 경고하고 다음 플레이어로 건너 뛰기를 원합니다. 하지만 계속해서 다음과 같은 오류가 발생합니다.

TypeError: playersArray[k] is undefined

왜 정의되지 않은 이유를 설명 할 수 있습니까?/내가 뭘 잘못하고 있니?

+1

'k = 0'은 전역을 만듭니다. 나는 그걸 원하지 않습니다! – Sukima

답변

2

구체적으로 묻는 버그는 제안 된 오류와 같이 정의되지 않은 배열 값을 반복하는 것으로 나타납니다. 당신은 플레이어의 수를 얻고

당신은 당신이 내부 루프 액세스 값으로 시도되는 두 개의 반복을 (하나가 다른 중첩)가 진행,

var playerNumber = prompt('Nr of players?'); 

다음 줄을 원하는 여기에 논리적 오류가 중첩 된 루프 나에게 나타납니다

for (i = 0; i < playerNumber; i++) { 
    playersArray[i] = new player(inputName, inputDealer); 
    for (k=0; k < playerNumber; k++) { 
     if (playersArray[k].playerDealer == 'yes') { 
      ... 
     } 
    } 
} 

: 외부 루프는 아직 확보하지 않았기 때문에 아직 할당되지 않았습니다. 모든 플레이어를 하나의 루프로 초기화 한 다음 나중에 모든 플레이어에게 할당 된 딜러가 있는지 확인하는 것이 좋습니다.

저는 여기에 의도적으로 근시가되고 있으며, 제가보기에 다른 질문을 간과하고 질문에 초점을 맞추고 있다고 덧붙여 야합니다.

+0

감사합니다 -'playersArray [i] = 새 플레이어 (inputName, inputDealer);로 생각했습니다. II는 첫 번째 플레이어를 초기화하고 possition 0에 배열로 밀어 넣습니다. 이것이 맞으면 두 번째 루프가 다음을 수행 할 수 있어야합니다. 적어도이 첫 번째 플레이어를 확인해야하지 않습니까? – DDEX

+1

물론, 'k'카운터가있는 중첩 루프의 두 번째 반복에서는 (k = 1), 외부 루프 (i = 0)의 첫 번째 반복에서는 어떻게됩니까? 이 실행 시점에서 playersArray [0]은 인덱스 0에 삽입 되었기 때문에 정의되었지만 값을 초기화하는 외부 루프는 플레이어를 인덱스 1에서 초기화하지 않았습니다. 그러나 내부 루프가 플레이어를 확인하고 있습니다 인덱스 2에서 확인합니다. 3.그 밖에도 인덱스 0에있는 플레이어 만 초기화되었습니다. – bmhkim

+0

@ bmkhin : 선생님, 맞습니다! 이 연습에 대한 접근 방식을 완전히 바꾸고 두 번째 루프를 없애고 if (dealerAssigned && inputDealer == 'yes') {alert ("already assigned"); playersArray [i] = 새로운 플레이어 (inputName, 'no'); 그리고 그것은 마술처럼 작동합니다. 당신의 도움을 주셔서 감사합니다! – DDEX

0

for 루프 내의 for 루프는 아직 채워지지 않은 배열을 반복합니다.

첫 번째 반복 playersArray[j] = new Player(...)은 배열 [Player] 또는 배열 을 하나의 요소로 만듭니다! 그러나 두 번째 루프는 많은 요소의 배열을 찾고 있습니다. 일단 playersArray[1]을 찾았지만 playerArray[0]이 있으면 정의되지 않았으므로 undefined.playerDealer은 TypeError를 발생시킵니다.

0

는`이것은 당신의 구조 stipped 다운입니다 :

for (i = 0; i < playerNumber; i++) { 
    playersArray[i] = new player(inputName, inputDealer); 
    for (k=0;k<playerNumber;k++)...{ 

     //anything with index k > i is undefined, since your outer loop 
     //hasn't initialized it yet. 
    } 
} 

당신의 i -loop이 될 수있는 배열의 크기에 대한 요소를 삽입하려고하지만 것 같다 당신의 k -loop도에 노력하고있다 초기화 된 부분 대신 전체 어레이에 액세스하십시오. 이것을 for (k=0; k<i+1 ;k++)으로 제한하여 이전에 초기화 된 값만 확인하십시오. playersArray

관련 문제