Closed. This question is off-topic。它当前不接受答案。
                            
                        
                    
                
                            
                                
                
                        
                            
                        
                    
                        
                            想改善这个问题吗? Update the question,所以它是on-topic,用于堆栈溢出。
                        
                        2年前关闭。
                                                                                            
                
        
各位下午好。
我正在尝试编写一个小程序,该程序模仿计算机游戏《猴岛的秘密》中包含的密码轮。它由两个带有海盗面的纸板轮组成。将脸部的上半部分与下半部分组合在一起,可以在从第二张磁盘切出的窗口中显示不同的年份日期。您可以在这里看到它:Dial-A-Pirate

到目前为止,对于我来说,这项任务似乎很简单。我有一个用于我的年份的数组,以及两个用于图像文件名标识符的数组列表:

private int [][] years = {  {1710,  1651,   1679,   1719,   1694,   1632,   1668,   1703,   1726,   1564,   1615,   1599,   1669,   1660,   1687},
                            {1658,  1702,   1725,   1630,   1709,   1594,   1614,   1563,   1649,   1693,   1577,   1678,   1686,   1597,   1718},
                            {1724,  1667,   1691,   1685,   1613,   1580,   1723,   1717,   1684,   1628,   1643,   1559,   1573,   1708,   1701},
                            {1672,  1562,   1721,   1666,   1673,   1670,   1692,   1656,   1567,   1674,   1662,   1655,   1646,   1671,   1611},
                            {1627,  1707,   1688,   1699,   1568,   1705,   1579,   1585,   1665,   1706,   1506,   1722,   1716,   1584,   1551},
                            {1566,  1592,   1654,   1635,   1639,   1695,   1704,   1711,   1609,   1681,   1712,   1542,   1565,   1720,   1664},
                            {1690,  1682,   1601,   1619,   1680,   1621,   1652,   1689,   1713,   1697,   1696,   1624,   1604,   1653,   1641}};

ArrayList<Integer> disk1 = new ArrayList<Integer>();
ArrayList<Integer> disk2 = new ArrayList<Integer>();


public void createDisks() {
    int i;
    for(i=1; i <=29; i = i +2 ){
        disk1.add(i);
    }
    for(i=2; i <=30; i = i +2 ){
        disk2.add(i);
    }
}


