说,我正在制作一个简单的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))
......等等将每个索引相互比较。但这很乏味,看起来非常不专业。所以我的问题是,如何为这种情况编写一个有效的循环?如何比较/检查这些特定索引点之间是否没有匹配?
如果我没有正确解释,请告诉我。
请记住,我不允许自由如何制定一只手。它必须采用上面的格式
答案 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;
}
}