m0_65749592 2025-10-15 18:13 采纳率: 34.4%
浏览 3

控制矩阵不中奖 一直都不

// 中奖规则 public void basicsLine(SlotGameTable gt, SlotGameData gameData, int[][] matrix, int matrixKey){ if(matrix == null) matrix = gt.getMatrix(); gameData.getFreeWildCols().addAll(gt.getAllWildCol()); gameData.getAllSpecCols().addAll(gt.getAllSpeCol()); List materialList = new ArrayList();//中奖素材 Map<Integer, Integer> colNumMap = gameData.getColNumMap();//中奖素材列数 Map<Integer, Integer> lineNumMap = gameData.getLineNumMap();//中奖素材条数 List bingoList = gameData.getBingoList();//中奖素材位置坐标 int specialCol = -1; for (int i = 0; i < matrix[0].length; i++) { long num = 1; boolean hasScatter = false; boolean hasSpecial = false; for (int j = 0; j < matrix.length; j++) { if((gt.getRoomID()==GameConstant.GAME_PLAY_TYPE_MAHJONG2 || gt.getRoomID()==GameConstant.GAME_PLAY_TYPE_MAHJONG3 || gt.getRoomID()==GameConstant.GAME_PLAY_TYPE_MAHJONG4) && (j==0 || j==matrix.length-1 || (j==1 && (i==0 || i==matrix[0].length-1)))){ continue; } if(i==0 && !materialList.contains(matrix[j][i]) && matrix[j][i]!=GameMaterialConstant.GAME_SPECIAL_MATERIAL_1 && matrix[j][i]!=GameMaterialConstant.GAME_SPECIAL_MATERIAL_2 && !gameData.getFreeWildCols().contains(i) && matrix[j][i]!=GameMaterialConstant.GAME_SPECIAL_MATERIAL_4 && matrix[j][i]!=GameMaterialConstant.GAME_SPECIAL_MATERIAL_6 && matrix[j][i]!=GameMaterialConstant.GAME_SPECIAL_MATERIAL_3){ materialList.add(matrix[j][i]); }else if(specialCol+1==i && matrix[j][i]!=GameMaterialConstant.GAME_SPECIAL_MATERIAL_2 && matrix[j][i]!=GameMaterialConstant.GAME_SPECIAL_MATERIAL_3 && matrix[j][i]!=GameMaterialConstant.GAME_SPECIAL_MATERIAL_1 && !materialList.contains(matrix[j][i]) && !gameData.getFreeWildCols().contains(i) && matrix[j][i]!=GameMaterialConstant.GAME_SPECIAL_MATERIAL_4 && matrix[j][i]!=GameMaterialConstant.GAME_SPECIAL_MATERIAL_6){ materialList.add(matrix[j][i]); } if(matrix[j][i]==GameMaterialConstant.GAME_SPECIAL_MATERIAL_1 || matrix[j][i]==GameMaterialConstant.GAME_SPECIAL_MATERIAL_3 || gameData.getFreeWildCols().contains(i)){ num*=0; hasSpecial=true; }else{ num*=matrix[j][i]; } if(matrix[j][i]==GameMaterialConstant.GAME_SPECIAL_MATERIAL_2){ hasScatter=true; } } if(specialCol+1==i && hasSpecial){ specialCol=i; } if(i!=0){ for (int j = 0; j < materialList.size(); j++) { if(num%materialList.get(j)!=0 && materialList.get(j)!=GameMaterialConstant.GAME_SPECIAL_MATERIAL_2 && materialList.get(j)!=GameMaterialConstant.GAME_SPECIAL_MATERIAL_4 && materialList.get(j)!=GameMaterialConstant.GAME_SPECIAL_MATERIAL_6){ if(i>2){ colNumMap.put(materialList.get(j), i); } materialList.remove(j); j--; }/else if(materialList.get(j)==GameMaterialConstant.GAME_SPECIAL_MATERIAL_2&&!hasScatter){ if(i>2){ colNumMap.put(materialList.get(j), i); } materialList.remove(j); j--; }/else if(i==matrix[0].length-1){ colNumMap.put(materialList.get(j), matrix[0].length); } } } } for (Integer key : colNumMap.keySet()) { for (int i = 0; i < colNumMap.get(key); i++) { int sum = 0; for (int j = 0; j < matrix.length; j++) { if((gt.getRoomID()==GameConstant.GAME_PLAY_TYPE_MAHJONG2 || gt.getRoomID()==GameConstant.GAME_PLAY_TYPE_MAHJONG3 || gt.getRoomID()==GameConstant.GAME_PLAY_TYPE_MAHJONG4) && (j==0 || j==matrix.length-1 || (j==1 && (i==0 || i==matrix[0].length-1)))){ continue; } /*if(matrix[j][i]==key || (matrix[j][i]==GameMaterialConstant.GAME_SPECIAL_MATERIAL_1 && key!=GameMaterialConstant.GAME_SPECIAL_MATERIAL_2) || gameData.getFreeWildCols().contains(i)){*/ if((matrix[j][i]==key || matrix[j][i]==GameMaterialConstant.GAME_SPECIAL_MATERIAL_1 || matrix[j][i]==GameMaterialConstant.GAME_SPECIAL_MATERIAL_3 || gameData.getFreeWildCols().contains(i))){ bingoList.add(j+"_"+(i+gt.getCol()*matrixKey)); sum++; } } if(lineNumMap.containsKey(key)){ lineNumMap.put(key, lineNumMap.get(key)*sum); }else{ lineNumMap.put(key, sum); } } } } public void matrixMAHJONG3(int[][] resultMatrix, int freeNum) { if (resultMatrix == null) { matrix = new int[row][col]; matrixFree = new int[row][col]; int rand = random.nextInt(10000);//普通转两种免费素材概率 if (rand < 2) { freeNum = 5; } else if (rand < 10) { freeNum = 4; } else if (rand < 34 || (buyFreeType!=SlotDefine.SLOT_NOT_BUY_FREE_GAME && !isFree)) { freeNum = 3; } else if (rand < 534) { freeNum = 2; } else if (rand < 3000) { freeNum = 1; } else { freeNum = 0; } }else{ goldMaterialPosList.clear(); matrix = fallMatrixsMAHJONG2(); } List placeFreeColList=new ArrayList(); Map<Integer, List> placeFreePosMap=new HashMap<Integer, List>(); List falseGoldPosList=new ArrayList(); if(freeNum>0){ for (int j = 0; j < matrix[0].length; j++) { boolean hasFree=false; List freePosList = new ArrayList(); for (int i = 0; i < matrix.length; i++) { if(matrix[i][j]==GameMaterialConstant.GAME_SPECIAL_MATERIAL_2 || matrix[i][j]==GameMaterialConstant.GAME_SPECIAL_MATERIAL_4){ hasFree=true; break; }else if(matrix[i][j]==0){ if(buyFreeType!=SlotDefine.SLOT_NOT_BUY_FREE_GAME && (i==0 || i==row-1 || (i==1 && (j==0 || j==col-1)))){ continue; } freePosList.add(i+"_"+j); } } if(!hasFree && freePosList.size()>0){ placeFreeColList.add(j); placeFreePosMap.put(j, freePosList); } } // 随机 int rand=random.nextInt(10)<6||buyFreeType!=SlotDefine.SLOT_NOT_BUY_FREE_GAME?freeNum:random.nextInt(freeNum); for (int i = 0; i < rand; i++) { if(placeFreePosMap.size()==0){ break; } int colRand=placeFreeColList.remove(random.nextInt(placeFreeColList.size())); String pos=placeFreePosMap.get(colRand).get(random.nextInt(placeFreePosMap.get(colRand).size())); int r=Integer.parseInt(pos.split("_")[0]); int c=Integer.parseInt(pos.split("_")[1]); //普通转 有免费素材数量 10% 分配黑色胜 if (freeNum<3) { if (random.nextInt(100) < 50) { // 90%选择金色 matrix[r][c] = GameMaterialConstant.GAME_SPECIAL_MATERIAL_2; } else { // 10%选择黑色 matrix[r][c] = GameMaterialConstant.GAME_SPECIAL_MATERIAL_4; } }else {//触发免费出现黑胜的概率 if (random.nextInt(100) < 10) { matrix[r][c] = GameMaterialConstant.GAME_SPECIAL_MATERIAL_4; } else { matrix[r][c] = GameMaterialConstant.GAME_SPECIAL_MATERIAL_2; } } placeFreePosMap.remove(colRand); } freeNum -= rand; } for (int j = 0; j < col; j++) { for (int i = 0; i < row; i++) { if (matrix[i][j] == 0) { // 素材结果 int materia = 0; int num = random.nextInt(90); if (num < 10) { materia = GameMaterialConstant.GAME_NORMAL_MATERIAL_101; } else if (num < 20) { materia = GameMaterialConstant.GAME_NORMAL_MATERIAL_103; } else if (num < 30) { materia = GameMaterialConstant.GAME_NORMAL_MATERIAL_107; } else if (num < 40) { materia = GameMaterialConstant.GAME_NORMAL_MATERIAL_109; } else if (num < 50) { materia = GameMaterialConstant.GAME_NORMAL_MATERIAL_113; } else if (num < 60) { materia = GameMaterialConstant.GAME_NORMAL_MATERIAL_127; } else if (num < 70) { materia = GameMaterialConstant.GAME_NORMAL_MATERIAL_131; } else if (num < 80){ materia = GameMaterialConstant.GAME_NORMAL_MATERIAL_137; } else{ materia = GameMaterialConstant.GAME_NORMAL_MATERIAL_139; } matrix[i][j] = materia; if((isFree||isAdFree) && j==2 && !goldMaterialPosList.contains(i+"_"+j)){ goldMaterialPosList.add(i+"_"+j); matrixFree[i][j]=materia; }else if(j != 0 && j != 4){ falseGoldPosList.add(i+"_"+j); } } } } System.out.println("falseGoldPosList=" + falseGoldPosList); int trueGoldNum = 0;// 真黄金牌数量 int falseGoldNum = 0;// 假黄金牌数量 int goldRand = random.nextInt(1001); if (goldRand < 410) { falseGoldNum = 1; } else if (goldRand < 625) { falseGoldNum = 2; } else if (goldRand < 720) { falseGoldNum = 3; } else if (goldRand < 740) { falseGoldNum = 4; } else if (goldRand < 745) { falseGoldNum = 5; } else if (goldRand < 850) { trueGoldNum = 1; } else if (goldRand < 870) { trueGoldNum = 2; } else if (goldRand < 875) { trueGoldNum = 3; } else if (goldRand < 876) { trueGoldNum = 4; } int goldNum = 5 - goldMaterialPosList.size();// 可以出现黄金牌的数量 if(isFree||isAdFree){ goldNum+=row; } if (falseGoldNum > 0 && goldNum - falseGoldNum < 0) { falseGoldNum = goldNum; } if (trueGoldNum > 0 && goldNum - trueGoldNum < 0) { trueGoldNum = goldNum; } System.out.println("trueGoldNum=" + trueGoldNum + "falseGoldNum=" + falseGoldNum); List bingoList = isLine(matrix);// 连线素材位置 // 最后一个矩阵如果还有免费素材 if (bingoList.size() <= 0 && freeNum > 0 && placeFreeColList.size()>0) { for (int i = 0; i < freeNum; i++) { if(placeFreePosMap.size()==0){ break; } int colRand=placeFreeColList.remove(random.nextInt(placeFreeColList.size())); String pos=placeFreePosMap.get(colRand).get(random.nextInt(placeFreePosMap.get(colRand).size())); int r = Integer.parseInt(pos.split("_")[0]); int c = Integer.parseInt(pos.split("_")[1]); if (goldMaterialPosList.contains(pos)) { goldMaterialPosList.remove(pos); matrixFree[r][c]=0; } if (freeNum<3) { if (random.nextInt(100) < 50) { // 90%选择金色 matrix[r][c] = GameMaterialConstant.GAME_SPECIAL_MATERIAL_2; } else { // 10%选择黑色 matrix[r][c] = GameMaterialConstant.GAME_SPECIAL_MATERIAL_4; } }else { if (random.nextInt(100) < 10) { matrix[r][c] = GameMaterialConstant.GAME_SPECIAL_MATERIAL_4; } else { matrix[r][c] = GameMaterialConstant.GAME_SPECIAL_MATERIAL_2; } } placeFreePosMap.remove(c); } } //设置黄金牌 setGoldMaterial(bingoList, falseGoldPosList, trueGoldNum, falseGoldNum); System.out.println(); // 设置完黄金牌之后再添加进矩阵列表 for (int i = 0; i < matrix.length; i++) { List cardList = new ArrayList(); for (int j = 0; j < matrix[i].length; j++) { if (goldMaterialPosList.contains(i + "_" + j)) { goldMaterialPos += i + "_" + (j + matrixs.size() * col)+ ","; } cardList.add(matrix[i][j]); System.out.print(matrix[i][j] + "\t"); } matrixList.add(cardList); System.out.println(); } matrixs.add(fuzhiMatrix(matrix)); for (int i = 0; i < bingoList.size(); i++) { String bingoPos = bingoList.get(i); int r = Integer.parseInt(bingoPos.split("_")[0]); int c = Integer.parseInt(bingoPos.split("_")[1]); // 连线素材里有黄金素材变为万能素材 if (goldMaterialPosList.contains(bingoPos)) { matrixFree[r][c]=0; goldMaterialPosList.remove(bingoPos); matrix[r][c] = GameMaterialConstant.GAME_SPECIAL_MATERIAL_1; } else { matrix[r][c] = 0; } } System.out.println("goldMaterialPosList=" + goldMaterialPosList + ",goldMaterialPos=" + goldMaterialPos); if (bingoList.size() > 0) { System.out.println("bingoList=" + bingoList); matrixMAHJONG3(matrix, freeNum); } } 需求:basicsLine是中奖规则,matrixMAHJONG3是生成的7行5列矩阵的方法,生成完之后会去进行规则方法调用,看符不符合中奖, 我希望matrixMAHJONG3生成的矩阵一直都不符合basicsLine中奖,所以我这个matrixMAHJONG3方法该怎么去调整,帮我仔细改一下, 并且随机出来的矩阵不像机器人,另外也不能使用getOrDefault

  • 写回答

