将数值设置为卡片值
Setting Numeric Values to Card Values
这是我现在拥有的:
import javafx.application.Application;
import javafx.event.ActionEvent;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.control.TextField;
import javafx.scene.image.Image;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.HBox;
import javafx.scene.layout.Pane;
import javafx.stage.Stage;
import javafx.scene.image.ImageView;
import java.util.ArrayList;
import java.util.Collections;
import java.util.LinkedList;
import java.util.concurrent.atomic.AtomicReference;
import java.util.*;
public class Main extends Application {
private Card card1;
private Card card2;
private Card card3;
private Card card4;
@Override
public void start(Stage primaryStage) {
ArrayList<Integer> deck;
deck = new ArrayList<>();
int i = 1;
while(i < 52){
deck.add(i);
i++;
}
final AtomicReference<String> result = new AtomicReference<>("go.");
Collections.shuffle(deck);
BorderPane pane = new BorderPane();
HBox top = new HBox(10);
Label display = new Label(result.toString());
Button btShuffle = new Button("Shuffle");
top.getChildren().add(display);
top.getChildren().add(btShuffle);
HBox center = new HBox(10);
card1 = new Card(deck.get(0));
center.getChildren().add(card1);
Card card2;
card2 = new Card(deck.get(1));
center.getChildren().add(card2);
card3 = new Card(deck.get(3));
center.getChildren().add(card3);
card4 = new Card(deck.get(4));
center.getChildren().add(card4);
btShuffle.setOnAction(
e -> {
center.getChildren().clear();
Collections.shuffle(deck);
center.getChildren().add(new Card(deck.get(0)));
center.getChildren().add(new Card(deck.get(1)));
center.getChildren().add(new Card(deck.get(3)));
center.getChildren().add(new Card(deck.get(4)));
});
HBox bottom = new HBox(10);
Label expression = new Label("Please Enter the expression: ");
TextField tfExpress = new TextField();
ArrayList<Character> signs = new ArrayList<>();
signs.add('/');
signs.add('+');
signs.add('(');
signs.add(')');
signs.add('-');
signs.add('^');
signs.add('*');
signs.add('%');
String str = tfExpress.getText();
int express = (str != null && !"".equals(str)) ? Integer.parseInt(str) : 0;
// expInput.removeIf(p-> p.equals(signs));
Button btVerify = new Button("Verify");
bottom.getChildren().add(expression);
bottom.getChildren().add(tfExpress);
bottom.getChildren().add(btVerify);
btVerify.setOnAction(
(ActionEvent e) ->
{
LinkedList<Character> expInput = new LinkedList<Character>();
for(char c: tfExpress.getText().toCharArray()){
expInput.add(c);
}
String[] inputIntegers = tfExpress.getText().split("[^0-9]+");
expInput.removeIf(p-> p.equals(signs));
ArrayList<Integer> temp = new ArrayList<>();
for(String s:inputIntegers)
{
temp.add(new Integer(Integer.valueOf(s)));
}
temp.remove(new Integer(card1.CardValue()));
temp.remove(new Integer(card2.CardValue()));
temp.remove(new Integer(card3.CardValue()));
temp.remove(new Integer(card4.CardValue()));
if(temp.isEmpty() /*card1.CardValue() == Character.getNumericValue(deck.get(0))
&& card2.CardValue() == Character.getNumericValue(deck.get(1))
&& card3.CardValue() == Character.getNumericValue(deck.get(2))
&& card4.CardValue() == Character.getNumericValue(deck.get(3))*/)
{
if(express == 24){
display.setText("Correct");
}
else
display.setText("Incorrect");
}
else
display.setText("The numbers in the expression don't "
+ "match the numbers in the set.");
});
pane.setTop(top);
pane.setCenter(center);
pane.setBottom(bottom);
Scene scene = new Scene(pane);
primaryStage.setTitle("24 card game");
primaryStage.setScene(scene);
primaryStage.show();
}
public class Card extends Pane {
public int cardVal;
Card(int card){
Image cardImage;
cardImage = new Image("card/"+ card +".png");
getChildren().add(new ImageView(cardImage));
cardVal = card;
}
public int CardValue(){
int card = 0;
if(cardVal <= 13){
card = cardVal;
}
else if(cardVal > 13 && cardVal <= 26){
card = cardVal - 13;
}
else if(cardVal > 26 && cardVal <= 39){
card = cardVal - 26;
}
else if(cardVal > 39 && cardVal <= 52){
card = cardVal - 39;
}
return card;
}
}
public static void main(String[] args) {
launch(args);
}
}
在我的:
btShuffle.setOnAction(
e -> {
center.getChildren().clear();
Collections.shuffle(deck);
center.getChildren().add(new Card(deck.get(0)));
center.getChildren().add(new Card(deck.get(1)));
center.getChildren().add(new Card(deck.get(3)));
center.getChildren().add(new Card(deck.get(4)));
});
我想将这些值更改为 card1-4,但是当我这样做时它现在不会洗牌。有谁知道这是为什么?此外,我做了一个扫描仪并确定卡片值实际上已正确分配给卡片,现在只是正确评估它们的问题。
我不太确定你的问题是什么,但你似乎假设 card1 == 0
、card2 == 1
等。这不是真的,因为你正在初始化你的卡从你设置为从 1 开始的牌组。你应该从 0 开始你的牌组以获得所需的效果(目前你的牌组中只有 51 张牌)。
for (int i = 0; i < 52; i++) {
deck.add(i);
}
编辑: 您收到 card2
错误的原因是因为您在与 lambda 调用相同的方法中在本地声明它(start()
方法)。从您的 start()
方法中删除语句:Card card2;
,它应该可以工作。
在你的另一个问题中,你提到你想保留你的代码 "condensed"。拜托,不要那样做。您现在应该意识到您的 "condensed" 代码会导致您遇到很多问题,从而导致您来到这里。
这里有一个更好的例子:
- 创建一个带有名称的 Suit 枚举
- 使用名称和值或您拥有的任何其他属性创建一个 Rank 枚举
- 创建一张由 Suit 和 Rank 组成的卡片 class 并根据名称加载图像(是的,您必须正确重命名图像)
- 通过遍历 Suit 和 Rank 的所有组合来创建你的卡片
除此之外别无其他。这是代码:
public class CardsDemo extends Application {
/**
* All the cards in the game. Loaded only once at game start.
*/
private List<Card> deck;
/**
* The cards to be dealt. Created initially from the deck.
*/
private List<Card> stock;
@Override
public void start(Stage primaryStage) {
// create cards
deck = createDeck();
Group root = new Group();
Scene scene = new Scene(root, 300, 250);
primaryStage.setScene(scene);
primaryStage.show();
stock = new ArrayList<>( deck);
// shuffle cards
Collections.shuffle(stock);
// deal cards
while( !stock.isEmpty()) {
Card card = stock.remove(0);
System.out.println( "Dealing: " + card);
}
}
private List<Card> createDeck() {
List<Card> cards = new ArrayList<>();
for( Suit suit: EnumSet.allOf(Suit.class)) {
for( Rank rank: EnumSet.allOf( Rank.class)) {
Card card = new Card( suit, rank);
cards.add( card);
}
}
return cards;
}
public static class Card {
Suit suit;
Rank rank;
public Card( Suit suit, Rank rank) {
this.suit = suit;
this.rank = rank;
// TODO: create imageview
String filename = "card/" + suit.getName() + "_" + rank.getName() + ".png";
System.out.println( "Filename: " + filename);
}
public Suit getSuit() {
return suit;
}
public Rank getRank() {
return rank;
}
public String toString() {
return "Suit: " + suit + ", Rank: " + rank + ", Value: " + rank.getValue();
}
}
public enum Rank {
ACE( "A", 1),
_2( "2", 2),
_3("3", 3),
_4("4", 4),
_5("5", 5),
_6("6", 6),
_7("7", 7),
_8("8", 8),
_9("9", 9),
_10("10", 10),
JACK("J", 11),
QUEEN("Q", 12),
KING("K", 13)
;
String name;
int value;
Rank( String name, int value) {
this.name = name;
this.value = value;
}
public String getName() {
return name;
}
public int getValue() {
return value;
}
}
public enum Suit {
SPADES( "spade"),
HEARTS( "heart"),
CLUBS( "club"),
DIAMONDS("diamond"),
;
String name;
Suit( String name) {
this.name = name;
}
public String getName() {
return name;
}
}
public static void main(String[] args) {
launch(args);
}
}
和this question has an answer关于如何发牌。您不使用 "get",而是使用 "remove" 访问卡片。简单地使用 "get" 只会一遍又一遍地给你同一张牌。您还需要将其删除。但是,remove 也会为您提供已移除的卡,因此 remove 就足够了。
这是我现在拥有的:
import javafx.application.Application;
import javafx.event.ActionEvent;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.control.TextField;
import javafx.scene.image.Image;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.HBox;
import javafx.scene.layout.Pane;
import javafx.stage.Stage;
import javafx.scene.image.ImageView;
import java.util.ArrayList;
import java.util.Collections;
import java.util.LinkedList;
import java.util.concurrent.atomic.AtomicReference;
import java.util.*;
public class Main extends Application {
private Card card1;
private Card card2;
private Card card3;
private Card card4;
@Override
public void start(Stage primaryStage) {
ArrayList<Integer> deck;
deck = new ArrayList<>();
int i = 1;
while(i < 52){
deck.add(i);
i++;
}
final AtomicReference<String> result = new AtomicReference<>("go.");
Collections.shuffle(deck);
BorderPane pane = new BorderPane();
HBox top = new HBox(10);
Label display = new Label(result.toString());
Button btShuffle = new Button("Shuffle");
top.getChildren().add(display);
top.getChildren().add(btShuffle);
HBox center = new HBox(10);
card1 = new Card(deck.get(0));
center.getChildren().add(card1);
Card card2;
card2 = new Card(deck.get(1));
center.getChildren().add(card2);
card3 = new Card(deck.get(3));
center.getChildren().add(card3);
card4 = new Card(deck.get(4));
center.getChildren().add(card4);
btShuffle.setOnAction(
e -> {
center.getChildren().clear();
Collections.shuffle(deck);
center.getChildren().add(new Card(deck.get(0)));
center.getChildren().add(new Card(deck.get(1)));
center.getChildren().add(new Card(deck.get(3)));
center.getChildren().add(new Card(deck.get(4)));
});
HBox bottom = new HBox(10);
Label expression = new Label("Please Enter the expression: ");
TextField tfExpress = new TextField();
ArrayList<Character> signs = new ArrayList<>();
signs.add('/');
signs.add('+');
signs.add('(');
signs.add(')');
signs.add('-');
signs.add('^');
signs.add('*');
signs.add('%');
String str = tfExpress.getText();
int express = (str != null && !"".equals(str)) ? Integer.parseInt(str) : 0;
// expInput.removeIf(p-> p.equals(signs));
Button btVerify = new Button("Verify");
bottom.getChildren().add(expression);
bottom.getChildren().add(tfExpress);
bottom.getChildren().add(btVerify);
btVerify.setOnAction(
(ActionEvent e) ->
{
LinkedList<Character> expInput = new LinkedList<Character>();
for(char c: tfExpress.getText().toCharArray()){
expInput.add(c);
}
String[] inputIntegers = tfExpress.getText().split("[^0-9]+");
expInput.removeIf(p-> p.equals(signs));
ArrayList<Integer> temp = new ArrayList<>();
for(String s:inputIntegers)
{
temp.add(new Integer(Integer.valueOf(s)));
}
temp.remove(new Integer(card1.CardValue()));
temp.remove(new Integer(card2.CardValue()));
temp.remove(new Integer(card3.CardValue()));
temp.remove(new Integer(card4.CardValue()));
if(temp.isEmpty() /*card1.CardValue() == Character.getNumericValue(deck.get(0))
&& card2.CardValue() == Character.getNumericValue(deck.get(1))
&& card3.CardValue() == Character.getNumericValue(deck.get(2))
&& card4.CardValue() == Character.getNumericValue(deck.get(3))*/)
{
if(express == 24){
display.setText("Correct");
}
else
display.setText("Incorrect");
}
else
display.setText("The numbers in the expression don't "
+ "match the numbers in the set.");
});
pane.setTop(top);
pane.setCenter(center);
pane.setBottom(bottom);
Scene scene = new Scene(pane);
primaryStage.setTitle("24 card game");
primaryStage.setScene(scene);
primaryStage.show();
}
public class Card extends Pane {
public int cardVal;
Card(int card){
Image cardImage;
cardImage = new Image("card/"+ card +".png");
getChildren().add(new ImageView(cardImage));
cardVal = card;
}
public int CardValue(){
int card = 0;
if(cardVal <= 13){
card = cardVal;
}
else if(cardVal > 13 && cardVal <= 26){
card = cardVal - 13;
}
else if(cardVal > 26 && cardVal <= 39){
card = cardVal - 26;
}
else if(cardVal > 39 && cardVal <= 52){
card = cardVal - 39;
}
return card;
}
}
public static void main(String[] args) {
launch(args);
}
}
在我的:
btShuffle.setOnAction(
e -> {
center.getChildren().clear();
Collections.shuffle(deck);
center.getChildren().add(new Card(deck.get(0)));
center.getChildren().add(new Card(deck.get(1)));
center.getChildren().add(new Card(deck.get(3)));
center.getChildren().add(new Card(deck.get(4)));
});
我想将这些值更改为 card1-4,但是当我这样做时它现在不会洗牌。有谁知道这是为什么?此外,我做了一个扫描仪并确定卡片值实际上已正确分配给卡片,现在只是正确评估它们的问题。
我不太确定你的问题是什么,但你似乎假设 card1 == 0
、card2 == 1
等。这不是真的,因为你正在初始化你的卡从你设置为从 1 开始的牌组。你应该从 0 开始你的牌组以获得所需的效果(目前你的牌组中只有 51 张牌)。
for (int i = 0; i < 52; i++) {
deck.add(i);
}
编辑: 您收到 card2
错误的原因是因为您在与 lambda 调用相同的方法中在本地声明它(start()
方法)。从您的 start()
方法中删除语句:Card card2;
,它应该可以工作。
在你的另一个问题中,你提到你想保留你的代码 "condensed"。拜托,不要那样做。您现在应该意识到您的 "condensed" 代码会导致您遇到很多问题,从而导致您来到这里。
这里有一个更好的例子:
- 创建一个带有名称的 Suit 枚举
- 使用名称和值或您拥有的任何其他属性创建一个 Rank 枚举
- 创建一张由 Suit 和 Rank 组成的卡片 class 并根据名称加载图像(是的,您必须正确重命名图像)
- 通过遍历 Suit 和 Rank 的所有组合来创建你的卡片
除此之外别无其他。这是代码:
public class CardsDemo extends Application {
/**
* All the cards in the game. Loaded only once at game start.
*/
private List<Card> deck;
/**
* The cards to be dealt. Created initially from the deck.
*/
private List<Card> stock;
@Override
public void start(Stage primaryStage) {
// create cards
deck = createDeck();
Group root = new Group();
Scene scene = new Scene(root, 300, 250);
primaryStage.setScene(scene);
primaryStage.show();
stock = new ArrayList<>( deck);
// shuffle cards
Collections.shuffle(stock);
// deal cards
while( !stock.isEmpty()) {
Card card = stock.remove(0);
System.out.println( "Dealing: " + card);
}
}
private List<Card> createDeck() {
List<Card> cards = new ArrayList<>();
for( Suit suit: EnumSet.allOf(Suit.class)) {
for( Rank rank: EnumSet.allOf( Rank.class)) {
Card card = new Card( suit, rank);
cards.add( card);
}
}
return cards;
}
public static class Card {
Suit suit;
Rank rank;
public Card( Suit suit, Rank rank) {
this.suit = suit;
this.rank = rank;
// TODO: create imageview
String filename = "card/" + suit.getName() + "_" + rank.getName() + ".png";
System.out.println( "Filename: " + filename);
}
public Suit getSuit() {
return suit;
}
public Rank getRank() {
return rank;
}
public String toString() {
return "Suit: " + suit + ", Rank: " + rank + ", Value: " + rank.getValue();
}
}
public enum Rank {
ACE( "A", 1),
_2( "2", 2),
_3("3", 3),
_4("4", 4),
_5("5", 5),
_6("6", 6),
_7("7", 7),
_8("8", 8),
_9("9", 9),
_10("10", 10),
JACK("J", 11),
QUEEN("Q", 12),
KING("K", 13)
;
String name;
int value;
Rank( String name, int value) {
this.name = name;
this.value = value;
}
public String getName() {
return name;
}
public int getValue() {
return value;
}
}
public enum Suit {
SPADES( "spade"),
HEARTS( "heart"),
CLUBS( "club"),
DIAMONDS("diamond"),
;
String name;
Suit( String name) {
this.name = name;
}
public String getName() {
return name;
}
}
public static void main(String[] args) {
launch(args);
}
}
和this question has an answer关于如何发牌。您不使用 "get",而是使用 "remove" 访问卡片。简单地使用 "get" 只会一遍又一遍地给你同一张牌。您还需要将其删除。但是,remove 也会为您提供已移除的卡,因此 remove 就足够了。