我正在努力创造一个非常简单的战争游戏。用户和计算机每回合获得1张牌,他们要么赢,要么打败,要么失败。卡片出局时游戏结束。我有4节课。我的战争课我大部分只是测试一下是否有东西在甲板上工作。我需要做的是将牌组分成两半,这样每个玩家每回合抽一张牌(游戏结束时共计26张),我不知道该怎么做。我猜我需要一个for循环,但除此之外我不知道如何给每个玩家一张牌。忽略类战中的用户输入,就像我说的那样,我只是在测试。我在这里显示了3个类,我的最后一个是JApplet,这里不需要,所以我没有把它包括在内。
编辑:谢谢你的帮助。我有最后一个问题然后我应该好。我想在我的JApplet类中显示Card.toString,但是当我调用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());
}
}
}
答案 0 :(得分:1)
将FullDeck
课程重命名为Deck
...
然后,包含Deck
的构造函数,该构造函数将ArrayList
作为参数。包含Deck
的方法,该方法返回Deck
个对象,其名称类似于splitDeck
。
在内部,splitDeck
占用Deck
中一半的卡片,将其从该cards
上的卡片中删除,然后将其添加到新的临时ArrayList
中。然后,它创建并返回使用此临时ArrayList
构建的deck对象。
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
答案 1 :(得分:1)
创建两个ArrayList<Card>
,然后创建一个经过52次的for
循环。
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);
}
}
确保在getCards()
中添加FullDeck
方法,该方法只返回cards
。
通过这种方式,所有牌都在每个玩家的手中随机化,所以你可以按顺序获得它们。
编辑:但是,最简单的解决方案是Daniel Gabriel所说的,并且连续两次拨打drawRandomCard()
。