Uno Project:确保非法播放正确返回?

时间:2014-03-10 06:39:34

标签: java

我正在编写一大块程序来与其他课程一起玩Uno。我的Uno项目差不多完成了,但是我需要确保检查部分以确保在玩外卡之后移动,我会播放合法卡或返回-1。这是我的代码:

import java.util.*;
public class AlexaL_UnoPlayer implements UnoPlayer
{
public int play(List<Card> hand, Card upCard, Color calledColor, GameState state)
{
    int play = -1;
    boolean haveWild = false;
    boolean matchesWildCall = false;
    int indexOfWild = 0;
    //turn number of cards all players are holding into ints for later use
    int[] array = state.getNumCardsInHandsOfUpcomingPlayers();
    int playerNext = array[0];
    int playerTwoNext = array[1];
    int playerBefore = array[2];
    Color upCardColor = upCard.getColor();

    for(int i = 0; i < hand.size(); i++)
    {
        //see if I have any wilds
        if(hand.get(i).getRank().equals(Rank.WILD) || hand.get(i).getRank().equals (Rank.WILD_D4))
        {
            haveWild = true;
            indexOfWild = i;
        }
        //set upCard color to calledColor if wild or wild_d4 are played
        if (upCard.getRank().equals(Rank.WILD) || upCard.getRank().equals(Rank.WILD_D4))
        {
            upCardColor = calledColor;
        }
        //always play a card matching rank of upCard, if possible, or play the first in hand which matches color
        if(hand.get(i).getColor().equals(upCardColor))
        {
            if(hand.get(i).getNumber() == upCard.getNumber())
            {
                play = i;
            }
        }

        //if cornered(no matching number or color), play a wild
        else if(haveWild == true)
        {
            play = indexOfWild;
        }

        //hold reverse cards until person next after me has less cards than person before me
        if(hand.get(i).getRank().equals(Rank.REVERSE) && playerNext < playerBefore)
        {
            play = i;
        }

        //play skips when person next to me has less cards than me
        if((hand.get(i).getRank().equals(Rank.SKIP) || hand.get(i).getRank().equals(Rank.DRAW_TWO)) && playerNext < hand.size())
        {
            play = i;
        }

    }
    return play;
}

public Color callColor(List<Card> hand)
{
    //strategy: change the color to the one i'm holding the most of
    Color changeTo = Color.GREEN;
    int numBlues = 0;
    int numGreens = 0;
    int numReds = 0;
    int numYellows = 0;
    //find out how many of each color i'm holding
    for(int i = 0; i < hand.size(); i++)
    {
        if(hand.get(i).getColor().equals(Color.BLUE))
        {
            numBlues++;
        }
        else if(hand.get(i).getColor().equals(Color.RED))
        {
            numReds++;
        }
        else if(hand.get(i).getColor().equals(Color.GREEN))
        {
            numGreens++;
        }
        else if(hand.get(i).getColor().equals(Color.YELLOW))
        {
            numYellows++;
        }
    }
    //find out which i'm holding the most of and call that color
    //if no majority, return my favorite color(green)
    if(numBlues > numReds && numBlues > numGreens && numBlues > numYellows)
    {
        changeTo = Color.BLUE;
    }
    else if(numReds > numBlues && numReds > numGreens && numReds > numYellows)
    {
        changeTo = Color.RED;
    }
    else if(numGreens > numBlues && numGreens > numYellows && numGreens > numReds)
    {
        changeTo = Color.GREEN;
    }
    else if(numYellows > numBlues && numYellows > numGreens && numYellows > numReds)
    {
        changeTo = Color.YELLOW;
    }
    else 
    {
        changeTo = Color.GREEN;            
    }
    return changeTo;
}
}

出于某种原因,我的输出告诉了我:

You were given this hand:
  0. G7
  1. G5
  2. G+2
and the up card was: W
and the called color was: YELLOW
and you (wrongly) returned 2.
Valid plays would have included: -1

任何人都可以提供一些有关我收到此错误以及如何解决此问题的见解吗?非常感谢!

1 个答案:

答案 0 :(得分:0)

基于此代码,很难说您的实施有什么问题。

您是否尝试过逐步调试播放功能? 或者,使用更多跟踪语句检测代码以更好地确定问题可能发生的位置将是有益的。

例如:

每个为play变量赋值的地方,都会将其值打印到控制台,并附上您在代码中所处位置的上下文。

if(hand.get(i).getNumber() == upCard.getNumber())
{
    play = i;
    System.out.println("number match step: play = " + play ); // You can add such a line
}

这可以让你知道游戏的价值何时突然变为2。

这里只是抓住吸管,但是外卡的getColor和getNumber的预期值是多少。

如果你将它们分别设置为绿色或2,它可能会解释你看到的输出,因为下面是代码片段。

//always play a card matching rank of upCard, if possible, or play the first in hand      which matches color
        if(hand.get(i).getNumber() == upCard.getNumber())
        {
            play = i;
        }
        else if(hand.get(i).getColor() == upCardColor)
        {
            play = i;
        }