Example #1
0
 public venPlayer(Socket _client)
 {
     client   = _client;
     name     = "";
     id       = idcount;
     playing  = false;
     opponent = this; // Place holder
     guessed  = false;
     gPoint   = 0;
     roundW   = 0;
 }
Example #2
0
        private void Receive()
        {
            if (active)
            {
                bool connected = false;
                idcount++;

                venPlayer mainP = playerList[playerList.Count - 1];
                Socket    n     = playerList[playerList.Count - 1].client; //Last connection
                // Check if the connection should proceed

                try
                {
                    byte[] buffer1 = new byte[64];
                    int    rec     = n.Receive(buffer1); // Name received
                    if (rec <= 0)
                    {
                        throw new SocketException();
                    }
                    string newmessage = Encoding.Default.GetString(buffer1);
                    newmessage = newmessage.Substring(0, newmessage.IndexOf("\0"));

                    //check if the received buffer is a name,
                    //indicator is "//" at the beginning of string
                    if (newmessage.Substring(0, 2).Equals("//")) // Name sent correctly
                    {
                        bool exists = false;
                        newmessage = newmessage.Substring(2, newmessage.Length - 2);

                        /*foreach (string s in names)
                         * {
                         *  if (s.Equals(newmessage))
                         *  {
                         *      exists = true;
                         *      break;
                         *  }
                         * }*/
                        foreach (venPlayer p in playerList)
                        {
                            if (p.name.Equals(newmessage))
                            {
                                exists = true;
                                break;
                            }
                        }

                        if (exists) // Connection failed
                        {
                            byte[] buffer2 = Encoding.Default.GetBytes("The name " + newmessage + " has been taken! Connection rejected...");
                            n.Send(buffer2);
                            buffer2 = Encoding.Default.GetBytes("#0"); //Command to disconnect
                            n.Send(buffer2);
                            //reject the connection request with the name, remove the player from list
                            n.Close();

                            playerList.Remove(mainP);

                            //int index = playerList.FindIndex(n => x.Equals(pid));
                            //socketList.RemoveAt(index); // Socket has been removed from the list
                            //ids.RemoveAt(index);
                        }
                        else // Connection established
                        {
                            connected = true;

                            mainP.name = newmessage;
                            newmessage = newmessage + " has joined the game";



                            byte[] buffer2 = Encoding.Default.GetBytes(newmessage);
                            foreach (venPlayer p in playerList)
                            {
                                p.client.Send(buffer2);
                            }
                            buffer2 = Encoding.Default.GetBytes("#1"); //Command to confirm connection

                            n.Send(buffer2);



                            msgList.Invoke(new MethodInvoker(delegate
                            {
                                msgList.Items.Add(newmessage);
                            }));
                        }
                    }
                    else
                    {
                        MessageBox.Show("Error: Name wasn't received from the client!");
                    }
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.ToString());
                    MessageBox.Show("Error: Connection process failed!");
                    connected = false;
                }
                // MessageBox.Show("Good! Server"); // For debugging
                ///////////////////////// Connection Established ///////////////////////


                while (connected)
                {
                    try
                    {
                        byte[] buffer = new byte[64];
                        int    rec    = n.Receive(buffer);
                        if (rec <= 0)
                        {
                            throw new SocketException();
                        }
                        string newmessage = Encoding.Default.GetString(buffer);
                        newmessage = newmessage.Substring(0, newmessage.IndexOf("\0"));

                        //Check for the input from client


                        if (newmessage.Equals("#list")) //we need to display the names of all players
                        {
                            try
                            {
                                buffer = Encoding.Default.GetBytes("Player List:");
                                n.Send(buffer);
                                foreach (venPlayer p in playerList)
                                {
                                    buffer = Encoding.Default.GetBytes(p.name + " " + p.gPoint + "    ");
                                    n.Send(buffer);
                                }
                            }
                            catch (Exception ex)
                            {
                                MessageBox.Show(ex.ToString());
                                MessageBox.Show("Error sending the player list.");
                            }
                        }
                        else if (newmessage.Equals("#dc"))
                        {
                            buffer = Encoding.Default.GetBytes("#dc");
                            mainP.client.Send(buffer);

                            mainP.client.Close();

                            string leftP = mainP.name; //Name of the player that is removed
                            playerList.Remove(mainP);



                            connected = false;
                            byte[] buffer2 = Encoding.Default.GetBytes(leftP + " has left the game.");
                            foreach (venPlayer p in playerList)
                            {
                                p.client.Send(buffer2);
                            }

                            msgList.Invoke(new MethodInvoker(delegate
                            {
                                msgList.Items.Add(leftP + " has left the game.");
                            }));
                        }
                        else if (newmessage.Length > 4 && newmessage.Substring(0, 4).Equals("#inv")) // A player wants to invate someone
                        {
                            if (mainP.playing)
                            {
                                MessageBox.Show("Error: A player who is already playing can not invate.");
                            }



                            //Check if the player exits
                            newmessage = newmessage.Substring(5); // Name of the invited player
                            if (newmessage.Equals(mainP.name))
                            {
                                buffer = Encoding.Default.GetBytes("#rejected"); //Invintation request rejected
                                mainP.client.Send(buffer);

                                byte[] buffer2 = Encoding.Default.GetBytes("You can't invite yourself to a game!");
                                mainP.client.Send(buffer2);
                            }
                            else
                            {
                                bool exists = false;


                                int invIndex = -1; // Index of the invited player

                                for (int i = 0; i < playerList.Count; i++)
                                {
                                    if (playerList[i].name.Equals(newmessage))
                                    {
                                        exists   = true;
                                        invIndex = i; //Find the index of the player
                                        break;
                                    }
                                }

                                if (!exists) //Player doesn't exist
                                {
                                    mainP.playing = false;
                                    buffer        = Encoding.Default.GetBytes("#rejected"); //Invintation request rejected
                                    mainP.client.Send(buffer);

                                    byte[] buffer2 = Encoding.Default.GetBytes("Player " + newmessage + " doesn't exist!");
                                    mainP.client.Send(buffer2);
                                }
                                else // Player exists, check if player is playing
                                {
                                    bool plays = playerList[invIndex].playing;
                                    if (plays) // Player is already playing, reject
                                    {
                                        mainP.playing = false;
                                        buffer        = Encoding.Default.GetBytes("#rejected"); //Invintation request rejected
                                        mainP.client.Send(buffer);

                                        byte[] buffer2 = Encoding.Default.GetBytes(newmessage + " is already in a game!");
                                        mainP.client.Send(buffer2);
                                    }
                                    else // Player is free to play
                                    {
                                        mainP.opponent          = playerList[invIndex];
                                        mainP.opponent.playing  = true;
                                        mainP.opponent.opponent = mainP;
                                        mainP.opponent.roundW   = 0;
                                        mainP.roundW            = 0;
                                        mainP.playing           = true;


                                        buffer = Encoding.Default.GetBytes("Waiting for " + mainP.opponent.name + " to respond...");
                                        mainP.client.Send(buffer);

                                        byte[] buffer2 = Encoding.Default.GetBytes("#req " + mainP.name); // Send the player an invintation
                                        mainP.opponent.client.Send(buffer2);
                                    }
                                }
                            }
                        }
                        else if (newmessage.Length > 7 && newmessage.Substring(0, 7).Equals("#accept"))
                        {
                            try
                            {
                                newmessage = newmessage.Substring(8);  // Name of the challenger

                                if (newmessage != mainP.opponent.name) // For debug
                                {
                                    MessageBox.Show("Error: Wrong player accepted invate.");
                                }



                                buffer = Encoding.Default.GetBytes("#accepted " + mainP.name);
                                mainP.opponent.client.Send(buffer);

                                newmessage = newmessage + " started a game with " + mainP.name + "!";

                                byte[] buffer3 = Encoding.Default.GetBytes(newmessage);
                                foreach (venPlayer p in playerList) //Declare the game between two players
                                {
                                    p.client.Send(buffer3);
                                }

                                msgList.Invoke(new MethodInvoker(delegate
                                {
                                    msgList.Items.Add(newmessage);
                                }));

                                ////////////// Step 3 /////////////////////////////////////////////////////////////////////7
                                Random rnd      = new Random();
                                int    secretno = rnd.Next(1, 100);
                                mainP.secret          = secretno;
                                mainP.opponent.secret = secretno;

                                msgList.Invoke(new MethodInvoker(delegate
                                {
                                    msgList.Items.Add("Secret number: " + secretno);
                                }));
                            }
                            catch (Exception ex)
                            {
                                MessageBox.Show(ex.ToString());
                                MessageBox.Show("Error: Server didn't handle #accept properly");
                            }
                        }
                        else if (newmessage.Length > 8 && newmessage.Substring(0, 8).Equals("#decline"))
                        {
                            try
                            {
                                newmessage = newmessage.Substring(9);
                                if (newmessage != mainP.opponent.name) // For debug
                                {
                                    MessageBox.Show("Error: Wrong player declined invate.");
                                }

                                byte[] buffer2 = Encoding.Default.GetBytes(mainP.name + " has declined your invitation!");
                                mainP.opponent.client.Send(buffer2);

                                buffer = Encoding.Default.GetBytes("#declined");
                                mainP.client.Send(buffer);
                                mainP.opponent.client.Send(buffer);

                                mainP.opponent.playing = false;
                                mainP.playing          = false;
                            }
                            catch (Exception ex)
                            {
                                MessageBox.Show(ex.ToString());
                                MessageBox.Show("Error: Server didn't handle #decline properly");
                            }
                        }
                        else if (newmessage.Length > 7 && newmessage.Substring(0, 4).Equals("#sur"))
                        {
                            newmessage = newmessage.Substring(5);
                            if (!newmessage.Equals(mainP.opponent.name))
                            {
                                MessageBox.Show("Error: Names don't match after surrender");
                            }


                            buffer = Encoding.Default.GetBytes("#win");
                            mainP.opponent.client.Send(buffer);

                            newmessage = mainP.opponent.name + " has won againts " + mainP.name + "!";
                            mainP.opponent.gPoint++;


                            byte[] buffer2 = Encoding.Default.GetBytes(newmessage);
                            foreach (venPlayer p in playerList)
                            {
                                p.client.Send(buffer2);
                            }


                            msgList.Invoke(new MethodInvoker(delegate
                            {
                                msgList.Items.Add(newmessage);
                            }));

                            mainP.playing          = false;
                            mainP.opponent.playing = false;
                            mainP.roundW           = 0;
                            mainP.opponent.roundW  = 0;
                        }
                        else if (newmessage.Length > 3 && newmessage.Substring(0, 3).Equals("#gs")) //Number guess
                        {
                            mainP.guessed = true;
                            mainP.guessno = Int32.Parse(newmessage.Substring(4)); // Convert str to int
                            if (mainP.opponent.guessed)
                            {
                                mainP.guessed          = false;
                                mainP.opponent.guessed = false;

                                int mScore = Math.Abs(mainP.guessno - mainP.secret);
                                int oScore = Math.Abs(mainP.opponent.guessno - mainP.secret);

                                if (mScore > oScore) // Opponent wins
                                {
                                    mainP.opponent.roundW++;


                                    byte[] buffer5 = new byte[64];
                                    buffer5 = Encoding.Default.GetBytes("#lr"); // Lost round
                                    mainP.client.Send(buffer5);
                                    buffer5 = Encoding.Default.GetBytes("Score: You " + mainP.roundW + " - " + mainP.opponent.roundW + " " + mainP.opponent.name);
                                    mainP.client.Send(buffer5);

                                    buffer5 = Encoding.Default.GetBytes("#wr"); // Won round
                                    mainP.opponent.client.Send(buffer5);
                                    buffer5 = Encoding.Default.GetBytes("Score: You " + mainP.opponent.roundW + " - " + mainP.roundW + " " + mainP.name);
                                    mainP.opponent.client.Send(buffer5);
                                }
                                else if (oScore > mScore) // mainP wins
                                {
                                    mainP.roundW++;

                                    byte[] buffer5 = new byte[64];
                                    buffer5 = Encoding.Default.GetBytes("#lr"); // Lost round
                                    mainP.opponent.client.Send(buffer5);
                                    buffer5 = Encoding.Default.GetBytes("Score: You " + mainP.opponent.roundW + " - " + mainP.roundW + " " + mainP.name);
                                    mainP.opponent.client.Send(buffer5);

                                    buffer5 = Encoding.Default.GetBytes("#wr"); // Won round
                                    mainP.client.Send(buffer5);
                                    buffer5 = Encoding.Default.GetBytes("Score: You " + mainP.roundW + " - " + mainP.opponent.roundW + " " + mainP.opponent.name);
                                    mainP.client.Send(buffer5);
                                }
                                else // Draw
                                {
                                    byte[] buffer5 = new byte[64];
                                    buffer5 = Encoding.Default.GetBytes("#wr"); // Won round
                                    mainP.client.Send(buffer5);
                                    mainP.opponent.client.Send(buffer5);
                                    string dmsg = "Draw: Both guesses are equally close! Play again...";
                                    buffer5 = Encoding.Default.GetBytes(dmsg);
                                    mainP.client.Send(buffer5);
                                    mainP.opponent.client.Send(buffer5);
                                }

                                if (mainP.roundW == 2 || mainP.opponent.roundW == 2) // Check if game is over
                                {
                                }
                                else // Pick a new number
                                {
                                    Random rnd      = new Random();
                                    int    secretno = rnd.Next(1, 100);
                                    mainP.secret          = secretno;
                                    mainP.opponent.secret = secretno;

                                    msgList.Invoke(new MethodInvoker(delegate
                                    {
                                        msgList.Items.Add("Secret number: " + secretno);
                                    }));
                                }
                            }
                            else
                            {
                                byte[] buffer5 = new byte[64];
                                buffer5 = Encoding.Default.GetBytes("Waiting for other player to make his/her guess...");
                                mainP.client.Send(buffer5);
                            }
                        }
                        else // Message received
                        {
                            newmessage = mainP.name + ": " + newmessage;
                            buffer     = Encoding.Default.GetBytes(newmessage);

                            byte[] buffer2 = Encoding.Default.GetBytes(newmessage);
                            foreach (venPlayer p in playerList)
                            {
                                p.client.Send(buffer2);
                            }
                            msgList.Invoke(new MethodInvoker(delegate
                            {
                                msgList.Items.Add(newmessage);
                            }));
                        }
                    }
                    catch //(Exception ex)
                    {
                        //MessageBox.Show(ex.ToString()); //Only when debugging
                        connected = false;
                    }
                }
                //msgList.Invoke(new MethodInvoker(delegate
                //{
                //msgList.Items.Add("Connection ended");
                //}));
            }
        }