我们正在制作一款简单的52张纸牌游戏。我们在处理,洗牌和存储卡时遇到了很多麻烦。每个玩家应该发5张牌。游戏类似于Hearts,但每位玩家只获得5张牌。到目前为止,这是我们的代码:
int[] deck = new int[52];
String[] suits = { "Spades", "Hearts", "Diamonds", "Clubs" };
String[] ranks = { "A ", "2 ", "3 ", "4 ", "5 ", "6 ", "7 ", "8 ",
"9 ", "10", "J ", "Q ", "K " };
// Initialize the cards
for (int i = 0; i < deck.length; i++)
deck[i] = i;
// Shuffle the cards
for (int i = 0; i < deck.length; i++) {
// Generate an index randomly
int index = (int) (Math.random() * deck.length);
int temp = deck[i];
deck[i] = deck[index];
deck[index] = temp;
}
// Display the first five cards
System.out.println("player 1 has:");
for (int i = 0; i < 5; i++) {
String suit = suits[deck[i] / 13];
String rank = ranks[deck[i] % 13];
selectionSort(deck);
System.out.println("Card number " + deck[i] + " : " + rank + " of "
+ suit);
}
int player1[] = deck;
// Display the first five cards
System.out.println("\n" + "player 2 has:");
for (int i = 5; i < 10; i++) {
String suit = suits[deck[i] / 13];
String rank = ranks[deck[i] % 13];
System.out.println("Card number " + deck[i] + " : " + rank + " of "
+ suit);
}
int player2[] = deck;
// Display the first five cards
System.out.println("\n" + "player 3 has:");
for (int i = 10; i < 15; i++) {
String suit = suits[deck[i] / 13];
String rank = ranks[deck[i] % 13];
System.out.println("Card number " + deck[i] + " : " + rank + " of "
+ suit );
}
int player3[] = deck;
}
public static void selectionSort(int[] deck) {
for (int i = 52; i < deck.length - 1; i--){
int currentMax = deck[i];
int currentMaxIndex = i;
for (int j = i + 1; j < deck.length; j++) {
if (currentMax > deck[j]) {
currentMax = deck[j];
currentMaxIndex = j;
}}
if (currentMaxIndex != i) {
deck[currentMaxIndex] = deck[i];
deck[i] = currentMax;
}
}
}
}
答案 0 :(得分:2)
制作&#34; card&#34;一个对象。
这将极大地简化您的代码。不是拥有一个字符串数组,而是在每个卡片对象中只有2个字符用于排名和套装。
然后你可以制作&#34; deck&#34;一系列卡片。
让玩家拥有一个对象,并拥有自己的一系列牌。
如果你愿意,你甚至可以让甲板成为一个物体,这样你就可以打电话了
deck.shuffle();
答案 1 :(得分:1)
好的,我想从长远来看这对你有所帮助。我看了你的代码大约两秒钟,看到它有一些严重的结构问题。这是你应该从以下开始的地方:
public enum Suit
{
CLUBS, SPADES, HEARTS, DIAMONDS
}
public enum Value
{
TWO, THREE, FOUR, FIVE, SIX, SEVEN, EIGHT, NINE, TEN, JACK, QUEEN, KING, ACE
}
public class Card
{
private Value value;
private Suit suit;
public Card(Suit theSuit, Value theValue)
{
suit = theSuit;
value = theValue;
}
public Value getValue()
{
return value;
}
public Suit getSuit()
{
return suit;
}
}
现在,一旦我们建立了这个基地,我们也可以说一只手和一副牌非常相似,因为它们都是一堆牌,所以我们应该为它们建立一个基础:
public class CardStack
{
public ArrayList<Card> cards;
public CardStack()
{
cards = new ArrayList<Card>();
}
public Card draw()
{
if(cards.size() > 0)
{
Card card = cards.objectAt(cards.size() - 1);
cards.remove(card);
return card;
}
return null;
}
public void addCard(Card card)
{
cards.add(card);
}
}
现在剩下的由你决定,Deck和Hand都应该扩展CardStack。很抱歉这个答案非常长,但从长远来看,这对你有帮助。如果结构错误,程序将永远无法正常运行。你应该显然有一个Player类,它应该有一个Hand和你的Game类的实例,或者应该有一个deck实例。甲板应该有一个shuffle和reset方法,Hand真的只需要一个清晰的meathod。我希望这能帮到你!祝你好运!
更新
如果您不知道它们是什么,请参阅以下内容:
以下是一些一般的OOP信息:
如果您阅读了这两个代码,您的代码将会大大改善。如果您需要更多帮助,我可以发布更多代码。
答案 2 :(得分:0)
正如其他人在评论和答案中指出的那样,设计可以通过面向对象来改进。
我想我理解的意图是:首先创建一个甲板洗牌吧。之后,deck
的前5个元素代表玩家1的手。接下来的5个元素代表玩家2的手,依此类推。
在循环内打印播放器1的手时,会调用selectionSort
。方法selectionSort
对完整的deck
数组进行排序。仔细检查selectionSort
告诉我它什么都不做!在修复selectionSort
之后,你会在输出中看到一张随机牌,然后是最后一张牌(俱乐部)的最后四张牌。
我假设你试图通过在打印玩家1之手的循环中调用selectionSort
来对玩家1的牌进行排序。
如果我的假设是正确的,您应该修改selectionSort
,以便您可以指定一个下部和上部索引,指定应该对数组的哪个部分进行排序。它看起来像这样:
public static void selectionSort(int[] deck, int start, int end) {
for (int i = start; i<end; i++) {
int currentMax = deck[i];
int currentMaxIndex = i;
for (int j = i + 1; j < end; j++) {
if (currentMax < deck[j]) {
currentMax = deck[j];
currentMaxIndex = j;
}
}
if (currentMaxIndex != i) {
deck[currentMaxIndex] = deck[i];
deck[i] = currentMax;
}
}
}
要为玩家1的牌排序,请致电selectionSort(deck, 0, 5);
。对于玩家2,请致电selectionSort(deck, 5, 10);
。对于玩家3,请致电selectionSort(deck, 10, 15);