我正在尝试为扑克游戏编写代码,以使用数组删除某些索引处的卡片。
我到目前为止的代码是以下,并没有工作。
ncard是手中当前的牌数。任何帮助,将不胜感激。
/**
* discard the indexed cards from the Hand.
* @param indices the indices of cards to delete.
* @return true if all Cards deleted, false if not.
*/
public boolean discard(int[] indices){
int i = 0;
while (i < indices.length){
if (indices[i] < 0 || indices[i] >= ncard)
{
return false;
}
for (int in = indices[i]; in < ncard; in++){
cards[in] = null;
ncard--;
}
i++;
}
return true;
}
答案 0 :(得分:0)
看起来你在静态数组中有卡片,并且将丢弃的索引设置为null。如果您丢弃n张卡然后尝试丢弃索引为52-n的卡,则该方法将返回false并且不再丢弃任何卡。
您应该使用一些动态数据结构(如堆栈或列表)来存储卡。如果您必须使用数组,请按照以下方法解决问题:
您没有在索引处丢弃卡片,而是丢弃每个给定索引与ncard
之间的每张卡片(由于空值位于任意位置,因此不能代表最后一张卡片的索引)。该for循环应替换为
cards[indices[i]] = null
deletedCards++;//You should initialize this before the loop
循环之后,你应该输入这段代码:
Arrays.sort(cards, new Comparator<Card>(){
public int compare(Card a, Card b){
return Boolean.compare(a==null,b==null);
}
});
它将空值排序到数组的后面,并保持顺序相同。然后按ncards
递减deletedCards
。
答案 1 :(得分:0)
在这种情况下,我非常推荐使用for循环,因为所有这些i++
内容都会使代码难以理解
public boolean discard(int[] indices) {
// check if all indices consumed are valid
for(int index : indices) {
// i just use your validation, don't know, if this is correct though
if(index < 0 || index >= ncard)
return false;
}
// remove cards
for(int index : indices) {
cards[index] = null;
ncard--;
}
return true;
}
我的猜测是问题来自验证,但我需要更多信息来真正解决这个问题...... 也许这将是一个更好的验证整理indexOutOfBounds(负面和正面)和尝试丢弃比ncard更多的卡:
if(index < 0 || index > (cards.length -1) || indices.length > ncard)
return false;
编辑:我认为卡片是一个具有卡片组大小的阵列,而玩家没有的所有卡片都是空值?