2013-07-15 3 views
0

다음은 코드입니다.코드 설명

기본적으로이 코드는 suit + rank가있는 52 개의 카드를 인쇄합니다.

package javaapplication52; 

public class JavaApplication52 { 

    public static void deck() { 

     String[] suit = { "Clubs", "Diamonds", "Hearts", "Spades" }; 
     String[] rank = { "2", "3", "4", "5", "6", "7", "8", "9", "10", "Jack", 
       "Queen", "King", "Ace" }; 

     // avoid hardwired constants 
     int SUITS = suit.length; 
     int RANKS = rank.length; 
     int N = SUITS * RANKS; 
     // initialize deck 
     String[] deck = new String[N]; 
     for (int i = 0; i < RANKS; i++) { 
      for (int j = 0; j < SUITS; j++) { 
       deck[SUITS * i + j] = rank[i] + " of " + suit[j]; 

      } 
     } 
     // shuffle 
     for (int i = 0; i < N; i++) { 
      int r = i + (int) (Math.random() * (N - i)); 
      String t = deck[r]; 
      deck[r] = deck[i]; 
      deck[i] = t; 
     } 

     // print shuffled deck 
     for (int i = 0; i < N; i++) { 
      System.out.println(deck[i]); 

     } 

    } 

    public static void main(String[] arg) { 

     JavaApplication52 d = new JavaApplication52(); 

     d.deck(); 

    } 
} 

나 내가했다 스탠드에서하지 않았다 무엇

deck[SUITS * i + j] = rank[i] + " of " + suit[j] 

에 아무 의미하지 코드는, 왜 그들이 정장 그때 J를 추가 곱 곱 않았다. 혼란스러운 것은 SUITS (4와 같음), i (13)를 곱한 다음 j (4의 값을 가짐)를 더하고 52와 전혀 같지 않음. 이 함수가 어떻게 작동했는지 설명하십시오. 인덱스가 4이기.

+3

Maxmium 값으로부터 시작 CURRENT_COLUMN와 indices

ARRAY[CURRENT_ROW][CURRENT_COLUMN] = ARRAY[(NUMBER_OF_COLUMNS * CURRENT_ROW) + CURRENT_COLUMN] 

은'j' 3. SO 4 * 12 + 3 = 51 (52 배열의 값)는 12이다. – Mics

+0

나는 C#에서 비슷한 코드를 썼다. 혼란스러운 라인 뒤의 내부 for 루프에이 라인을 추가하면, 물건 자체를 설명 할 수있게 만든다. Console.WriteLine ("deck [{0}] = {1}", SUITS * i + j, 갑판 [SUITS * i + j]); (콘솔 (또는 명령 프롬프트)에 대한 Java 기반 출력으로 변환하십시오 ... 그리고 이해하려고 ... –

+2

당신은 http://codereview.stackexchange.com/ – zEro

답변

2

인덱스 "나"

+0

을 방문해야합니다. 아주 완전한 대답이 아닙니다. 많이 pur3extrme에 분명하다 ... –

+1

@ jesses.co.tt 사실 당신이 질문을주의 깊게 보면, OP는 실제로 내가 13이 될 것이라고 말하고있다. "i 곱하기 (13)" – Sikorski

+0

@Sikorski 박람회 충분하지만, 당신 말이 맞아요.하지만 sudopunk의 대답은 아직 부족합니다 ... –

5

고객의 변수 i는 단지 0-3 갈 0-12 및 J 변수 사이 갈 12하도록 최대치를 0의 값을 취한다 덱 최대 인덱스이다. 이러한 데크 벌의 카드에 대한 감각을 52 개 요소를 가질 것이다.

2
// avoid hardwired constants 
    int SUITS = suit.length; 
    int RANKS = rank.length; 
    int N = SUITS * RANKS; 
    // initialize deck 
    String[] deck = new String[N]; 
    for (int i = 0; i < RANKS; i++) { 
     for (int j = 0; j < SUITS; j++) { 
      deck[SUITS * i + j] = rank[i] + " of " + suit[j]; 

     } 
    } 

정장 (4)의 길이를 가지며, + 3 = 51 * 12, 랭크 가지고 (12)의 길이 및 N 그러므로

, int i = 0; i < RANKS; i++은 0 내지 12으로 이동하며, int j = 0; j < SUITS; j++ 따라서 3

0에서 이동한다 (문자열 [] 데크 (52 개)의 위치를 ​​갖는 것을 의미 함) (52)의 크기를 갖는다

for (row = 0; row < ROWS; ++row) { 
    for (col = 0; col < COLUMNS; ++col) { 
     array[row * ROWSIZE + col] = . . . 
    } 
} 

이의 행렬을 줄이기이라고 "행 : 나 카드 52

+0

SUITS * 1 + j를 꺼내서 52로 바꿨습니다; 그들의 차이점은 무엇입니까? – pur3extrme

+0

@ pur3extme 죄송합니다. 대신 수학이 잘못되었습니다. 배열에 52 개의 위치가 있지만 배열은 0으로 인덱싱되므로 가장 큰 위치는 51입니다. 내 게시물을 편집합니다. – Singular1ty

+0

여전히 정적입니다. 준 me null – pur3extrme

4

이런 식으로 뭔가에 의해 1 차원 배열에 일의 2 차원 배열을 넣어 일반적인 관용구이다 -, 4 * 12 + 3은 51입니다 주요 주문 "즉, 각 행은 다음 행을 시작하기 전에 채워집니다. 실제 행 표시 대신 각 행은 행 번호 * 행 크기 (행 크기는 열 수)의 1D 배열에서 시작됩니다. "COLUMNS"대신 "ROWSIZE"를 사용하면 코드가 명확 해집니다.

는 또한 다음과 같이 "열 우선 순서"에서 작업을 수행 할 수 있습니다

. . . array[col * ROWS + row] = . . . 

하는의는 3 행과 4 열을 가지고 있다고 가정 해 봅시다. 배열 셔플을

0 4 8 1 5 9 2 6 10 3 7 11 

...하지만 그가하는 바로 다음 일 이후입니다 :

0 1 2 3 4 5 6 7 8 9 10 11 

후자는 같은 배열을 채울 것입니다 : 첫 번째 코드는 다음과 같이 배열을 채울 것입니다 어떤 순서로 생성되었는지는 중요하지 않습니다.

제쳐두고, 카드 용 문자열을 사용하는 것은 끔찍한 생각입니다. representing playing cards in software을 확인하십시오.

+0

행 주요 주문에 대한 언급에 흥미를 느꼈지만 행 주요 주문 수식을 문제의 질문과 관련시킬 수 없습니다. 나는 정장을 행에 연결하고 열에 순위를 매기면 수식이 맞지 않으며 그 반대도 마찬가지입니다. 위키 피 디아에서 행 주요 순서 수식은 다릅니다. 행 * COLUMNSIZE + col. 당신은 그것을 보거나 질문과 관련시킬 수 있습니까? 어쨌든 +1을 설명하기 위해 +1. – Sikorski

+0

언급 한 텍스트가 보이지 않습니다. 위키피디아의 기사에서'offset = row * NUMCOLS + column'이 맞다는 것을 알 수 있습니다. (내가 말했듯이 "열 크기"와 "열 수"는 같은 것입니다). –

+0

오, 알았어. 좀 더주의 깊게 읽어야 했어! – Sikorski

1

셔플 링되기 전에; 기본적으로 선형 배열을 통해 2 차원 배열입니다.CURRENT_ROW 및 i` '0