4条回答 默认 最新

  • 檀越@新空间 2025-10-15 18:14
    关注

    晚上好🌙🌙🌙
    本答案参考通义千问

    你提供的代码片段是一个用于老虎机游戏(Slot Game)中判断中奖逻辑的Java方法 basicsLine,以及一个用于生成矩阵的方法 matrixMAHJONG3。你提到的问题是“控制矩阵不中奖 一直都不”,也就是说,在当前的逻辑中,无论怎么生成矩阵,都无法触发中奖机制


    问题分析

    从你的描述来看,核心问题是:中奖规则没有被正确触发,导致无论如何生成矩阵,都不会有“中奖”结果。

    1. 中奖规则未被正确触发

    • basicsLine 方法中,只有在某些条件下才会将素材加入 bingoList
    • 如果条件不满足,那么 bingoList 就不会被填充,最终也不会触发中奖逻辑。
    • 例如:
      if((matrix[j][i]==key || matrix[j][i]==GameMaterialConstant.GAME_SPECIAL_MATERIAL_1 || matrix[j][i]==GameMaterialConstant.GAME_SPECIAL_MATERIAL_3 || gameData.getFreeWildCols().contains(i))){
          bingoList.add(j+"_"+(i+gt.getCol()*matrixKey));
          sum++;
      }
      

      这个判断语句是否成立取决于 matrix[j][i] 是否等于 key 或者是特殊材料(如 GAME_SPECIAL_MATERIAL_1),或者是否属于自由野牌列(freeWildCols)。

    2. 中奖素材列表为空

    • 如果 materialList 没有被正确填充,那么后续的 colNumMaplineNumMap 也不会被填充。
    • 例如:
      if(i==0 && !materialList.contains(matrix[j][i]) && ...){
          materialList.add(matrix[j][i]);
      }
      

      如果这个条件始终不满足,那么 materialList 就会一直是空的,导致 colNumMaplineNumMap 也为空,进而导致 bingoList 为空。

    3. 自由野牌列(Free Wild Columns)未被正确设置

    • 如果 gameData.getFreeWildCols() 没有包含任何列,那么即使某些位置是野牌(wild),也无法被识别为中奖素材。
    • 例如:
      if(matrix[j][i]==GameMaterialConstant.GAME_SPECIAL_MATERIAL_1 || matrix[j][i]==GameMaterialConstant.GAME_SPECIAL_MATERIAL_3 || gameData.getFreeWildCols().contains(i)){
          num *= 0;
          hasSpecial = true;
      }
      

      如果 gameData.getFreeWildCols() 没有值,那么这部分逻辑就不会执行。


    ✅ 解决方案

    以下是逐步排查并修复中奖逻辑不触发的问题的详细步骤:

    1. 确保 materialList 被正确填充

    • 关键点:确保 materialList 中有实际的素材(非空)。
    • 修改建议
      • 检查 matrix 的内容是否正常。
      • 确保 matrix[j][i] 不是 null,并且符合 materialList 的添加条件。
    if (i == 0 && !materialList.contains(matrix[j][i]) 
        && matrix[j][i] != GameMaterialConstant.GAME_SPECIAL_MATERIAL_1 
        && matrix[j][i] != GameMaterialConstant.GAME_SPECIAL_MATERIAL_2 
        && !gameData.getFreeWildCols().contains(i) 
        && matrix[j][i] != GameMaterialConstant.GAME_SPECIAL_MATERIAL_4 
        && matrix[j][i] != GameMaterialConstant.GAME_SPECIAL_MATERIAL_6 
        && matrix[j][i] != GameMaterialConstant.GAME_SPECIAL_MATERIAL_3) {
        materialList.add(matrix[j][i]);
    }
    

    加粗重点:确保 matrix[j][i] 是有效的素材,并且不属于特殊列或野牌列。


    2. 确保 bingoList 被正确填充

    • 关键点:检查 bingoList 是否在循环中被正确添加了坐标。
    • 修改建议
      • 添加日志输出,查看 bingoList 是否为空。
    System.out.println("Bingo List: " + bingoList);
    

    加粗重点:通过打印日志确认 bingoList 是否被填充,若为空则说明中奖逻辑未被触发。


    3. 确保 gameData.getFreeWildCols() 包含有效列

    • 关键点:如果 freeWildCols 为空,则无法触发野牌相关的中奖逻辑。
    • 修改建议
      • 在调用 basicsLine 之前,确保 gameData.setFreeWildCols(...) 被正确调用。
    gameData.setFreeWildCols(Arrays.asList(0, 1, 2)); // 示例:设置第0、1、2列为野牌列
    

    加粗重点:野牌列必须被显式设置,否则不会被识别为中奖素材。


    4. 确保 matrix 数据结构正确

    • 关键点:检查 matrix 是否为合法二维数组,且每个元素都为有效素材。
    • 修改建议
      • 在调用 basicsLine 之前,打印 matrix 的内容,确保其结构和数据正确。
    for (int[] row : matrix) {
        System.out.println(Arrays.toString(row));
    }
    

    加粗重点:确保 matrix 中的每个位置都有合法的素材值,而不是 0null


    5. 检查 matrixMAHJONG3 中的随机逻辑

    • 关键点matrixMAHJONG3 中的随机逻辑可能导致生成的矩阵无法触发中奖。
    • 修改建议
      • 调整概率值,提高中奖概率。
    int rand = random.nextInt(10000);
    if (rand < 100) { // 提高中奖概率
        freeNum = 5;
    } else if (rand < 200) {
        freeNum = 4;
    } else if (rand < 500) {
        freeNum = 3;
    }
    

    加粗重点:通过调整 rand 的阈值,提高中奖的概率。


    🧠 总结

    | 步骤 | 内容 | |------|------| | 1 | 确保 materialList 被正确填充 | | 2 | 确保 bingoList 被正确填充 | | 3 | 确保 gameData.getFreeWildCols() 包含有效列 | | 4 | 确保 matrix 数据结构正确 | | 5 | 调整 matrixMAHJONG3 中的随机逻辑以提高中奖概率 |


    如果你能提供完整的 matrixMAHJONG3 方法或 matrix 的示例数据,我可以进一步帮你调试具体的中奖逻辑问题。

    评论

报告相同问题?

问题事件

  • 创建了问题 10月15日