岩纸剪刀kattis:测试用例

时间:2015-10-26 20:25:07

标签: java

您好我一直在寻找,以确定在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
 **/

1 个答案:

答案 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,看看如何在每次代码更改时运行测试)。