当前位置: 首页 > 知识库问答 >
问题:

一个洗牌的程序,当我点击洗牌按钮时,牌会在GUI窗口上消失

赵飞语
2023-03-14

到目前为止,我所有的代码都编译得很好,但是洗牌按钮使所有的牌都消失了

import java.util.Random;
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.stage.Stage;
import javafx.scene.image.ImageView;
import javafx.scene.layout.*;
import javafx.scene.control.Button;
import javafx.geometry.Pos;

public class P6 extends Application
{
    public static final int ASIZE = 54;
    public static final int ROWS = 6;
    public static final int COLS = 9;

    public void start(Stage primaryStage)
    {
        int aCardDeck[] = new int[ASIZE];       //54 cards in a deck
        for( int i = 0 ; i < ASIZE ; i++ )  //ASIZE is 54
        aCardDeck[i] = i + 1;       //populate with elements 1-54

        GridPane gPane = new GridPane();        //Instantiate Grid for cards in rows/cols

        for( int i = 0, k = 0 ; i < ROWS && k < ASIZE; i++ )  //6 rows, 9 columns 
            for( int j = 0; j < COLS ; j++ )
            gPane.add(new ImageView("image/card/" + aCardDeck[k++] + ".png"),j,i);



        Button btShuffle = new Button("Shuffle");
        btShuffle.setOnAction
        ( e ->                  // Lamda Event Handler
        {                   // Like anonymous inner class
        int r, c, n;
        shuffle( aCardDeck );       // Random shuffle
        gPane.getChildren().clear();
        for ( r = n = 0; r < ROWS && n < ASIZE; r++)
        for (c = 0; c < COLS ; c++)
        gPane.add(new ImageView("~/../public/image/card/" + aCardDeck[n++]
        + ".png"),c,r);
        }
        ); 

        HBox hBox = new HBox(5);            // Row of buttons
        hBox.getChildren().add( btShuffle );    // Add button to box


        BorderPane pane = new BorderPane();
        pane.setCenter(gPane);          // Layout rows of cards in center
        pane.setBottom(hBox);           // Layout buttons at bottom
        BorderPane.setAlignment(hBox, Pos.CENTER);
        Scene scene = new Scene(pane, 650, 600); // Create scene, place in stage
        primaryStage.setTitle("P6");        // Set the stage title
        primaryStage.setScene(scene);       // Place the scene in the stage
        primaryStage.show();            // Display the stage
        }

    public void ascendSort (int [] a){}
    public void descendSort (int [] a){}
    public void ascendRankSort (int [] a){}
    public void descendRankSort (int [] a){}

    public void shuffle( int [] a ){
        int r, tmp;
        Random rand = new Random();
        long seed = System.currentTimeMillis();
        rand.setSeed(seed);
        for( int i = 0 ; i < ASIZE ; i++ ){
        r = rand.nextInt(ASIZE);

        tmp = a[r];
        a[r] = a[i];
        a[i] = tmp; 
}
}
    public static void main(String[] arg`enter code here`s)
    {
    launch(args);
    }
}

