Esempio n. 1
0
 public int Join(Socket s, string n, int c)
 {
     if (c < buyIn)
     {
         return(-1);
     }
     for (int i = 0; i < maxPlayers; i++)
     {
         if (players[i] == null)
         {
             players[i] = new Player(s, n, buyIn);
             numPlayers++;
             connectedPlayers++;
             ServerSocket.Send(s, "Join\nSuccess\n<EOF>");
             BroadcastPublicInfo();
             ServerSocket.Send(s, players[i].printChips());
             if (state == 0)
             {
                 advanceState();
             }
             return(i);
         }
     }
     return(-1);
 }
Esempio n. 2
0
 private void Broadcast(string data)
 {
     for (int i = 0; i < maxPlayers; i++)
     {
         if (players[i] != null && !players[i].leftGame)
         {
             ServerSocket.Send(players[i].mySocket, data);
         }
     }
 }
Esempio n. 3
0
 public void Fold(int ix)
 {
     if (ix != currentPlayer)
     {
         return;
     }
     players[ix].isFolded = true;
     players[ix].hasActed = true;
     if (!players[ix].leftGame)
     {
         players[ix].status = "Fold";
     }
     players[ix].card1 = null;
     players[ix].card2 = null;
     numActivePlayers--;
     if (numActivePlayers == numAllIn)
     {
         advanceState();
         return;
     }
     currentPlayer = advancePlayer(currentPlayer);
     if (numActivePlayers == 1)
     {
         players[currentPlayer].chips += getPot();
         players[currentPlayer].status = "Winner";
         for (int i = 0; i < maxPlayers; i++)
         {
             if (players[i] != null)
             {
                 players[i].inPot = 0;
             }
         }
         BroadcastPublicInfo();
         SendPrivateInfo();
         state = 5;
         advanceState();
         return;
     }
     else if (players[currentPlayer].leftGame)
     {
         Fold(currentPlayer);
         return;
     }
     else if (players[currentPlayer].hasActed &&
              (players[currentPlayer].chips == 0 ||
               players[currentPlayer].betSoFar == getMaxBet()))
     {
         advanceState();
         return;
     }
     players[currentPlayer].status = "Waiting";
     BroadcastPublicInfo();
     SendPrivateInfo();
     ServerSocket.Send(players[currentPlayer].mySocket, players[currentPlayer].printCall(getMaxBet()));
 }
Esempio n. 4
0
 private void SendPrivateInfo()
 {
     for (int i = 0; i < maxPlayers; i++)
     {
         if (players[i] != null && !players[i].leftGame)
         {
             ServerSocket.Send(players[i].mySocket, players[i].printChips());
             ServerSocket.Send(players[i].mySocket, players[i].printHand());
         }
     }
 }
Esempio n. 5
0
        public void Raise(int ix, int amt)
        {
            if (ix != currentPlayer)
            {
                return;
            }
            int bamt = getMaxBet() - players[ix].betSoFar + amt;

            if (getMaxBet() == 0)
            {
                if (players[ix].bet(amt, "Bet", amt))
                {
                    numAllIn++;
                }
            }
            else
            {
                if (players[ix].bet(bamt, "Raise", amt))
                {
                    numAllIn++;
                }
            }
            players[ix].hasActed = true;
            if (numActivePlayers == numAllIn)
            {
                advanceState();
                return;
            }
            currentPlayer = advancePlayer(currentPlayer);
            if (players[currentPlayer].leftGame)
            {
                Fold(currentPlayer);
                return;
            }
            else if (players[currentPlayer].hasActed &&
                     (players[currentPlayer].chips == 0 ||
                      players[currentPlayer].betSoFar == getMaxBet()))
            {
                advanceState();
                return;
            }
            players[currentPlayer].status = "Waiting";
            BroadcastPublicInfo();
            SendPrivateInfo();
            ServerSocket.Send(players[currentPlayer].mySocket, players[currentPlayer].printCall(getMaxBet()));
        }
