public async Task RollCubes(string id, int countCubes, int[] index = null) { Room room = rooms.Find(w => w.id == Guid.Parse(id)); UserInGameProcess user = room.Users.Find(w => w.Id == Context.ConnectionId); Random random = new Random(); int[] cubes = new int[countCubes]; for (int i = 0; i < cubes.Length; i++)//рандом 6и интов { cubes[i] = random.Next(1, 7); } if (user.RollRaund == 0 && room.GameManager.SemiRaund == Raund.first)//если еще не кидал кости и если это первый полу-раунд { user.cubes = cubes; user.RollRaund++; await Clients.Caller.SendAsync("RollCubesReceived", user.cubes); } else if (user.RollRaund == 1 && room.GameManager.SemiRaund == Raund.second) { for (int i = 0; i < cubes.Length; i++) { user.cubes[index[i]] = cubes[i]; } await Clients.Caller.SendAsync("RollCubesReceived", user.cubes); } else { await Clients.Caller.SendAsync("MessageReceived", GetGameManager(room.GameManager, user, room.Users.Find(f => f.Id != user.Id), "Сперва торг")); } }
public async Task AllInBet(string id) { Room room = rooms.Find(w => w.id == Guid.Parse(id)); UserInGameProcess user = room.Users.Find(w => w.Id == Context.ConnectionId); if (user.Step && user.RollRaund > 0) { UserInGameProcess enemy = room.Users.Find(x => x.Id != Context.ConnectionId); if (enemy.stateGame == StateGame.none) { room.AllInBet(user, enemy); await ReturnMessage(user.Id, enemy.Id, room, string.Format("Вы пошли в Олл-Ин. Подняв ставку на {0} голды", room.GameManager.LastBet), string.Format("Противник пошел в Олл-Ин в Олл-Ин. Подняв ставку на {0} голды", room.GameManager.LastBet)); } else if (enemy.stateGame == StateGame.allIn)//если противник тоже пошел в олл-ин { await CompareBet(room, user.Gold, user, enemy); } else if (enemy.stateGame == StateGame.upBet) { int tempGold = user.Gold - room.GameManager.LastBet;//разница room.AllInBet(user, enemy); await ReturnMessage(user.Id, enemy.Id, room, string.Format("Вы пошли в Олл-Ин. Подняв ставку на {0} голды", tempGold), string.Format("Противник пошел в Олл-Ин в Олл-Ин. Подняв ставку на {0} голды", tempGold)); } } }
public async Task PassBet(string id) { Room room = rooms.Find(w => w.id == Guid.Parse(id)); UserInGameProcess user = room.Users.Find(w => w.Id == Context.ConnectionId); UserInGameProcess enemy = room.Users.Find(x => x.Id != Context.ConnectionId); if (user.Step && user.RollRaund > 0) { if (enemy.stateGame == StateGame.none)//если это первый ход и противник еще не ходил { user.stateGame = StateGame.pass; user.Step = false; await ReturnMessage(user.Id, enemy.Id, room, "Вы спасовали", "Противник спасовал"); } else if (enemy.stateGame == StateGame.upBet || enemy.stateGame == StateGame.allIn)//если противник уже поднял ставку, то вы сливаете раунд { if (room.GameManager.SemiRaund == Raund.first) { room.GameManager.SemiRaund++; } else { room.GameManager.SemiRaund = Raund.first; } if (!room.GameOver()) { room.GameManager.Raund++;//новый раунд } //отдать бабло противнику room.PassBet(user, enemy); await ReturnMessage(user.Id, enemy.Id, room, "Вы спасовали, противник выиграл этот раунд.", "Противник спасовал, вы выиграли этот раунд."); //чекаем окончание игры if (room.GameOver()) { //user пасанул значит автоматом отдает победу оппоненту room.Winner(enemy, user, db);//обновляем бд //отправляем инфу клиентам await GameOver(room); } } else if (enemy.stateGame == StateGame.pass) { await CompareBet(room, 0, user, enemy); } } else { await Clients.Caller.SendAsync("MessageReceived", GetGameManager(room.GameManager, user, enemy, (user.RollRaund > 0 ? "Сейчас ходит оппонент" : "Сперва бросте кости"))); } }
public async Task AcceptBet(string id) { Room room = rooms.Find(w => w.id == Guid.Parse(id)); UserInGameProcess user = room.Users.Find(w => w.Id == Context.ConnectionId); UserInGameProcess enemy = room.Users.Find(x => x.Id != Context.ConnectionId); if (user.Step && user.RollRaund > 0)//если ваш ход и вы уже бросили кости { if (enemy.stateGame == StateGame.upBet || enemy.stateGame == StateGame.allIn) { await CompareBet(room, room.GameManager.LastBet, user, enemy); } else { await Clients.Caller.SendAsync("MessageReceived", GetGameManager(room.GameManager, user, enemy, "Противник еще не поднимал ставку")); } } else { await Clients.Caller.SendAsync("MessageReceived", GetGameManager(room.GameManager, user, enemy, (user.RollRaund > 0 ? "Сейчас ходит оппонент" : "Сперва бросте кости"))); } }
GameManager GetGameManager(GameManager gameManager, UserInGameProcess user, UserInGameProcess enemy, string message) { GameManager temp = new GameManager() { AllBet = gameManager.AllBet, BargainEnd = gameManager.BargainEnd, LastBet = gameManager.LastBet, Raund = gameManager.Raund, SemiRaund = gameManager.SemiRaund, Message = message, UserGold = user.Gold, EnemyGold = enemy.Gold, UserWin = user.WinCount, EnemyWin = enemy.WinCount, RollRaund = user.RollRaund }; if (gameManager.OpenEnemyDice) { temp.CubesEnemy = enemy.cubes; } return(temp); }
public async Task UpBet(string id, int gold) { Room room = rooms.Find(w => w.id == Guid.Parse(id)); UserInGameProcess user = room.Users.Find(w => w.Id == Context.ConnectionId); UserInGameProcess enemy = room.Users.Find(x => x.Id != Context.ConnectionId); if (user.Step && user.RollRaund > 0)//если ваш ход и вы уже бросили кости { switch (enemy.stateGame) { case StateGame.none: //если вы делаете ставку первым { if (gold <= enemy.Gold) //если у противника хватает золота что бы ответить на вашу ставку { room.UpBet(gold, user, enemy); if (user.Gold == 0) //если вы отдает последнее золото, то автоматом идете в олл-ин { user.stateGame = StateGame.allIn; } await ReturnMessage(user.Id, enemy.Id, room, string.Format("Вы подняли ставку на {0}", gold.ToString()), string.Format("Противник поднял ставку на {0}", gold.ToString())); } else { await Clients.Caller.SendAsync("MessageReceived", GetGameManager(room.GameManager, user, enemy, "У противника недостаточно золота что бы ответить на вашу ставку")); } } break; case StateGame.upBet: //если оппонент уже сделал ставку { if (room.GameManager.LastBet == gold) //сравнял ставку { await CompareBet(room, gold, user, enemy); } else if (room.GameManager.LastBet > gold) //ставка не принята, слишком мало дал, ептать { await Clients.Caller.SendAsync("MessageReceived", GetGameManager(room.GameManager, user, enemy, "Ставка не принята, вы минимум должны сравнять сумму")); } else if (room.GameManager.LastBet < gold) //увеличил ставку { int tempGold = gold - room.GameManager.LastBet; room.UpBet(gold, user, enemy); await ReturnMessage(user.Id, enemy.Id, room, string.Format("Вы подняли ставку на {0}", tempGold.ToString()), string.Format("Противник поднял ставку на {0}", tempGold.ToString())); } } break; case StateGame.allIn: //если противник ушел в олл-ин, то вы либо пасуете, либо принимаете { if (gold == room.GameManager.LastBet) //если хватает голды { await CompareBet(room, gold, user, enemy); } else { await Clients.Caller.SendAsync("MessageReceived", GetGameManager(room.GameManager, user, enemy, "сумма должна равняться последней ставки")); } } break; case StateGame.pass: //если противник спасовал { if (room.GameManager.LastBet == 0) //если противник спасовал, но ставок еще нет { if (gold <= enemy.Gold) //если у противника хватает золота что бы ответить на вашу ставку { room.UpBet(gold, user, enemy); if (user.Gold == 0) //если вы отдает последнее золото, то автоматом идете в олл-ин { user.stateGame = StateGame.allIn; } await ReturnMessage(user.Id, enemy.Id, room, string.Format("Вы подняли ставку на {0}", gold.ToString()), string.Format("Противник поднял ставку на {0}", gold.ToString())); } else { await Clients.Caller.SendAsync("MessageReceived", GetGameManager(room.GameManager, user, enemy, "У противника недостаточно золота что бы ответить на вашу ставку")); } } else { await Clients.Caller.SendAsync("MessageReceived", GetGameManager(room.GameManager, user, enemy, "Противник уже спасовал")); } } break; } } else { await Clients.Caller.SendAsync("MessageReceived", GetGameManager(room.GameManager, user, enemy, (user.RollRaund > 0 ? "Сейчас ходит оппонент" : "Сперва бросте кости"))); } }
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); } } }