错误消息:线程“JavaFX Application thread”Java.lang.IllegalArgumentException:无效URL:在javafx.scene.image.image.validateurl(image.Java:1094)在javafx.scene.image.image(image.Java:598)在javafx.scene.image.image.image.view(imageview.Java:164)在p6.lambda$start$0(p6.lambda$lambda$1/16273898(imageview.Java:164)在Dispatcher.DispatchEvent(BasicEventDispatchChainImpl.DispatchEvent(EventDispatchChainImpl.java:114)(BasicEventDispatchEvent(BasicEventDispatchEvent(BasicEventDispatchEvent:56)(BasicEventDispatchEvent:56)(BasicEventDispatchEvent(BasicEventDispatchEvent:56)(BasicEventDispatchEvent(EventDispatchChainImpl.java:114在com.sun.javafx.event.CompositeEventHandler.DispatchBubblingEvent(CompositeEventHandler.java:80)在com.sun.javafx.event.EventHandlerManager.DispatchBubblingEvent(EventHandlerManager.java:238)在com.sun.javafx.event.EventHandlerManager.DispatchBubblingEvent(EventHandlerManager.java:191)在com.sun.javafx.event.CompositeEventDispatchEvent(ventutil.java:74)在com.sun.javafx.event.eventutil.fireevent(event.java:54)在javafx.scene.scene$mousehandler.process(scene.java:3746)在javafx.scene.scene$mousehandler.access$1800(scene.java:3471)在javafx.scene.scene.impl_processmouseevent(scene.java:1695)在javafx.scene.scene$scenePeerListener.mouseevent(n.java:48)在com.sun.glass.ui.gtk.gtkApplication$6$1.在java.lang.Thread.Run(gtkApplication.java:149)在java.lang.IllegalArgumentException:无效URL或在javafx.scene.image.image.validateurl(image.java:1086)找不到资源

共有1个答案

沃驰
2023-03-14

好吧,我想我有一个答案,但我还没有测试过,所以我不确定。

但我相信你的问题是编码不一致。

下面是您在开始填充GPANE时使用的行:

gPane.add(new ImageView("image/card/" + aCardDeck[k++] + ".png"),j,i);

这是随机化后使用的线:

gPane.add(new ImageView("~/../public/image/card/" + aCardDeck[n++]
        + ".png"),c,r);

我认为您遇到的问题是public/image/card是错误的路径,您需要对其进行更改,使其与以前的路径相同。另外,我将使它成为refresh方法,而不是到处复制那一行代码。因此,您将在每次更改数组时调用refresh方法,而不是在任何地方复制+粘贴gpane.add(...)

 类似资料:
  • 大多数纸牌游戏都需要洗牌,也就是让纸牌随机排列。在第10.5节,我们看到了怎样生成随机数,但怎样利用随机数实现洗牌功能却并非显然意见的。 一种可行的方案是,模拟人洗牌的方法,将牌分为两堆,然后通过在每个牌堆中轮流选择的方式实现原牌堆的重新组织。因为一般而言,人并不能做到完美地洗牌,而程序经过大约7次迭代之后,牌堆中纸牌的顺序已经相当随机了。但是计算机程序每次在做完美洗牌的时候有一个令人讨厌的属性—

  • 在第13.6节我们编写了一个洗牌算法的伪代码。假设shuffleDeck函数实现洗牌功能,其参数为一个牌堆,我们就可以这样创建牌堆并洗牌: Deck deck; // 创建一个标准的52张牌的牌堆 deck.shuffle (); // 洗牌 然后,使用subdeck函数来分几手牌: Deck hand1 = deck.subdeck (0, 4); Deck hand2 = dec

  • 问题内容: 我想知道,是否有某种方法可以在mysql / sql中改组字符串的字母,即类似 伪代码的内容 :? 从http://dev.mysql.com/doc/refman/5.0/en/string- functions.html 找不到任何内容,对其进行搜索似乎只是找到改组结果的解决方案,而不是字符串。 问题答案: 干得好: 有关输出,请参见sqlfiddle.com。 已使用mariad

  • 在本作业中,您将使用小程序显示扑克牌的图像。小程序应该从您下载的“images”文件夹中加载一组52张扑克牌图像。小程序应该洗牌(使用随机数生成器)并显示洗牌牌组的前10张牌。将卡片分为两行,每行五张。 我的小程序部分工作,但是当我运行小程序查看器时,显示只是同一张卡十次。这是我的代码:

  • 我已经完成了完美洗牌的几乎所有java代码。我只是在与错误作斗争:“线程“main”java.lang.ArrayIndexOutOfBoundsException中的异常:索引26长度26在cards\u shuffle.main(cards\u shuffle.java:72)”此错误指的是行: 洗牌牌组的上半部分: 黑桃4黑桃10钻石8黑桃A钻石4红桃J红桃Q黑桃Q黑桃4钻石J黑桃K红桃K红

  • 本文向大家介绍C++扑克牌的洗牌发牌游戏设计,包括了C++扑克牌的洗牌发牌游戏设计的使用技巧和注意事项,需要的朋友参考一下 笔者在大学二年级期间,做过的一次C++程序设计:扑克牌的洗牌发牌游戏。具体内容是:除去大王和小王,将52张扑克牌洗牌,并发出5张牌。然后判断这5张牌中有几张相同大小的牌,是否是一条链,有几个同花等。 笔者在学习他人设计的基础上,完成了自己的程序设计。这里将源程序分享给大家。