Esempio n. 6
0
 private void advanceState()
 {
     if (state == 0)
     {
         for (int i = 0; i < maxPlayers; i++)
         {
             if (players[i] != null && players[i].leftGame)
             {
                 players[i] = null;
                 numPlayers--;
             }
         }
         numActivePlayers = 0;
         numAllIn         = 0;
         deck.shuffle();
         for (int i = 0; i < maxPlayers; i++)
         {
             if (players[i] != null)
             {
                 if (players[i].setUpNewGame(deck.drawNext(), deck.drawNext()))
                 {
                     numActivePlayers++;
                 }
                 else
                 {
                     connectedPlayers--;
                     numPlayers--;
                     ServerSocket.Send(players[i].mySocket, "Kick\n<EOF>");
                     ServerSocket.Send(players[i].mySocket, ServerSocket.printServers());
                     ServerSocket.Send(players[i].mySocket, "StoredChips\n" + ServerSocket.database.getNumberOfChips(players[i].name) + "\n<EOF>");
                     players[i] = null;
                 }
             }
         }
         if (numActivePlayers <= 1)
         {
             BroadcastPublicInfo();
             return;
         }
         dealtCards             = new Card[5];
         dealer                 = advancePlayer(dealer);
         players[dealer].status = "Dealer";
         currentPlayer          = advancePlayer(dealer);
         if (players[currentPlayer].bet(smallBlind, "Small Blind", smallBlind))
         {
             numAllIn++;
         }
         players[currentPlayer].hasActed = false;
         currentPlayer = advancePlayer(currentPlayer);
         if (players[currentPlayer].bet(smallBlind * 2, "Big Blind", smallBlind * 2))
         {
             numAllIn++;
         }
         players[currentPlayer].hasActed = false;
         currentPlayer = advancePlayer(currentPlayer);
         players[currentPlayer].status = "Waiting";
         BroadcastPublicInfo();
         SendPrivateInfo();
         ServerSocket.Send(players[currentPlayer].mySocket, players[currentPlayer].printCall(getMaxBet()));
         state = 1;
     }
     else if (state == 1)
     {
         for (int j = 0; j < 3; j++)
         {
             dealtCards[j] = deck.drawNext();
         }
         state = 2;
         if (numAllIn + 1 >= numActivePlayers)
         {
             advanceState();
             return;
         }
         for (int i = 0; i < maxPlayers; i++)
         {
             if (players[i] != null)
             {
                 players[i].setUpNewBet();
             }
         }
         currentPlayer = advancePlayer(dealer);
         players[currentPlayer].status = "Waiting";
         BroadcastPublicInfo();
         SendPrivateInfo();
         ServerSocket.Send(players[currentPlayer].mySocket, players[currentPlayer].printCall(getMaxBet()));
     }
     else if (state == 2)
     {
         state         = 3;
         dealtCards[3] = deck.drawNext();
         if (numAllIn + 1 >= numActivePlayers)
         {
             advanceState();
             return;
         }
         for (int i = 0; i < maxPlayers; i++)
         {
             if (players[i] != null)
             {
                 players[i].setUpNewBet();
             }
         }
         currentPlayer = advancePlayer(dealer);
         players[currentPlayer].status = "Waiting";
         BroadcastPublicInfo();
         SendPrivateInfo();
         ServerSocket.Send(players[currentPlayer].mySocket, players[currentPlayer].printCall(getMaxBet()));
     }
     else if (state == 3)
     {
         dealtCards[4] = deck.drawNext();
         state         = 4;
         if (numAllIn + 1 >= numActivePlayers)
         {
             advanceState();
             return;
         }
         for (int i = 0; i < maxPlayers; i++)
         {
             if (players[i] != null)
             {
                 players[i].setUpNewBet();
             }
         }
         currentPlayer = advancePlayer(dealer);
         players[currentPlayer].status = "Waiting";
         BroadcastPublicInfo();
         SendPrivateInfo();
         ServerSocket.Send(players[currentPlayer].mySocket, players[currentPlayer].printCall(getMaxBet()));
     }
     else if (state == 4)
     {
         currentPlayer    = -1;
         numActivePlayers = 0;
         Hand[] bestHands = new Hand[maxPlayers];
         for (int i = 0; i < maxPlayers; i++)
         {
             if (players[i] != null && !players[i].isFolded)
             {
                 bestHands[i]            = players[i].getBestHand(dealtCards);
                 players[i].status       = bestHands[i].print();
                 players[i].displayCards = true;
             }
         }
         int newLeftovers = 0;
         while (getPot() > 0)
         {
             Hand   bestHand  = null;
             bool[] isBest    = new bool[maxPlayers];
             int    bestCount = 0;
             for (int i = 0; i < maxPlayers; i++)
             {
                 if (bestHands[i] != null)
                 {
                     if (bestHand == null || bestHands[i].isBetter(bestHand) > 0)
                     {
                         bestHand  = bestHands[i];
                         isBest    = new bool[maxPlayers];
                         isBest[i] = true;
                         bestCount = 1;
                     }
                     else if (bestHands[i].isBetter(bestHand) == 0)
                     {
                         isBest[i] = true;
                         bestCount++;
                     }
                 }
             }
             int lowBet = int.MaxValue;
             for (int i = 0; i < maxPlayers; i++)
             {
                 if (isBest[i])
                 {
                     lowBet = Math.Min(lowBet, players[i].inPot);
                 }
             }
             int totalPot = leftoverPot;
             leftoverPot = 0;
             for (int i = 0; i < maxPlayers; i++)
             {
                 if (players[i] != null)
                 {
                     totalPot += players[i].payout(lowBet);
                 }
             }
             int finalPayout = totalPot / bestCount;
             for (int i = 0; i < maxPlayers; i++)
             {
                 if (isBest[i])
                 {
                     players[i].chips += finalPayout;
                     totalPot         -= finalPayout;
                     bestHands[i]      = null;
                 }
             }
             newLeftovers += totalPot;
         }
         leftoverPot = newLeftovers;
         BroadcastPublicInfo();
         SendPrivateInfo();
         state = 5;
         advanceState();
     }
     else if (state == 5)
     {
         currentPlayer = -1;
         state         = 0;
         Task.Factory.StartNew(() =>
         {
             Thread.Sleep(10000);
             advanceState();
         });
     }
 }