Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/353.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 制作纸牌游戏时,需要根据玩家';手_Java_Swing_User Interface_Grid Layout_Playing Cards - Fatal编程技术网

Java 制作纸牌游戏时,需要根据玩家';手

Java 制作纸牌游戏时,需要根据玩家';手,java,swing,user-interface,grid-layout,playing-cards,Java,Swing,User Interface,Grid Layout,Playing Cards,在我的游戏中,玩家的手牌通常是5张左右(和一个单独的ArrayList),但在游戏中有很多“抽牌”选项,可以很快得到大量的牌。在显示卡的任何地方,我都会将它们放在一个JLabel中,该标签会更新以显示图像,单击后,图像会移动到玩家弃牌堆,卡会添加到弃牌ArrayList,如下所示: private void mainDeckMouseClicked(java.awt.event.MouseEvent evt) {

在我的游戏中,玩家的手牌通常是5张左右(和一个单独的
ArrayList
),但在游戏中有很多“抽牌”选项,可以很快得到大量的牌。在显示卡的任何地方,我都会将它们放在一个
JLabel
中,该标签会更新以显示图像,单击后,图像会移动到玩家弃牌堆,卡会添加到弃牌
ArrayList
,如下所示:

private void mainDeckMouseClicked(java.awt.event.MouseEvent evt) {                                      
        ImageIcon mainDeckEmpty = new ImageIcon("C:\\DC Card Game\\src\\DCCardGame\\resources\\Other Cards\\Empty Main Deck.png");

        if (DrawCards.cards.isEmpty())
            mainDeck.setIcon(mainDeckEmpty);

        if (slot1Card == noCard)
        {
            if (!DrawCards.cards.isEmpty())
            {
                slot1Card = DrawCards.drawFromMainDeck();
                lineupSlot1.setIcon(new ImageIcon(slot1Card.getImage()));
                lineupSlot1.setToolTipText(slot1Card.getCardText());
                if (DrawCards.cards.isEmpty())
                mainDeck.setIcon(mainDeckEmpty);
            }
        }
}
private void playerDeckMouseClicked(java.awt.event.MouseEvent evt) {                                        
    ImageIcon playerDeckEmpty = new ImageIcon("C:\\DC Card       Game\\src\\DCCardGame\\resources\\Other Cards\\Empty Player Deck.png");

    if (DrawCards.player_1_deck.isEmpty())
        playerDeck.setIcon(playerDeckEmpty);

    for (int i = 0; i < 5 && !DrawCards.cards.isEmpty(); i++)
    {
            playerHandSlotCard = DrawCards.drawFromPlayerDeck();
            playerHandSlot.setIcon(new ImageIcon(playerHandSlot1Card.getImage()));
            playerHandSlot.setToolTipText(playerHandSlot1Card.getCardText());
            playerHandList.add(platerHandSlot);
    }
    if (DrawCards.player_1_deck.isEmpty())
        playerDeck.setIcon(playerDeckEmpty);
}
这是单击主牌组并将牌添加到列表中时的代码片段。这个很好用

我遇到的问题是,对于
playerHand
ArrayList
,我不知道如何动态添加
JLabel
(必要时),根据绘制的卡为其分配图像,然后将实际的卡对象分配给可操作的变量。在上面的例子中,我将它分配给一个预定义的变量
slot1Card
,那么当我无法在运行时定义一张卡时,我如何才能将它分配给一个变量,或者有没有一种方法可以在不使用变量的情况下分配上面显示的所有值(放弃图像、玩家手部图像、工具提示文本、卡对象等)?此外,我还在
JScrollPane
内使用
GridLayout
在面板中显示玩家手牌

提前谢谢

编辑:更多SSCCE-这是我刚刚快速编写的代码,以便在鼠标单击时将牌组中的牌添加到玩家手上。我相信,这需要进行修改,以便为jpanel添加标签

