这是我在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();
}
}
最重要的问题是,在第二轮等比赛中,我让已经输掉比赛的玩家或者同一位玩家坐了两次;除了一些随机溢出问题。
帮助?