public abstract class PatternPrinter
private int patternLength;
public PatternPrinter(int patternLength)
this.patternLength = patternLength;
Random rnd = new Random();
int specialIndex = rnd.Next(patternLength);
for (int i=0;i<patternLength;i++)
if (roll == 0) PrintNormal();
public abstract void PrintNormal();
public abstract void PrintVariant();
public abstract void PrintSpecial();
public class RiverPattern : PatternPrinter
public RiverPattern(int i) : base(i) {
public override void PrintNormal()
Console.WriteLine("***O O***");
Console.WriteLine("***O O***");
Console.WriteLine("***O O***");
Console.WriteLine("***O O***");
public override void PrintVariant()
Console.WriteLine("**O O****");
Console.WriteLine("*O O*****");
Console.WriteLine("**O O****");
Console.WriteLine("***O O***");
public override void PrintSpecial()
Console.WriteLine("**O O***");
Console.WriteLine("*O O**");
Console.WriteLine("*O OO O*");
Console.WriteLine("*O O O*");
Console.WriteLine("**O O**");
public static void Main()
RiverPattern river = new RiverPattern(10);