如何编写一个有效/优化的循环来同时比较几个条件? Badugi cardgame方法

时间:2016-11-14 15:56:14

标签: java

说,我正在制作一个简单的badugi纸牌游戏,其中Hand由一个字符串中的10个字符表示。例如: 2s3h5dQs - 黑桃2颗,心形3颗,钻石5颗,黑桃皇后

现在,在这个badugi纸牌游戏中,我想创建两个循环,其中第一个循环检查所有排名是否不同(它们都不能相同),另一个循环检查所有套装是否不同。如果这两个条件在他们都有不同的等级和诉讼的情况下都返回真实,那么这只手已经画了一个badugi(请原谅我在必要时缺乏术语。)

现在,我如何为这种情况创建一个有效的循环?我以为我可以创建几个if语句:

if (hand.charAt(0) != hand.charAt(2) && hand.charAt(0) != hand.charAt(4) && hand.charAt(0) != hand.charAt(6))
if (hand.charAt(2) != hand.charAt(0) && hand.charAt(2) != hand.charAt(4) && hand.charAt(2) != hand.charAt(6))

......等等将每个索引相互比较。但这很乏味,看起来非常不专业。所以我的问题是,如何为这种情况编写一个有效的循环?如何比较/检查这些特定索引点之间是否没有匹配?

如果我没有正确解释,请告诉我。

请记住,我不允许自由如何制定一只手。它必须采用上面的格式

4 个答案:

答案 0 :(得分:6)

你把精力放在了错误的地方。

您根本不必担心效率

相反,您应该担心创建一个干净的设计(基于合理的抽象),然后编写超级易于阅读和理解的代码。

你目前的做法都失败了;不幸的是。

换句话说:你将手和值表示为字符串中的字符。

您创建了一个摘要一张卡片(具有其值和面部)的课程。 然后是"手"成为此类Card对象的List /数组。然后您可以使用Comparator等概念来比较卡片值,或者您可以使用equals() ...

即使你希望保持你的(实际上过于复杂)在字符串中使用字符的天真,简单的方法;那么你应该至少使用某种循环,这样你就不会将charAt(0)与charAt(2)进行比较;但也许charAt(i)反对charAt(j)。

在你的编辑和jsheeran的优秀评论之后:即使你被迫处理这种"字符串符号&#34 ;;您仍然可以编写合理的代码...将这些字符串作为输入,但将它们转换为更有意义的内容。

例如,Card类构造函数可以为套件/值采用两个字符。

但是要让你按照实际的问题;你可以像那样

public boolean isCardDistinctFromAllOtherCards(int indexToCheck) {
  for (int i=0; i<cardString.length-1; i+=2) {
    if (i == indexToCheck) {
      continue;
    }
    if (cardString.charAt(indexToCheck) == cardString.charAt(i)) {
      return false;
    }
  }
  return true;
}

(上面只是一个想法如何写下一个检查0,2,4,...的所有字符都不匹配某个索引x的方法)。

答案 1 :(得分:1)

你应该考虑你的设计,比如创建Card课程等,但回到现在的问题,因为它不会解决它。

我建议将所有4个值添加到Set,然后检查Set的大小是否为4。您甚至可以将其快捷方式,并且在添加此yourSet.add(element)时返回false,则表示该集合中已存在该元素且它们不是唯一的。这在这里几乎不重要,因为您只需添加4元素,但如果您使用更多元素,它将来可能会有用。

答案 2 :(得分:1)

我建议用你正在引用的这些字符创建一个数组,以清理你使用索引的事实。即创建一个vals数组和一个suit数组。

这将是我的建议,通过使用返回或中断循环将停止这意味着当找到匹配时,它不必循环通过其余的元素..希望这有帮助!

private static int check(char[] vals, char[] suits){
 int flag;
  for(int i=0; i<=vals.length-2;i++){
    for(int k=vals.length-1; k<=0;k++){
        if(vals[i]==vals[k]){
            flag=-1;
            return flag;
        }
        if(suits[i]==suits[k]){
            flag=1;
            return flag;
        }
    }
  }
return 0;
}

答案 3 :(得分:1)

为什么不简单地遍历你的字符串并检查相同的等级或套装:

    public class NewClass {

    public static void main(String[] args) {
        System.out.println(checkRanks("2s3h5dQs"));
        System.out.println(checkSuits("2s3h5dQs"));
    }
    public static boolean checkRanks(String hand){
        List<Character> list = new ArrayList<>();
        for (int i = 0; i< hand.length(); i+=2){
            if (!list.contains(hand.charAt(i))){
               list.add(hand.charAt(i));
            }
            else{
                return false;
            }
        }
      return true;    
    }
    public static boolean checkSuits(String hand){
        List<Character> list = new ArrayList<>();
        for (int i = 1; i< hand.length(); i+=2){
            if (!list.contains(hand.charAt(i))){
               list.add(hand.charAt(i));
            }
            else{
                return false;
            }
        }
      return true;  
    }
}