我正在为Rock,Paper,Scissors游戏编写一段代码。我正在编写一个返回1,0或-1的方法,具体取决于计算机获胜,它是平局,还是用户获胜。到目前为止我有这个代码:
private int nextPlay(char computerMove, char playerMove) {
switch (playerMove) {
case 'R': switch (computerMove) {
case 'R': return 0;
case 'P': return 1;
case 'S': return -1;
}
case 'P': switch (computerMove) {
case 'R': return -1;
case 'P': return 0;
case 'S': return 1;
}
case 'S': switch (computerMove) {
case 'R': return 1;
case 'P': return -1;
case 'S': return 0;
}
}
}
它抛出一个" Missing Return Statement"在我最后一刻。有什么建议吗?
P.S。对于computerMove和playerMove,唯一可用的选项是R,P和S!
答案 0 :(得分:1)
其他人告诉您将default
添加到switch
语句中。在这种情况下根本不需要,尽管这是一个很好的一般规则。
但是,您需要考虑如果playerMove
和/或computerMove
没有3个预期值('R'
,'P'
或'S'
)。
如果computerMove
没有,则您希望逻辑流退出外部switch
语句,而不是落到下一个case
(尽管从技术上讲它们都是只是落后,但仍然如此),所以在每个外部break
添加case
。
如果爆发,或者playerMove
没有有效值,那么逻辑流将进入方法结束,并且那里没有return
语句。 那是你的编译错误。
此处的最佳解决方案,因为您希望无法进入这种情况,就是声明例外,即throw
和Exception
。
你的代码可能是:
private int nextPlay(char computerMove, char playerMove) {
switch (playerMove) {
case 'R':
switch (computerMove) {
case 'R': return 0;
case 'P': return 1;
case 'S': return -1;
}
break;
case 'P':
switch (computerMove) {
case 'R': return -1;
case 'P': return 0;
case 'S': return 1;
}
break;
case 'S':
switch (computerMove) {
case 'R': return 1;
case 'P': return -1;
case 'S': return 0;
}
break;
}
throw new IllegalStateException("Oops! I messed up!!");
}
但是使用更具描述性的错误消息会更好:
private int nextPlay(char computerMove, char playerMove) {
switch (playerMove) {
case 'R':
switch (computerMove) {
case 'R': return 0;
case 'P': return 1;
case 'S': return -1;
}
throw new IllegalArgumentException("Invalid computer move: " + computerMove);
case 'P':
switch (computerMove) {
case 'R': return -1;
case 'P': return 0;
case 'S': return 1;
}
throw new IllegalArgumentException("Invalid computer move: " + computerMove);
case 'S':
switch (computerMove) {
case 'R': return 1;
case 'P': return -1;
case 'S': return 0;
}
throw new IllegalArgumentException("Invalid computer move: " + computerMove);
}
throw new IllegalArgumentException("Invalid player move: " + playerMove);
}
现在,您可以在throw
子句中添加这些default
语句。结果相同。
private int nextPlay(char computerMove, char playerMove) {
switch (playerMove) {
case 'R':
switch (computerMove) {
case 'R': return 0;
case 'P': return 1;
case 'S': return -1;
default: throw new IllegalArgumentException("Invalid computer move: " + computerMove);
}
case 'P':
switch (computerMove) {
case 'R': return -1;
case 'P': return 0;
case 'S': return 1;
default: throw new IllegalArgumentException("Invalid computer move: " + computerMove);
}
case 'S':
switch (computerMove) {
case 'R': return 1;
case 'P': return -1;
case 'S': return 0;
default: throw new IllegalArgumentException("Invalid computer move: " + computerMove);
}
default: throw new IllegalArgumentException("Invalid player move: " + playerMove);
}
}
答案 1 :(得分:0)
我的建议
public static void main(String[] args)
{
Scanner scan = new Scanner(System.in);
int x=nextPlay('R','P');
System.out.println(x);
}
private static int nextPlay(char computerMove, char playerMove)
{
if(playerMove=='R')
{
if(computerMove=='R')
return 0;
else if(computerMove=='P')
return 1;
else
return -1;
}
else if(playerMove=='P')
{
if(computerMove=='R')
return -1;
else if(computerMove=='P')
return 0;
else
return 1;
}
else
{
if(computerMove=='R')
return 1;
else if(computerMove=='P')
return -1;
else
return 0;
}
}
答案 2 :(得分:0)
非常感谢大家!我决定简单地将每个switch语句中的一个case设置为default(跟踪它当然是哪个char)并解决了这个问题。
我知道这可能会导致一些问题,如果char不是预期的,但我的老师说它没关系,下次我会使用不同的方法(如建议的那样)!