From d902b3ba29963c99bed98a1cc710c5f80bd610be Mon Sep 17 00:00:00 2001 From: Jeff Lewis Date: Sun, 28 Feb 2021 19:00:55 -0700 Subject: [PATCH] Port Amazing to C# from Java version --- 02 Amazing/csharp/Amazing.cs | 320 +++++++++++++++++++++++++++++++++++ 1 file changed, 320 insertions(+) create mode 100644 02 Amazing/csharp/Amazing.cs diff --git a/02 Amazing/csharp/Amazing.cs b/02 Amazing/csharp/Amazing.cs new file mode 100644 index 00000000..f62549d4 --- /dev/null +++ b/02 Amazing/csharp/Amazing.cs @@ -0,0 +1,320 @@ +using System; +using System.Collections.Generic; + +namespace Amazing +{ + class AmazingGame + { + private const int FIRST_COL = 0; + private const int FIRST_ROW = 0; + private const int EXIT_UNSET = 0; + private const int EXIT_DOWN = 1; + private const int EXIT_RIGHT = 2; + + private static int GetDelimitedValue(String text, int pos) + { + String[] tokens = text.Split(","); + + int val; + if (Int32.TryParse(tokens[pos], out val)) + { + return val; + } + return 0; + } + + private static String Tab(int spaces) + { + return new String(' ', spaces); + } + + public static int Random(int min, int max) + { + Random random = new Random(); + return random.Next(max - min) + min; + } + + public void Play() + { + Console.WriteLine(Tab(28) + "AMAZING PROGRAM"); + Console.WriteLine(Tab(15) + "CREATIVE COMPUTING MORRISTOWN, NEW JERSEY"); + Console.WriteLine(); + + int width = 0; + int length = 0; + + do + { + String range = DisplayTextAndGetInput("WHAT ARE YOUR WIDTH AND LENGTH"); + if (range.IndexOf(",") > 0) + { + width = GetDelimitedValue(range, 0); + length = GetDelimitedValue(range, 1); + } + } + while (width < 1 || length < 1); + + Grid grid = new Grid(length, width); + int enterCol = grid.SetupEntrance(); + + int totalWalls = width * length + 1; + int count = 2; + Cell cell = grid.StartingCell(); + + while (count != totalWalls) + { + List possibleDirs = GetPossibleDirs(grid, cell); + + if (possibleDirs.Count != 0) + { + cell = SetCellExit(grid, cell, possibleDirs); + cell.Count = count++; + } + else + { + cell = grid.GetFirstUnset(cell); + } + } + grid.SetupExit(); + + WriteMaze(width, grid, enterCol); + } + + private Cell SetCellExit(Grid grid, Cell cell, List possibleDirs) + { + Direction direction = possibleDirs[Random(0, possibleDirs.Count)]; + if (direction == Direction.GO_LEFT) + { + cell = grid.GetPrevCol(cell); + cell.ExitType = EXIT_RIGHT; + } + else if (direction == Direction.GO_UP) + { + cell = grid.GetPrevRow(cell); + cell.ExitType = EXIT_DOWN; + } + else if (direction == Direction.GO_RIGHT) + { + cell.ExitType = cell.ExitType + EXIT_RIGHT; + cell = grid.GetNextCol(cell); + } + else if (direction == Direction.GO_DOWN) + { + cell.ExitType = cell.ExitType + EXIT_DOWN; + cell = grid.GetNextRow(cell); + } + return cell; + } + + private void WriteMaze(int width, Grid grid, int enterCol) + { + // top line + for (int i = 0; i < width; i++) + { + if (i == enterCol) Console.Write(". "); + else Console.Write(".--"); + } + Console.WriteLine("."); + + for (int i = 0; i < grid.Length; i++) + { + Console.Write("I"); + for (int j = 0; j < grid.Width; j++) + { + if (grid.Cells[i,j].ExitType == EXIT_UNSET || grid.Cells[i, j].ExitType == EXIT_DOWN) + Console.Write(" I"); + else Console.Write(" "); + } + Console.WriteLine(); + for (int j = 0; j < grid.Width; j++) + { + if (grid.Cells[i,j].ExitType == EXIT_UNSET || grid.Cells[i, j].ExitType == EXIT_RIGHT) + Console.Write(":--"); + else Console.Write(": "); + } + Console.WriteLine("."); + } + } + + private List GetPossibleDirs(Grid grid, Cell cell) + { + var possibleDirs = new List(); + foreach (var val in Enum.GetValues(typeof(Direction))) + { + possibleDirs.Add((Direction)val); + } + + if (cell.Col == FIRST_COL || grid.IsPrevColSet(cell)) + { + possibleDirs.Remove(Direction.GO_LEFT); + } + if (cell.Row == FIRST_ROW || grid.IsPrevRowSet(cell)) + { + possibleDirs.Remove(Direction.GO_UP); + } + if (cell.Col == grid.LastCol || grid.IsNextColSet(cell)) + { + possibleDirs.Remove(Direction.GO_RIGHT); + } + if (cell.Row == grid.LastRow || grid.IsNextRowSet(cell)) + { + possibleDirs.Remove(Direction.GO_DOWN); + } + return possibleDirs; + } + + private String DisplayTextAndGetInput(String text) + { + Console.Write(text); + return Console.ReadLine(); + } + + + private enum Direction + { + GO_LEFT, + GO_UP, + GO_RIGHT, + GO_DOWN, + } + + public class Cell + { + public int ExitType { get; set; } + public int Count { get; set; } + + public int Col { get; set; } + public int Row { get; set; } + + public Cell(int row, int col) + { + ExitType = EXIT_UNSET; + Row = row; + Col = col; + } + } + + + public class Grid + { + public Cell[,] Cells { get; private set; } + + public int LastCol { get; set; } + public int LastRow { get; set; } + + public int Width { get; private set; } + public int Length { get; private set; } + + private int enterCol; + + public Grid(int length, int width) + { + LastCol = width - 1; + LastRow = length - 1; + Width = width; + Length = length; + + Cells = new Cell[length,width]; + for (int i = 0; i < length; i++) + { + for (int j = 0; j < width; j++) + { + this.Cells[i,j] = new Cell(i, j); + } + } + } + + public int SetupEntrance() + { + this.enterCol = Random(0, Width); + Cells[0, enterCol].Count = 1; + return this.enterCol; + } + + public void SetupExit() + { + int exit = Random(0, Width - 1); + Cells[LastRow, exit].ExitType += 1; + } + + public Cell StartingCell() + { + return Cells[0, enterCol]; + } + + public bool IsPrevColSet(Cell cell) + { + return 0 != Cells[cell.Row, cell.Col - 1].Count; + } + + public bool IsPrevRowSet(Cell cell) + { + return 0 != Cells[cell.Row - 1, cell.Col].Count; + } + + public bool IsNextColSet(Cell cell) + { + return 0 != Cells[cell.Row, cell.Col + 1].Count; + } + + public bool IsNextRowSet(Cell cell) + { + return 0 != Cells[cell.Row + 1, cell.Col].Count; + } + + public Cell GetPrevCol(Cell cell) + { + return Cells[cell.Row, cell.Col - 1]; + } + + public Cell GetPrevRow(Cell cell) + { + return Cells[cell.Row - 1, cell.Col]; + } + + public Cell GetNextCol(Cell cell) + { + return Cells[cell.Row, cell.Col + 1]; + } + + public Cell GetNextRow(Cell cell) + { + return Cells[cell.Row + 1, cell.Col]; + } + + public Cell GetFirstUnset(Cell cell) + { + int col = cell.Col; + int row = cell.Row; + Cell newCell; + do + { + if (col != this.LastCol) + { + col++; + } + else if (row != this.LastRow) + { + row++; + col = 0; + } + else + { + row = 0; + col = 0; + } + } + while ((newCell = Cells[row, col]).Count == 0); + return newCell; + } + } + } + + class Program + { + static void Main(string[] args) + { + new AmazingGame().Play(); + } + } +}