我有一副洗牌牌,我应该把它做成这样,它可以把5张牌分给4个玩家。我像个白痴一样坐在这里好几个小时了,我被卡住了。
public class Deck {
public static void main(String[] args)
{
String[] SUITS = {
"Clubs", "Diamonds", "Hearts", "Spades"
};
String[] RANKS = {
"2", "3", "4", "5", "6", "7", "8", "9", "10",
"Jack", "Queen", "King", "Ace"
};
// initialize deck
int n = SUITS.length * RANKS.length;
String[] deck = new String[n];
for (int i = 0; i < RANKS.length; i++) {
for (int j = 0; j < SUITS.length; j++) {
deck[SUITS.length*i + j] = RANKS[i] + " of " + SUITS[j];
}
}
// shuffle
for (int i = 0; i < n; i++) {
int r = i + (int) (Math.random() * (n-i));
String temp = deck[r];
deck[r] = deck[i];
deck[i] = temp;
}
// print shuffled deck
for (int i = 0; i < 4; i++) {
for (int j = 0; j < 5; j++)
System.out.println(deck[i])
}
}
我被最后一部分难住了。我将为四名玩家获得五张类似的牌。看起来是这样的:
如果我打算给四个人发五张不同的牌,我该怎么办?
我用Java编码,做数组,我不能使用任何Java UTIL。
for (int i = 0; i < 4; i++) {
for (int j = 0; j < 5; j++)
System.out.println(deck[i])
}
在这里,您在同一张卡上循环[i],因为不考虑[j]。此外,即使考虑了j,也无法解决问题,因为当外部循环迭代时,嵌入循环总是以索引j=0开始初始化<您应该从上次处理的卡的索引开始第二个循环。
你的循环应该首先考虑玩家的数量,然后考虑每个玩家的牌数<所以我建议你们两个循环:一个是嵌入的,另一个是嵌入的
我建议您在常量中声明玩家数量和纸牌数量,而不是硬编码,以便获得更具可读性的代码。
如果以后这些数据可能会有所不同,您可以用方法参数中的变量替换常量。例如。
public class Deck {
...
private static final int NB_PLAYER = 4;
private static final int NB_CARD_BY_PLAYER = 5;
...
int playerNumber = 1;
// you loop as much as the number of players
// your increment step is the number of cards to deal by player
// your end condition is the number of cards you have to
// deal for all players
for (int i = 0; i < NB_PLAYER * NB_CARD_BY_PLAYER; i = i + NB_CARD_BY_PLAYER) {
System.out.println("player " + playerNumber + ", cards =");
// you loop as much as the number of cards to deal by player
// your start from the last dealed card
// your increment step is 1 as you want to deal card by card from the deck
// your end condition is the number of cards to deal by player
for (int j = i; j < i+NB_CARD_BY_PLAYER; j++) {
System.out.println(deck[j]);
}
playerNumber++;
}
}
数学。random()*(n-i)是有偏差的,但您可以使用洗牌:
Collections.shuffle(deck, new Random())
我不知道这是否算作“java utils”,因为我不确定你是指包java.utils
还是不是。
现在来看看你的问题。阵列并不是一副牌的好代表。堆叠或队列会更好,因为它们都允许你一次从一副牌中拿一张牌。有了阵列,你就可以窥视一副牌的索引,这不是我们在现实生活中应该玩的牌。理想情况下,发牌的行为是将一张牌从甲板转移到玩家手中,留在甲板阵列中会让你很难跟踪。
这只是打印结果时的一个错误。使用
// print shuffled deck
for (int i = 0; i < 4; i++) {
System.out.println("** Person " + (i + 1) + " **");
for (int j = 0; j < 5; j++) {
System.out.println(deck[i + j * 4] + " (Card " + (i + j * 4) + ")");
}
}
(添加Sysouts以演示卡片分发)
示例输出:
**第1人**
2人梅花(卡0)
4人钻石(卡4)
9人钻石(卡8)
10人红心(卡12)
9人梅花(卡16)
**第2人**
6人红心(卡1)
8人钻石(卡5)
9人黑桃(卡9)
红心杰克(卡13)
钻石杰克(卡17)
**第3人**
梅花女王(卡2)
王牌钻石(卡6)
红心之王(牌10)
梅花8(牌14)
黑桃5(牌18)
**人4**
黑桃10(牌3)
梅花10(牌7)
黑桃杰克(牌11)
钻石10(牌15)
梅花王牌(牌19)
我正在尝试使用ArrayList构建一个21点纸牌游戏。我很难理解向所有玩家发一张牌的逻辑——我认为我的问题更多地涉及使用迭代器。。。。 问题出在游戏运行器的 //交易卡部分。我知道我没有正确使用itr为阵列列表中的每个玩家分配一张新卡。 来自玩家类: 来自甲板班
在第13.6节我们编写了一个洗牌算法的伪代码。假设shuffleDeck函数实现洗牌功能,其参数为一个牌堆,我们就可以这样创建牌堆并洗牌: Deck deck; // 创建一个标准的52张牌的牌堆 deck.shuffle (); // 洗牌 然后,使用subdeck函数来分几手牌: Deck hand1 = deck.subdeck (0, 4); Deck hand2 = dec
大多数纸牌游戏都需要洗牌,也就是让纸牌随机排列。在第10.5节,我们看到了怎样生成随机数,但怎样利用随机数实现洗牌功能却并非显然意见的。 一种可行的方案是,模拟人洗牌的方法,将牌分为两堆,然后通过在每个牌堆中轮流选择的方式实现原牌堆的重新组织。因为一般而言,人并不能做到完美地洗牌,而程序经过大约7次迭代之后,牌堆中纸牌的顺序已经相当随机了。但是计算机程序每次在做完美洗牌的时候有一个令人讨厌的属性—
本节用随机数产生器开发一个洗牌与发牌程序。这个程序可以用于实现玩某种牌的游戏程序。 为了解决一些微妙的性能问题,我们故意用次优洗牌与发牌算法。练习中要开发更有效的算法。 利用自上而下逐步完善的方法,我们开发一个程序,洗 52 张牌并发52张牌。自上而下逐步完善的方法在解决大而复杂的问题时特别有用。 我们用 4 x 13 的双下标数组 deck 表示要玩的牌(如图 5.23)。行表示花色,0 表示红
本文向大家介绍C++扑克牌的洗牌发牌游戏设计,包括了C++扑克牌的洗牌发牌游戏设计的使用技巧和注意事项,需要的朋友参考一下 笔者在大学二年级期间,做过的一次C++程序设计:扑克牌的洗牌发牌游戏。具体内容是:除去大王和小王,将52张扑克牌洗牌,并发出5张牌。然后判断这5张牌中有几张相同大小的牌,是否是一条链,有几个同花等。 笔者在学习他人设计的基础上,完成了自己的程序设计。这里将源程序分享给大家。
本文向大家介绍C语言实现洗牌与发牌游戏,包括了C语言实现洗牌与发牌游戏的使用技巧和注意事项,需要的朋友参考一下 本文实例为大家分享了C语言实现洗牌与发牌游戏的具体代码,供大家参考,具体内容如下 普通版 高性能版 以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持呐喊教程。