private void playerDeckMouseClicked(java.awt.event.MouseEvent evt) {                                        
    ImageIcon playerDeckEmpty = new ImageIcon("C:\\DC Card       Game\\src\\DCCardGame\\resources\\Other Cards\\Empty Player Deck.png");

    if (DrawCards.player_1_deck.isEmpty())
        playerDeck.setIcon(playerDeckEmpty);

    if (!DrawCards.cards.isEmpty())
        {
            playerHandSlot1Card = DrawCards.drawFromPlayerDeck();
            playerHandSlot1.setIcon(new ImageIcon(playerHandSlot1Card.getImage()));
            playerHandSlot1.setToolTipText(playerHandSlot1Card.getCardText());

            playerHandSlot2Card = DrawCards.drawFromPlayerDeck();
            playerHandSlot2.setIcon(new ImageIcon(playerHandSlot2Card.getImage()));
            playerHandSlot2.setToolTipText(playerHandSlot2Card.getCardText());

            playerHandSlot3Card = DrawCards.drawFromPlayerDeck();
            playerHandSlot3.setIcon(new ImageIcon(playerHandSlot3Card.getImage()));
            playerHandSlot3.setToolTipText(playerHandSlot3Card.getCardText());

            playerHandSlot4Card = DrawCards.drawFromPlayerDeck();
            playerHandSlot4.setIcon(new ImageIcon(playerHandSlot4Card.getImage())); 
            playerHandSlot4.setToolTipText(playerHandSlot4Card.getCardText());

            playerHandSlot5Card = DrawCards.drawFromPlayerDeck();
            playerHandSlot5.setIcon(new ImageIcon(playerHandSlot5Card.getImage()));
            playerHandSlot5.setToolTipText(playerHandSlot5Card.getCardText());
        }
    if (DrawCards.player_1_deck.isEmpty())
        playerDeck.setIcon(playerDeckEmpty);
}                                       

使用
列表
,例如
数组列表
,而不是为每个玩家的卡创建单独的变量。您可以根据需要创建列表的每个元素,如下所示:

private void mainDeckMouseClicked(java.awt.event.MouseEvent evt) {                                      
        ImageIcon mainDeckEmpty = new ImageIcon("C:\\DC Card Game\\src\\DCCardGame\\resources\\Other Cards\\Empty Main Deck.png");

        if (DrawCards.cards.isEmpty())
            mainDeck.setIcon(mainDeckEmpty);

        if (slot1Card == noCard)
        {
            if (!DrawCards.cards.isEmpty())
            {
                slot1Card = DrawCards.drawFromMainDeck();
                lineupSlot1.setIcon(new ImageIcon(slot1Card.getImage()));
                lineupSlot1.setToolTipText(slot1Card.getCardText());
                if (DrawCards.cards.isEmpty())
                mainDeck.setIcon(mainDeckEmpty);
            }
        }
}
private void playerDeckMouseClicked(java.awt.event.MouseEvent evt) {                                        
    ImageIcon playerDeckEmpty = new ImageIcon("C:\\DC Card       Game\\src\\DCCardGame\\resources\\Other Cards\\Empty Player Deck.png");

    if (DrawCards.player_1_deck.isEmpty())
        playerDeck.setIcon(playerDeckEmpty);

    for (int i = 0; i < 5 && !DrawCards.cards.isEmpty(); i++)
    {
            playerHandSlotCard = DrawCards.drawFromPlayerDeck();
            playerHandSlot.setIcon(new ImageIcon(playerHandSlot1Card.getImage()));
            playerHandSlot.setToolTipText(playerHandSlot1Card.getCardText());
            playerHandList.add(platerHandSlot);
    }
    if (DrawCards.player_1_deck.isEmpty())
        playerDeck.setIcon(playerDeckEmpty);
}

我不是说那是不对的,但这对我来说没有意义。你想详细说明一下吗?享受吧。你真的应该发布一个SSCE。谢谢你花时间!我通常会发布SSCCE,但我不确定我是否需要它,因为这几乎是用很少定义的变量从头开始编写的。另外,除了顶部的arrayList之外,我不确定您的代码与我的代码有什么不同。我会遇到的问题是1)我不知道如何在运行时创建新标签,2)重复向标签添加相同的内容似乎不起作用,因为我需要标签的名称来修改它,还需要一个变量(如slot1Card)来修改它。不要在运行时加载图像、图像图标、图标或缓冲区图像,将此对象存储为本地variable@mKorbel事实上,它存储在一个名为slot1card的卡片变量中。您没有添加到
数组列表中。
。@madpysicator您是对的,我在解释我要做的事情时做得很糟糕。我现在要坐在上面,仔细考虑一下,以后再来。谢谢你的帮助。@bitli好主意,真不敢相信我没看到。我还是个新手,所以谢谢你!对不起,我部分理解你的问题。我认为你们应该在游戏开始前在某个地方初始化所有的卡(缓存类或其他东西),并在需要的时候收集它们。