private IEnumerable <SingleGameMove> SingleMoveOptions(int diceRoll, GameColor player) { if (this.EatenDisksExist(player)) { int destinationColumnIndex = player.RelativeColumnIndex(diceRoll); var destinationColumn = this[destinationColumnIndex]; if (destinationColumn.Color == player || destinationColumn.IsEmpty) { yield return(new RemoveEatenDisk(destinationColumnIndex)); } else if (destinationColumn.NumOfDisks == 1) { yield return(new RemoveEatenDiskEats(destinationColumnIndex)); } } else { bool canAquit = true; for (int columnIndex = 0; columnIndex <= 23 - diceRoll; columnIndex++) { int sourceColumnIndex = player.RelativeColumnIndex(columnIndex); var sourceColumn = this[sourceColumnIndex]; if (sourceColumn.NumOfDisks > 0 && sourceColumn.Color == player) { canAquit = false; int destinationColumnIndex = player.RelativeColumnIndex(columnIndex + diceRoll); var destinationColumn = this[destinationColumnIndex]; if (destinationColumn.IsEmpty || destinationColumn.Color == player) { yield return(new RegularMove(sourceColumnIndex, destinationColumnIndex)); } else if (destinationColumn.NumOfDisks == 1) { yield return(new EatDisk(sourceColumnIndex, destinationColumnIndex)); } } } if (canAquit) { int columnIndex = 24 - diceRoll; while (true) { int relativeColumn = player.RelativeColumnIndex(columnIndex); var column = this[relativeColumn]; if (column.NumOfDisks > 0 && column.Color == player) { yield return(new AcquitDisk(relativeColumn)); break; } columnIndex++; } } } }