private void ProcesarJugada(Jugador jugador, Ficha ficha, bool insertarEnExtremoIzq = false) { if (insertarEnExtremoIzq) { if (Fichas.First().Valor.A == ficha.Valor.A) ficha.Voltear(); Fichas.Insert(0, ficha); } else { if (Fichas.Last().Valor.B == ficha.Valor.B) ficha.Voltear(); Fichas.Add(ficha); } _numeroPases = 0; jugador.Fichas.Remove(ficha); ManejarSiguienteTurno(jugador.Fichas.Count == 0); }
public void PasarTurno(Jugador jugador) { if (_turnoActual == -1) throw new Exception("El partido ha terminado"); //TODO: Deberiamos usar excepciones personalziadas? if (jugador != Jugadores[_turnoActual]) return; //TODO: Esto debería tirar otra excepcion? if (jugador.Fichas.Any(ficha => Fichas.First().PuedeJugarA(ficha) || Fichas.Last().PuedeJugarB(ficha))) { throw new Excepciones.JugadorNoPuedePasarConFichasException(); } _numeroPases++; ManejarSiguienteTurno(_numeroPases == 4); }
private void GenerarFichasAleatorias() { //Se crean todas las fichas posibles var fichasPosibles = new List<Ficha>(); for (var i = 0; i < 7; i++) { for (var j = i; j < 7; j++) { fichasPosibles.Add(new Ficha(i, j)); } } //Se organizan las fichas aleatoriamente //Aqui estoy usando linq, pero se puede usar este algoritmo tambien: http://en.wikipedia.org/wiki/Fisher%E2%80%93Yates_shuffle fichasPosibles = fichasPosibles.OrderBy(a => Guid.NewGuid()).ToList(); for (var i = 0; i < 4; i++) { var equipo = i % 2 == 0 ? 0 : 1; var jugador = new Jugador { Equipo = (Frentes)equipo }; for (var j = 0; j < 7; j++) { jugador.Fichas.Add(fichasPosibles[i * 7 + j]); } Jugadores.Add(jugador); } }
public void JugarFicha(Jugador jugador, Ficha ficha, int? ladoPreferido = null) { if (_turnoActual == -1) throw new Exception("El partido ha terminado"); if (jugador != Jugadores[_turnoActual]) throw new Excepciones.JugadorIntentoJugarEnTurnoErroneoException(); if (!jugador.PoseeFicha(ficha)) throw new Excepciones.JugadorIntentoJugarFichaQueNoPoseeException(); if (Fichas.Count == 0) { //Quiere decir que nunca se ha jugado if (_cantidadPartidasJugadas == 0 && !ficha.Equals(new Ficha(6, 6))) throw new Excepciones.JuegoNoComenzoConDobleSeisException(); Fichas.Add(ficha); jugador.Fichas.Remove(ficha); ManejarSiguienteTurno(); } else { if (Fichas.Any(f => f.Valor.Equals(ficha.Valor))) { throw new FichaRepetidaException(); } //Se revisa si el jugador tiene intencion de un lado especifico if (ladoPreferido.HasValue) { if (ficha.Valor.A == ExtremoIzq && ficha.Valor.B == ExtremoDer || ficha.Valor.B == ExtremoIzq && ficha.Valor.A == ExtremoDer) { ProcesarJugada(jugador, ficha, ladoPreferido == ExtremoDer); return; } } //De lo contrario se intenta colocar la ficha en el tablero, comenzando por el lado izquierdo if (Fichas.First().PuedeJugarA(ficha)) { ProcesarJugada(jugador, ficha, true); } else if (Fichas.Last().PuedeJugarB(ficha)) { ProcesarJugada(jugador, ficha); } else { throw new JugadaInvalidaException(); } } }