有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何将一副牌一分为二?

我想创造一个非常简单的战争游戏。用户和计算机每回合抽一张牌,他们要么赢,要么平,要么输。牌一出,游戏就结束了。我有四节课。我的战争课我主要是在测试甲板上的情况是否正常。我需要做的是把牌分成两半,这样每个玩家每回合抽一张牌(游戏结束时总共26张),我不知道怎么做。我猜我需要一个for循环,但除此之外,我不知道如何给每个玩家一张牌。忽略类战中的用户输入,就像我说的,我只是在测试。我在这里展示了三个类,我的最后一个是JApplet,这里不需要,所以我没有包括它

编辑:感谢大家的帮助。我还有最后一个问题,那我应该很好。我想展示卡片。toString在我的JApplet类中,但当我调用Card Card=new Card()时;它拒绝工作。我猜这是因为构造器。我该如何让toString显示,或者绕过构造函数

编辑:把一切弄清楚,谢谢大家的帮助

import java.util.ArrayList;
import java.util.Random;


public class Card {
    private int suit, number;
    String [] suits = {"Heart" , "Diamond" , "Spade" , "Club"}; //suits
    String [] numbers = { "2" , "3" , "4" , "5" , "6" , "7" , "8" , "9" , "10" ,
    "Jack" , "Queen" , "King" , "Ace" }; //card values
    String card = "";

     public Card(int suits, int numbers)
        {
            suit = suits; 
            number = numbers;
        }
      public String toString() //displays card suit/value
        {
            String finalCard = numbers[number] + " of " + suits[suit];
            return finalCard;
        }
    }



import java.util.ArrayList;
import java.util.Random;

public class FullDeck {
    private ArrayList<Card> cards = new ArrayList<Card>();//card array list

        public FullDeck()
        {   
            for(int a =0; a<=3; a++) //loops through suits
            {
                for(int b =0; b<=12;b++) //loops through values
                {
                    cards.add(new Card(a,b)); //creates adds cards to list
                }

            }

        }

        public Card drawRandomCard()
        {
            Random generator = new Random(); //picks random card
            int index = generator.nextInt(cards.size());
            return cards.remove(index); //removes card from list
        }



        public String toString()
        {
            String result = "Cards remaining in deck: " + cards; //not currently used
            return result;
        }    
    }

import java.util.Scanner;

public class War {

    public static void main(String[] args)
    {
        Scanner scan = new Scanner(System.in);
        Card C;
        FullDeck hand1 = new FullDeck();
        FullDeck hand2 = new FullDeck();

        System.out.println("Enter number of cards to be dealt: ");
        int numberCards = scan.nextInt();

        System.out.println("Cards drawn: ");
        for (int i = 0; i < numberCards; i++) {
          C = hand1.drawRandomCard();
          System.out.println(C.toString());
        }
    }
        }

共 (2) 个答案

  1. # 1 楼答案

    FullDeck类重命名为Deck是有意义的

    然后,为Deck包含一个构造函数,该构造函数将ArrayList作为参数。为Deck包含一个方法,该方法返回一个Deck对象,称为类似splitDeck的东西

    在内部,splitDeckDeck中的一半卡从该对象的cards中移除,并将它们添加到新的临时ArrayList。然后,它创建并返回一个使用这个临时ArrayList构建的甲板对象


    public Deck(ArrayList<Card> deck) {
        cards = deck;
    }
    
    public Deck splitDeck() {
        ArrayList<Card> temp = new ArrayList<>();
        for(int i = cards.length() - 1; i >= cards.length()/2;  i) {
            temp.add(cards.get(i));
            cards.remove(i);
        }
        return new Deck(temp);
    }
    

    现在,调用该方法的Deck对象包含半个组,返回的Deck对象包含另一半


    假设您将该类重命名为Deck(只是因为这样更有意义),并保留相同的默认构造函数:

    Deck playerOneDeck = new Deck();
    // playerOne now has a full deck of cards
    
    Deck playerTwoDeck = playerOneDeck.splitDeck();
    // playerOne and playerTwo now each have half of playerOne's original full deck
    
  2. # 2 楼答案

    创建两个ArrayList<Card>,然后做一个for循环,循环52次

    for(int i=0;i<52;i++){
        Card tempCard = hand1.getCards().remove(hand1.getCards().indexOf(hand1.drawRandomCard()));
        if(i%2 == 1){
            firstPlayersCards.add(tempCard);
        }else{
            secondPlayersCards.add(tempCard);
        }
    }
    

    确保在FullDeck中添加一个getCards()方法,它只返回cards

    通过这种方式,所有的牌都会随机出现在每个玩家的手中,所以你可以把它们按顺序排列

    编辑:不过,最简单的解决方案是Daniel Gabriel所说的,只需连续两次调用drawRandomCard()