示例#1
0
        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), "Сперва торг"));
            }
        }
示例#2
0
        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));
                }
            }
        }
示例#3
0
        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 ? "Сейчас ходит оппонент" : "Сперва бросте кости")));
            }
        }
示例#4
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 ? "Сейчас ходит оппонент" : "Сперва бросте кости")));
            }
        }
示例#5
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);
        }
示例#6
0
        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 ? "Сейчас ходит оппонент" : "Сперва бросте кости")));
            }
        }
示例#7
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);
                }
            }
        }