试图让 GUI 使用 arrayList 在甲板上打印随机卡片 [英] Trying to get GUI to print random card in deck using arrayList

查看:17
本文介绍了试图让 GUI 使用 arrayList 在甲板上打印随机卡片的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

So I'm currently working on a Card War Game in java. I'm trying to get the GUI screen to print 2 random cards from a set of card images using an arrayList (must use this for assignment). The card image files are named 1.png,2.png,...52.png and stored in a image/card directory. My question is how do I get two cards to appear randomly? Thanks here's my code

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

Also, just to note, I'm a relatively new programmer

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();

}
} 

推荐答案

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

Here's a modified version of your code. This is what you should do:

  • 创建一个专用的 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);

        }

    }
}

这篇关于试图让 GUI 使用 arrayList 在甲板上打印随机卡片的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