您好我一直在寻找,以确定在https://open.kattis.com/problems/rockpaperscissors
中指定的未定义内容我通过了第一次测试,但是第二次测试失败了。我最初认为我没有通过第二次测试,因为我只允许两名玩家,我们必须允许多名玩家加入。
我解决了这个问题,但仍未通过第二次测试。
我放入了我认为未定义的内容但完全卡住了。
所以问题:有人可以给我一个测试用例,引导我朝着正确的方向前进吗?
我不是要求代码而是一个测试用例,如果你注意到我在代码中输错了,请告知我这是否是导致我的问题的原因。
import java.io.*;
import java.util.*;
public class RockPaperScissor {
/**Conditions******
*
*/
public static void main(String[] args) {
/************User Input************/
Scanner sc = new Scanner(System.in);
/*************Variables***************/
String Player1;
String Player2;
String game="";
String playerGame=sc.nextLine();
//System.out.println("PlayerA= " +numOfGames);
//System.out.println(game);
/**run through games until game=0;**/
do{
String[] playerGameSplit = playerGame.split("\\s+");
int numOfPlayers=Integer.parseInt(playerGameSplit[0]);
double numOfGames=(Integer.parseInt(playerGameSplit[1])*numOfPlayers*(numOfPlayers-1))/2;
// double player1Win=0, player2Win=0, player1Loss=0, player2Loss=0;
Integer[] player = new Integer[numOfPlayers];
Integer[] playerLoss = new Integer[numOfPlayers];
for(int x=0; x<player.length;x++){
player[x]=0;
playerLoss[x]=0;
}
/*****Runs Rock Paper Scissors Game*****/
for (int x = 0; x<numOfGames; x++) {
/**Starts first game**/
game=sc.nextLine();
String[] splitter = game.split("\\s+");
if(compare(splitter[1],splitter[3])==1){
player[Integer.parseInt(splitter[0])-1]=player[Integer.parseInt(splitter[0])-1]+1;
playerLoss[Integer.parseInt(splitter[2])-1]=playerLoss[Integer.parseInt(splitter[2])-1]+1;
}else if(compare(splitter[1],splitter[3])==-1){
player[Integer.parseInt(splitter[2])-1]=player[Integer.parseInt(splitter[2])-1]+1;
playerLoss[Integer.parseInt(splitter[0])-1]=playerLoss[Integer.parseInt(splitter[0])-1]+1;
}
}
/***Prints Required OutPut***/
for(int x=0; x<player.length;x++){
//if(player[x]==0&&playerLoss[x]==0){
////double ratio= player[x]/(player[x]+playerLoss[x]);
//System.out.println("-");
//}else
if(Double.isInfinite((double)player[x]/(double)(player[x]+playerLoss[x]))){
//double ratio= player[x]/(player[x]+playerLoss[x]);
System.out.println("-");
}else if(Double.isNaN((double)player[x]/(double)(player[x]+playerLoss[x]))){
System.out.println("-");
}else{
double ratio= (double)player[x]/(double)(player[x]+playerLoss[x]);
System.out.printf("%.3f", ratio);
System.out.println();
}
}
System.out.println();
/**moves Game to next one**/
playerGame=sc.nextLine();
}while(playerGame.matches("[\\d][\\s][\\d]"));
//System.out.println("do we make here");
}
/*********METHODS*******/
public static Integer compare(String Player1,String Player2){
//System.out.println(Player1+ " "+ Player2);
if(Player1.matches("rock")&&Player2.matches("scissors")){
return 1;
}else
if(Player2.matches("rock")&&Player1.matches("scissors")){
return -1;
}else
if(Player1.matches("paper")&&Player2.matches("rock")){
return 1;
}else
if(Player2.matches("paper")&&Player1.matches("rock")){
return -1;
}else
if(Player1.matches("scissors")&&Player2.matches("paper")){
return 1;
}else
if(Player2.matches("scissors")&&Player1.matches("paper")){
return -1;
}else
return 0;
}
}
/***********Sample Input*************/
/**
2 4
1 rock 2 paper
1 scissors 2 paper
1 rock 2 rock
2 rock 1 scissors
2 1
1 rock 2 paper
3 1
1 rock 2 paper
3 rock 2 paper
1 rock 3 paper
0
**/
/***********Sample Output*************/
/**
0.333
0.667
0.000
1.000
**/
答案 0 :(得分:1)
现在你有一个玩家,你可以对玩家进行单元测试。
import org.junit.Test;
import org.junit.Assert;
public class PlayerTest {
@Test
public void newPlayerRatio() {
try {
Player player = new Player();
Assert.assertEquals(0.0d, player.getWinRatio(), 0.001d);
} catch (Exception e) {
Assert.fail(String.format("Unexpected Exception thrown of type %s", e.getClass()));
}
}
只有在隔离部分代码时才能测试代码的各个部分。这就是为什么我要求课程,他们封装了一些东西。封装意味着它们包含一些行为。一旦你的程序的一部分包含(完全负责)某些行为,它就变得容易测试。
根据我的经验,我可以说你将在上面的测试中找到意想不到的结果;因为,在你这样做之前,你不会检查是否要除以零。
写一些额外的单元测试(用一场胜利,一场胜利和一场失利等球员的胜率进行测试)。在你有六个之后,继续你的代码的下一部分。
最终你会有一些排序或读者需要一系列输入并更新锦标赛。一旦你到达那个部分,你可以尝试给它提供一行代码,如果它在锦标赛中使用“正确”值调用“正确”的方法。可能的是,有一些角落案件正在扼杀你的计划。
一旦完成了一系列测试,任何破坏代码单元内容假设的变化都会使测试立即失败。为此,我建议你研究一下Apache的Maven(或类似的东西)来自动运行你的构建测试(或者至少查看你的IDE,看看如何在每次代码更改时运行测试)。