解释代码

时间:2013-07-15 05:06:50

标签: java arrays poker

以下是代码:

基本上,这个代码打印出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]

我没有表现出来的是,为什么他们乘以SUITS乘以我然后加上j。令人困惑的是SUITS(等于4),乘以i(13),然后加上j(其值为4),根本不等于52。 请解释一下,这个功能是如何工作的。

5 个答案:

答案 0 :(得分:5)

你的i变量只会在0到12之间,而j变量会变为0到3,所以索引的最大值是4 * 12 + 3 = 51,这是你的套牌的最大索引。这样的牌组有52个元素,对于一副牌来说是有意义的。

答案 1 :(得分:4)

通过这样的方式将2D数组放入一维数组中是一种常见的习惯用法:

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

这称为在“行主要顺序”中展开矩阵,即在开始下一行之前填充每一行。而不是实际的行指示,每行在1D数组中以行号*行大小(行大小只是列数)开始。使用“ROWSIZE”代替“COLUMNS”可以使代码更清晰。

您也可以在“列主要订单”中执行此操作,如下所示:

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

假设您有3行4列。第一个代码将填充数组:

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

后者会像这样填充数组:

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

...但是,由于他接下来要做的就是对阵列进行洗牌,因此创建它的顺序并不重要。

顺便说一句,使用琴弦是一个糟糕的主意。查看representing playing cards in software

答案 2 :(得分:2)

索引“i”将取0到12之间的值

答案 3 :(得分: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];

        }
    }

SUITS的长度为4,RANKS的长度为12,N的大小为52(意味着String [] deck有52个位置)

因此,int i = 0; i < RANKS; i++将从0变为12,int j = 0; j < SUITS; j++将从0变为3。

因此,4 * 12 + 3是51 - 或卡52。

答案 4 :(得分:1)

在它洗牌之前;它基本上是一个线性阵列上的二维数组。

ARRAY[CURRENT_ROW][CURRENT_COLUMN]

= ARRAY[(NUMBER_OF_COLUMNS * CURRENT_ROW) + CURRENT_COLUMN]

索引CURRENT_ROWCURRENT_COLUMN从0开始