CombinationDiceResult DiceResult(int[] cubes) { Array.Sort(cubes);//сортируем List <CombinationDice> combinationDices = new List <CombinationDice>(); for (int i = 0; i < cubes.Length; i++) { var temp = cubes.Where(w => w == cubes[i]).ToArray(); //ищет совпадения i += temp.Length - 1; //сразу увеличивает итерацию switch (temp.Length) { case 1: combinationDices.Add(new CombinationDice() { CombinationType = CombinationDiceType.None, Value = cubes[i] }); break; case 2: combinationDices.Add(new CombinationDice() { CombinationType = CombinationDiceType.Pair, Value = cubes[i] }); break; case 3: combinationDices.Add(new CombinationDice() { CombinationType = CombinationDiceType.Three, Value = cubes[i] }); break; case 4: combinationDices.Add(new CombinationDice() { CombinationType = CombinationDiceType.Four, Value = cubes[i] }); break; case 5: combinationDices.Add(new CombinationDice() { CombinationType = CombinationDiceType.Flush, Value = cubes[i] }); break; } } int sum = 0; ///вычисляем сумму ///формула такая: sum = type*10+D; где type это чило комбинации, D - старшая кость CombinationDiceResult combinationDiceResult = new CombinationDiceResult(); if (combinationDices.Count == 5)//то есть если все дайсы оказались разные, то проверка на стрит { bool flag = true; for (int i = 0; i < combinationDices.Count - 1; i++) { if ((combinationDices[i].Value + 1) != combinationDices[i + 1].Value)//если это не стрит { flag = false; continue;//прерываем цикл } } if (flag)//если все же стрит { sum += ((int)CombinationDiceType.Straight) * 10 + (combinationDices.Max(m => m.Value)); combinationDiceResult.Sum = sum; combinationDiceResult.Message = string.Format("Стрит. Старшая кость: {0}", combinationDices.Max(m => m.Value)); return(combinationDiceResult); } } foreach (var comb in combinationDices) { sum += ((int)comb.CombinationType) * 10 + comb.Value; switch (comb.CombinationType) { case CombinationDiceType.None: combinationDiceResult.Message += string.Format(" *{0}* ", comb.Value); break; case CombinationDiceType.Pair: combinationDiceResult.Message += string.Format(" *Пара из {0}* ", comb.Value); break; case CombinationDiceType.Three: combinationDiceResult.Message += string.Format(" *Сет из {0}* ", comb.Value); break; case CombinationDiceType.Four: combinationDiceResult.Message += string.Format(" *Карэ из {0}* ", comb.Value); break; case CombinationDiceType.Flush: combinationDiceResult.Message += string.Format(" *Флеш из {0}* ", comb.Value); break; } } //если всего две комбинации и сдержит пару и сет. то это фулл-хаус, нужно будет отдельное сравнение if (combinationDices.Count == 2 && combinationDices.Where(w => w.CombinationType == CombinationDiceType.Pair).FirstOrDefault() != null && combinationDices.Where(w => w.CombinationType == CombinationDiceType.Three).FirstOrDefault() != null) { sum += 10; combinationDiceResult.Message = "Фулл-Хаус."; combinationDiceResult.FullHouse = true; } combinationDiceResult.Sum = sum; return(combinationDiceResult); }
async Task CompareBet(Room room, int gold, UserInGameProcess user, UserInGameProcess enemy) { if (room.GameManager.SemiRaund == Raund.first) { room.GameManager.SemiRaund++; room.AcceptBet(gold, user, enemy);//торг окончен if (user.Gold == 0) { user.stateGame = StateGame.allIn; //идем в олл-ин если отдаем последнее золото room.GameManager.AllIn = true; //отмечаем что при следующем перебросе костей, торга не будет. Сразу вскрываются кости. } await ReturnMessage(user.Id, enemy.Id, room, "Вы приняли ставку, можете выбрать и перебросить кости", "Противник принял ставку, можете выбрать и перебросить кости"); } else if (room.GameManager.SemiRaund == Raund.second) { room.GameManager.SemiRaund = Raund.first;//обновляем и полу раунд if (!room.GameOver()) { room.GameManager.Raund++;//некст раунд ++ } room.AcceptBet(gold, user, enemy); user.RollRaund = enemy.RollRaund = 0; room.GameManager.OpenEnemyDice = true;//показываем дайсы друг другу CombinationDiceResult combinationDiceResultUser = DiceResult(user.cubes); CombinationDiceResult combinationDiceResultEnemy = DiceResult(enemy.cubes); int result = combinationDiceResultUser.ToCompare(combinationDiceResultEnemy); string userMessage = null, enemyMessage = null; switch (result) { case 0: userMessage = string.Format("Вы приняли ставку, вскрываем кости.\n{0}\nНичья", combinationDiceResultUser.Message); enemyMessage = string.Format("Противник принял ставку, вскрываем кости.\n{0}\nНичья", combinationDiceResultEnemy.Message); room.Draw(user, enemy); //делим бабло поравну break; case 1: userMessage = string.Format("Вы приняли ставку, вскрываем кости.\n{0}\nВы выиграли", combinationDiceResultUser.Message); enemyMessage = string.Format("Противник принял ставку, вскрываем кости.\n{0}\nВы Проиграли", combinationDiceResultEnemy.Message); room.TakeBet(user); //забираем бабло со ставки break; case -1: userMessage = string.Format("Вы приняли ставку, вскрываем кости.\n{0}\nВы Проиграли", combinationDiceResultUser.Message); enemyMessage = string.Format("Противник принял ставку, вскрываем кости.\n{0}\nВы выиграли", combinationDiceResultEnemy.Message); room.TakeBet(enemy); //отдаем бабло со ставки break; } await ReturnMessage(user.Id, enemy.Id, room, userMessage, enemyMessage); room.GameManager.OpenEnemyDice = false;//отменяем показ костей оппонента до след. раза //теперь чекаем окончание игры if (room.GameOver()) { room.Winner(user, enemy, db); //отправляем инфу клиентам await GameOver(room); } } }