【问题标题】:Trying to get GUI to print random card in deck using arrayList试图让 GUI 使用 arrayList 在卡组中打印随机卡片
【发布时间】:2015-05-01 19:19:10
【问题描述】:

所以我目前正在用 Java 开发一款纸牌战争游戏。我试图让 GUI 屏幕使用 arrayList 从一组卡片图像中打印 2 张随机卡片(必须使用它进行分配)。卡片图像文件被命名为 1.png,2.png,...52.png 并存储在 image/card 目录中。我的问题是如何让两张牌随机出现?谢谢,这是我的代码

另外,请注意,我是一个相对较新的程序员

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.layout.StackPane;
import javafx.scene.layout.GridPane;
import javafx.stage.Stage;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.scene.control.Label;
import javafx.scene.text.Text;
import javafx.scene.text.Font;
import javafx.scene.paint.Color;
import javafx.scene.text.FontWeight;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.scene.layout.HBox;
import javafx.scene.layout.Pane;
import java.util.ArrayList;

public class CardWar extends Application{

public static void main(String args[]){
Application.launch(args);


}

@Override
public void start(Stage primaryStage){


ArrayList<Integer> cardList = new ArrayList<>();

for(int i = 1; i <=52;i++){
cardList.add(i);
}


java.util.Collections.shuffle(cardList);
System.out.println(cardList.get(0));




//Label label1 = new Label ("Welcome to the Card War Game!");

//layout for first scene
StackPane layout1 = new StackPane();
Button welcome = new Button("Click to Play");
Text text1 = new Text(20,20, "Welcome to The Game");
layout1.getChildren().add(welcome);



//layout for second scene
//Button button2 = new Button("You are here!");
Pane layout2 = new HBox (457);
//layout2.getChildren().add(button2);
Image image = new Image("image/card/1.png");
Image image2 = new Image("image/card/2.png");

ImageView imageView2 = new ImageView(image);
imageView2.setFitHeight(100);
imageView2.setFitWidth(100);

layout2.getChildren().add(new ImageView (image));
layout2.getChildren().add(new ImageView (image2));



Scene scene = new Scene (layout1,600,300);
Scene scene2 = new Scene(layout2,600,300);

welcome.setOnAction(e -> primaryStage.setScene(scene2));

primaryStage.setScene(scene);
primaryStage.setTitle("War Game");
primaryStage.show();

}
} 

【问题讨论】:

    标签: java random arraylist javafx


    【解决方案1】:

    这是您的代码的修改版本。这是你应该做的:

    • 创建一个专用的 Card 类,一个您可以使用的对象。不要使用整数
    • 将卡片加载到列表(牌组)中。卡片仅加载一次
    • 创建库存,即。 e.您可以修改的列表中的列表
    • 洗牌
    • 把股票放在桌子上
    • 从库存中挑选一张卡片并将其添加到画面中,直到库存中没有更多可用卡片为止

    代码:

    public class CardWar extends Application {
    
        /**
         * List of all available cards. Loaded once at game start.
         */
        List<Card> deck;
    
        /**
         * List of cards in the game.
         */
        List<Card> stock;
    
        /**
         * Cards to be dealt
         */
        Pane stockPane;
    
        /**
         * Cards which are already dealt
         */
        FlowPane tableauPane;
    
        public static void main(String args[]) {
            Application.launch(args);
    
        }
    
        @Override
        public void start(Stage primaryStage) {
    
            // load all cards into a list
            loadCards();
    
            // create playfield: table with toolbar
            BorderPane playfield = new BorderPane();
            playfield.setStyle("-fx-background-color:green");
    
            // simple flowpane to align one card next to the other 
            FlowPane tableauPane = new FlowPane();
    
            // pick 2 cards and add them to the table
            Button button = new Button( "Pick Cards");
            button.setOnAction( e -> {
    
                // abort if we don't have cards in the deck
                if( stock.size() == 0)
                    return;
    
                Card card;
    
                // pick top card and add it to the table
                card = stock.remove( stock.size()-1);
                stockPane.getChildren().remove(card);
                tableauPane.getChildren().add(card);
    
                // pick top card and add it to the table
                card = stock.remove( stock.size()-1);
                stockPane.getChildren().remove(card);
                tableauPane.getChildren().add(card);
    
            });
    
            playfield.setCenter(tableauPane);
    
            // talon contains all cards of the deck
            stockPane = new Pane();
            playfield.setBottom(stockPane);
    
            // toolbar with a button
            HBox toolbar = new HBox();
            toolbar.getChildren().add( button);
    
            playfield.setTop(toolbar);
    
            Scene scene = new Scene(playfield, 1600, 900, Color.GREEN);
    
            primaryStage.setScene(scene);
            primaryStage.setTitle("War Game");
            primaryStage.show();
    
            // create deck for game, shuffle cards
            startGame();
    
        }
    
        private void startGame() {
    
            // create stock from deck
            stock = new ArrayList<>( deck);
    
            // shuffle stock
            Collections.shuffle(stock);
    
            // put cards on stock pane
            for( int i=0; i < stock.size(); i++) {
    
                // get card from stock
                Card card = stock.get(i);
    
                // set card position
                card.setLayoutX(i * 20);
    
                // put card on stock pane
                stockPane.getChildren().add( card);
    
            }
        }
    
        private void loadCards() {
    
            deck = new ArrayList<>();
    
            for (int i = 1; i <= 52; i++) {
                deck.add( new Card( i));
            }
        }
    
        private static class Card extends ImageView {
    
            public Card( int id) {
    
                setImage(new Image( getClass().getResource("image/card/" + id + ".png").toExternalForm()));
    
                setFitHeight(100);
                setFitWidth(100);
    
            }
    
        }
    }
    

    【讨论】:

      【解决方案2】:

      您可以使用Collections.shuffle(...) 方法对ArrayList 进行洗牌。

      然后只取ArrayList 中的前两个条目。

      【讨论】:

      • 这就是我正在做的,但我不知道如何让它调用这两个条目
      • 对不起,我错过了。那我不明白你的问题。
      • 我必须从一副 52 个图像文件中打印两张随机卡片的图像,但我不知道该怎么做
      • 再说一次,我不确定你在问什么。您似乎已经拥有加载两个硬编码图像的代码。因此,您只需修改代码以根据 ArrayList 中前两个条目的值创建图像文件名。
      • 或者将图片放在列表或地图中
      【解决方案3】:

      您可以使用 .subList(fromIndex, toIndex) 创建一个像这样的新列表

      ArrayList list2= new ArrayList(
      <your list>.subList(0,1))
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2023-03-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-07-04
        • 1970-01-01
        • 2016-06-04
        相关资源
        最近更新 更多