我使用collections.rotate将列表旋转一位,并且只查看[0] [0]。
由于只有15个真正不同的轮子组合,因此我创建了一个int pirateID来将标签设置为数组中的相应年份。
这使我想到了我的问题。我想到的唯一可行的方法是编写一个巨大的if语句:

    private int getPirateID() {

    String temp = Integer.toString(disk1.get(0)) + Integer.toString(disk2.get(0));
    pirateID = Integer.parseInt(temp);

    if (pirateID == 12 || pirateID == 34 || pirateID == 56 || pirateID == 78 || pirateID == 910 || pirateID == 1112 || pirateID == 1314 || pirateID == 1516 || pirateID == 1718 || pirateID == 1920 || pirateID == 2122 || pirateID == 2324 || pirateID == 2526 || pirateID == 2728 || pirateID == 2930) {

        pirateID = 0;
    }

    if (pirateID == 130 || pirateID == 32 || pirateID == 54 || pirateID == 76 || pirateID == 98 || pirateID == 1110 || pirateID == 1312 || pirateID == 1514 || pirateID == 1716 || pirateID == 1918 || pirateID == 2120 || pirateID == 2322 || pirateID == 2524 || pirateID == 2726 || pirateID == 2928) {

        pirateID = 1;
    }

    if (pirateID == 128 || pirateID == 330 || pirateID == 52 || pirateID == 74 || pirateID == 96 || pirateID == 118 || pirateID == 1310 || pirateID == 1512 || pirateID == 1714 || pirateID == 1916 || pirateID == 2118 || pirateID == 2320 || pirateID == 2522 || pirateID == 2724 || pirateID == 2926) {
        pirateID = 2;
    }

    if (pirateID == 126 || pirateID == 328 || pirateID == 530 || pirateID == 72 || pirateID == 94 || pirateID == 116 || pirateID == 138 || pirateID == 1510 || pirateID == 1712 || pirateID == 1914 || pirateID == 2116 || pirateID == 2318 || pirateID == 2520 || pirateID == 2722 || pirateID == 2924) {
        pirateID = 3;
    }

    if (pirateID == 124 || pirateID == 326 || pirateID == 528 || pirateID == 730 || pirateID == 92 || pirateID == 114 || pirateID == 136 || pirateID == 158 || pirateID == 1710 || pirateID == 1912 || pirateID == 2114 || pirateID == 2316 || pirateID == 2518 || pirateID == 2720 || pirateID == 2922) {
        pirateID = 4;
    }

    if (pirateID == 122 || pirateID == 324 || pirateID == 526 || pirateID == 728 || pirateID == 930 || pirateID == 112 || pirateID == 134 || pirateID == 156 || pirateID == 178 || pirateID == 1910 || pirateID == 2112 || pirateID == 2314 || pirateID == 2516 || pirateID == 2718 || pirateID == 2920) {
        pirateID = 5;
    }

    if (pirateID == 120 || pirateID == 322 || pirateID == 524 || pirateID == 726 || pirateID == 928 || pirateID == 1130 || pirateID == 132 || pirateID == 154 || pirateID == 176 || pirateID == 198 || pirateID == 2110 || pirateID == 2312 || pirateID == 2514 || pirateID == 2716 || pirateID == 2918) {
        pirateID = 6;
    }

    if (pirateID == 118 || pirateID == 320 || pirateID == 522 || pirateID == 724 || pirateID == 926 || pirateID == 1128 || pirateID == 1330 || pirateID == 152 || pirateID == 174 || pirateID == 196 || pirateID == 218 || pirateID == 2310 || pirateID == 2512 || pirateID == 2714 || pirateID == 2916) {
        pirateID = 7;
    }

    if (pirateID == 116 || pirateID == 318 || pirateID == 520 || pirateID == 722 || pirateID == 924 || pirateID == 1126 || pirateID == 1328 || pirateID == 1530 || pirateID == 172 || pirateID == 194 || pirateID == 216 || pirateID == 238 || pirateID == 2510 || pirateID == 2712 || pirateID == 2914) {
        pirateID = 8;
    }

    if (pirateID == 114 || pirateID == 316 || pirateID == 518 || pirateID == 720 || pirateID == 922 || pirateID == 1124 || pirateID == 1326 || pirateID == 1528 || pirateID == 1730 || pirateID == 192 || pirateID == 214 || pirateID == 236 || pirateID == 258 || pirateID == 2710 || pirateID == 2912) {
        pirateID = 9;
    }

    if (pirateID == 112 || pirateID == 314 || pirateID == 516 || pirateID == 718 || pirateID == 920 || pirateID == 1122 || pirateID == 1324 || pirateID == 1526 || pirateID == 1728 || pirateID == 1930 || pirateID == 212 || pirateID == 234 || pirateID == 256 || pirateID == 278 || pirateID == 2910) {
        pirateID = 10;
    }

    if (pirateID == 110 || pirateID == 312 || pirateID == 514 || pirateID == 716 || pirateID == 918 || pirateID == 1120 || pirateID == 1322 || pirateID == 1524 || pirateID == 1726 || pirateID == 1928 || pirateID == 2130 || pirateID == 232 || pirateID == 254 || pirateID == 276 || pirateID == 298) {
        pirateID = 11;
    }
    if (pirateID == 18 || pirateID == 310 || pirateID == 512 || pirateID == 714 || pirateID == 916 || pirateID == 1118 || pirateID == 1320 || pirateID == 1522 || pirateID == 1724 || pirateID == 1926 || pirateID == 2128 || pirateID == 2330 || pirateID == 252 || pirateID == 274 || pirateID == 296) {
        pirateID = 12;
    }
    if (pirateID == 16 || pirateID == 38 || pirateID == 510 || pirateID == 712 || pirateID == 914 || pirateID == 1116 || pirateID == 1318 || pirateID == 1520 || pirateID == 1722 || pirateID == 1924 || pirateID == 2126 || pirateID == 2328 || pirateID == 2530 || pirateID == 272 || pirateID == 294) {
        pirateID = 13;
    }
    if (pirateID == 14 || pirateID == 36 || pirateID == 58 || pirateID == 710 || pirateID == 912 || pirateID == 1114 || pirateID == 1316 || pirateID == 1518 || pirateID == 1720 || pirateID == 1922 || pirateID == 2124 || pirateID == 2326 || pirateID == 2528 || pirateID == 2730 || pirateID == 292) {
        pirateID = 14;
    }


    return pirateID;
}


但这真的不是吗?必须采用更短的方法来进行,对吗?

最佳答案

您可以使用switch语句:

switch(pirateID) {
      case 12:
      case 34:
      case 56:
          pirateID = 1;
          break;
      case 130:
      case 32:
      case 54:
          pirateID = 0;
          break;
}


... 等等。

在这种情况下,将相同的变量用于输入和输出是一个坏习惯-更改值会造成混乱。为什么不:

final int userInput = Integer.parseInt(temp);
final int pirateId;
switch(userInput) {
    case 12:
         pirateId = 1;
    ...
    default:
         pirateId = 10;
}


另一种选择是填写Map

Map<Integer,Integer> idMap = new HashMap<>();
idMap.put(12,1);
idMap.put(130,0);
... etc.

pirateId = idMap.get(userInput);

10-07 12:27
查看更多