private UserHandler Bidd(List <UserHandler> currentUsers) { int checkValue = 0; UserHandler winner = null; bool begin = false; int checkedUsersCount = 0; bool exit = false; while (!exit && !skipBidd) { foreach (UserHandler u in currentUsers) { if (u.Status != STATUS.FOLD || u.Status != STATUS.ALL_IN) { if (u.Status == STATUS.DEALER) { InvokeIfRequired(() => { u.Status = STATUS.NO_ACTION; }); begin = true; continue; } else if (u.Status == STATUS.SMALL_BLIND) { if (u.TotalBallance < (blindValue / 2)) { InvokeIfRequired(() => { u.Status = STATUS.FOLD; u.IsPlaying = false; }); } else { InvokeIfRequired(() => { u.TotalBallance -= (blindValue / 2); dealer.Pot += (blindValue / 2); u.CurrentBet = (blindValue / 2); u.Status = STATUS.NO_ACTION; }); } } else if (u.Status == STATUS.BIG_BLIND) { if (u.TotalBallance < (blindValue)) { InvokeIfRequired(() => { u.Status = STATUS.FOLD; u.IsPlaying = false; }); } else { InvokeIfRequired(() => { u.TotalBallance -= (blindValue); dealer.Pot += (blindValue); u.CurrentBet = (blindValue); u.Status = STATUS.NO_ACTION; checkValue = blindValue; }); } begin = true; } else if (u.Status == STATUS.FOLD || u.Status == STATUS.NEW_USER || u.Status == STATUS.ALL_IN || !u.IsActive || !u.IsPlaying) { continue; } else if (begin) { foreach (UserHandler usr in currentUsers) { if (usr.IsActive && usr.IsPlaying) { InvokeIfRequired(() => { usr.Send_GameInfo(checkValue, blindValue); }); } } InvokeIfRequired(() => { u.Status = STATUS.MY_TURN; }); u.Send_WaitingForMoveSignal(); bool amIOnlyActiveUser = true; foreach (UserHandler usr in GetPlayingUsers()) { if (!(usr.Status == STATUS.ALL_IN || usr.Status == STATUS.MY_TURN)) { amIOnlyActiveUser = false; break; } } if (amIOnlyActiveUser) { skipBidd = true; } while (u.Status == STATUS.MY_TURN) { if (u.IsActive) { if (!runGame_break) { Thread.Sleep(500); } else { InvokeIfRequired(() => { u.Status = STATUS.NO_ACTION; }); winner = u; } } else { Console.WriteLine($"{u.Username} disconnected, skipping..."); u.Status = STATUS.FOLD; } } switch (u.Status) { case STATUS.CHECK: { checkedUsersCount++; InvokeIfRequired(() => { int coinsToAdd = checkValue - u.CurrentBet; u.TotalBallance -= coinsToAdd; dealer.Pot += coinsToAdd; u.CurrentBet = checkValue; }); break; } case STATUS.RAISE: { checkedUsersCount = 1; InvokeIfRequired(() => { int coinsToAdd = u.latestArgs.value - u.CurrentBet; u.TotalBallance -= coinsToAdd; dealer.Pot += coinsToAdd; checkValue = u.latestArgs.value; u.CurrentBet = checkValue; }); break; } case STATUS.FOLD: { break; } } if (u.TotalBallance == 0) { InvokeIfRequired(() => { u.Status = STATUS.ALL_IN; }); } int nonFoldedUsers = 0; foreach (var u2 in currentUsers) { if (u2.Status != STATUS.FOLD) { nonFoldedUsers++; } } if (checkedUsersCount == nonFoldedUsers) { exit = true; break; } if (nonFoldedUsers == 1) { exit = true; foreach (var u2 in currentUsers) { if (u2.Status != STATUS.FOLD) { winner = u2; } } break; } } else if (u.IsDealer) { begin = true; } } } } return(winner); }
private async void RunGame() { Task t = new Task(() => { currentDealerIndex = 0; GAME_MOMENT currentMoment; UserHandler potentialWinner = null; while (true) { InvokeIfRequired(() => { ResetBoard(); }); int current; do { current = Dispatcher.Invoke(new Func <int>(CountActiveUsers)); System.Threading.Thread.Sleep(1000); } while (current < 2); List <UserHandler> currentUsers; int activeUsersCount; do { runGame_break = false; skipBidd = false; InvokeIfRequired(() => { PrepareBoard(); }); activeUsersCount = 0; currentUsers = Dispatcher.Invoke(new Func <List <UserHandler> >(GetActiveUsers)); foreach (UserHandler u in currentUsers) { InvokeIfRequired(() => { u.IsPlaying = true; u.IsDealer = false; u.Status = STATUS.NEW_GAME; u.Send_StartSignal(); }); } InvokeIfRequired(() => { usedCards = new List <Card>(); }); if (currentDealerIndex >= currentUsers.Count) { currentDealerIndex = 0; } currentMoment = GAME_MOMENT.PREFLOP; while (currentMoment != GAME_MOMENT.SHOW) { foreach (UserHandler u in currentUsers) { if (u.IsPlaying) { InvokeIfRequired(() => { u.CurrentBet = 0; u.Status = STATUS.NO_ACTION; }); } } switch (currentMoment) { case GAME_MOMENT.PREFLOP: { Dispatcher.Invoke(() => { ExecutePreflop(currentUsers); }); break; } case GAME_MOMENT.FLOP: { Dispatcher.Invoke(() => { ExecuteFlop(currentUsers); }); break; } case GAME_MOMENT.TURN: { Dispatcher.Invoke(() => { ExecuteTurn(currentUsers); }); break; } case GAME_MOMENT.RIVER: { Dispatcher.Invoke(() => { ExecuteRiver(currentUsers); }); break; } } potentialWinner = Bidd(currentUsers); int stillPlaying = 0; foreach (var u in currentUsers) { if (u.IsPlaying) { stillPlaying++; } } if (potentialWinner != null || stillPlaying < 2) { break; } else { currentMoment++; } } UserHandler[] winners; if (potentialWinner == null) { winners = ExecuteRewardCalculation(currentUsers); } else { winners = new UserHandler[] { potentialWinner } }; ExecuteShow(currentUsers); System.Threading.Thread.Sleep(2000); foreach (UserHandler w in winners) { InvokeIfRequired(() => { w.Status = STATUS.WINNER; }); } if (currentMoment == GAME_MOMENT.SHOW) { if (winners.Length == 1) { SetDealerMessage($"{winners[0].Username} won ${dealer.Pot}\nwith {winners[0].CurrentSet.Figure.ToString()}"); } else { string msg = ""; for (int i = 0; i < winners.Length; i++) { if (i != 0) { msg += " and "; } msg += winners[i].Username; } SetDealerMessage($"{msg} won ${((int)dealer.Pot/winners.Length)} each\nwith {winners[0].CurrentSet.Figure.ToString()}"); } } System.Threading.Thread.Sleep(2000); InvokeIfRequired(() => { RewardWinners(dealer, winners); }); System.Threading.Thread.Sleep(2000); foreach (UserHandler u in currentUsers) { u.IsPlaying = false; } currentDealerIndex++; foreach (var u in users) { if (u.IsActive && u.TotalBallance > 0) { activeUsersCount++; } } }while (activeUsersCount >= 2); } }); t.Start(); try { await t; } catch (OperationCanceledException ocex) { Console.WriteLine(ocex.StackTrace); } catch (Exception ex) { Console.WriteLine(ex.StackTrace); } }