0

这是代码:

基本上,这段代码打印出 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。所以请解释一下,这个函数是如何工作的。

4

5 回答 5

5

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

于 2013-07-15T05:14:03.483 回答
4

通过以下方式将 2D 数组放入 1D 数组是一种常见的习惯用法:

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

这称为以“行主要顺序”展开矩阵,即在开始下一行之前填充每一行。每一行不是实际的行索引,而是在一维数组中以行号 * 行大小(行大小只是列数)开始。使用“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

...但是由于他接下来要做的就是对数组进行洗牌,所以它的创建顺序无关紧要。

顺便说一句,使用字符串作为卡片是一个糟糕的主意。查看在软件中代表扑克牌

于 2013-07-15T06:02:19.693 回答
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[] 甲板有 52 个位置)

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

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

于 2013-07-15T05:16:15.997 回答
2

索引“i”将取值从 0 到 12

于 2013-07-15T05:13:05.297 回答
1

在它被洗牌之前;它基本上是线性数组上的二维数组..

ARRAY[CURRENT_ROW][CURRENT_COLUMN]

= ARRAY[(NUMBER_OF_COLUMNS * CURRENT_ROW) + CURRENT_COLUMN]

其中索引CURRENT_ROWCURRENT_COLUMN从 0 开始

于 2013-07-15T06:40:38.257 回答