使用C#,任务和障碍模拟音乐椅子游戏

时间:2018-11-24 13:11:25

标签: c# locking task barrier

这是我在Stack世界中的第一个问题,因此可能有点含糊,但我在其他任何地方都找不到答案。

我正在尝试模拟音乐椅子游戏,其中有许多演奏者,许多椅子是演奏者1。音乐开始播放,播放器在椅子上转一圈,当音乐停止播放时,播放器开始坐下,剩下的一个仍然丢失,循环再次开始,直到有一把椅子,两个播放器和一个坐下的获胜。

代码如下:

private static readonly Random random = new Random();
        private static readonly object syncLock = new object();
        public static int RandomNumber(int[] auxArray)
        {
            int[] posicionesLibres = auxArray.Select((z, j) => j).Where(i => auxArray[i] == 0).OrderBy(x => Guid.NewGuid()).ToArray();
            lock (syncLock)
            {
                int auxRandom = posicionesLibres[0];
                return auxRandom;
            }
        }
        static void Main(string[] args)
        {
            Console.WriteLine("Bienvenido al Gran Juego de la Silla!");
            Console.WriteLine("Ingrese la cantidad de jugadores que van a participar: ");
            try
            {
                int cantidadJugadores = Convert.ToInt32(Console.ReadLine());

                int cantidadSillas = cantidadJugadores - 1;
                int[] sillas = new int[cantidadSillas];
                Task[] tasks = new Task[cantidadJugadores];
                Barrier barrier = new Barrier(cantidadJugadores);
                int tiempoMusica;
                int corteMusica = 0;

                Action<object> actionJugadores = (object identificador) =>
                {
                    int bandera = 0;
                    int banderaSentado = 0;

                    while (true)
                    {
                        if (bandera == 0)
                        {
                            Console.WriteLine("El Jugador {0} esta listo para jugar.", identificador);
                            bandera = 1;
                            barrier.SignalAndWait();
                        }
                        else
                        {
                            if(corteMusica == 1)
                            {
                                while (corteMusica == 1)
                                {
                                    while (banderaSentado == 0)
                                    {
                                        int posicionSilla = RandomNumber(sillas);
                                        if (Array.Exists(sillas, element => element == 0))
                                        {
                                            if (sillas[posicionSilla] == 0)
                                            {
                                                lock (sillas)
                                                {
                                                    if (sillas[posicionSilla] == 0)
                                                    {
                                                        sillas[posicionSilla] = 1;
                                                        Console.WriteLine("Me sente en la silla {0}", posicionSilla);
                                                        banderaSentado = 1;
                                                    }
                                                }
                                            }

                                        }
                                        else
                                        {
                                            banderaSentado = 1;
                                        }
                                    }
                                }
                                banderaSentado = 0;
                                barrier.SignalAndWait();
                            }  
                        }
                    }

                };

                for (int i = 0; i < cantidadJugadores; i++)
                {
                    tasks[i] = Task.Factory.StartNew(actionJugadores, (i + 1));
                }

                while (tasks.Length > 1)
                {
                    tiempoMusica = new Random().Next(3, 10);
                    Thread.Sleep(tiempoMusica * 1000);
                    Console.WriteLine("La Musica se detuvo a los {0} segundos.", tiempoMusica);
                    corteMusica = 1;
                    while(Array.Exists(sillas, element => element == 0))
                    {
                        //Espero
                    }
                    corteMusica = 0;
                    cantidadJugadores--;
                    cantidadSillas--;
                    sillas = new int[cantidadSillas];
                    barrier.RemoveParticipant();
                    //Matar al looser
                }
            }
            catch (AggregateException ae)
            {
                foreach(var ex in ae.InnerExceptions)
                    Console.WriteLine(ex.Message);
            }
            Console.ReadLine();
        }
}

最重要的问题是,在第二轮等比赛中,我让已经输掉比赛的玩家或者同一位玩家坐了两次;除了一些随机溢出问题。

帮助?

0 个答案:

没有答案