Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- using System;
- using System.Text;
- using System.Text.RegularExpressions;
- class Snake
- {
- public struct PositionInCube
- {
- public short currTable, currRow, currCol;
- public PositionInCube(short cT, short cR, short cC)
- {
- currTable = cT;
- currRow = cR;
- currCol = cC;
- }
- };
- public static string ExtractCubeLayers(ref string cubeField)
- {
- StringBuilder sb = new StringBuilder();
- foreach (char c in cubeField)
- if (c == 'o' || c == 's' || c == 'a')
- sb.Append(c);
- return sb.ToString();
- }
- public static void ExtractCommand(ref string currCommand)
- {
- switch (currCommand[0])
- {
- case 'u': currCommand = "up"; break;
- case 'd': currCommand = "down"; break;
- case 'f': currCommand = "forward"; break;
- case 'b': currCommand = "backward"; break;
- case 'l': currCommand = "left"; break;
- case 'r': currCommand = "right"; break;
- default: currCommand = "end"; break;
- }
- }
- public static void HandleSnakeMovement(short cubeSize, ref PositionInCube snakePos, ref bool snakeStatus, string currCommand)
- {
- bool snakeIsDead = false;
- if (currCommand == "up")
- {
- if (snakePos.currTable == 0) snakeStatus = snakeIsDead;
- else snakePos.currTable--;
- }
- else if (currCommand == "down")
- {
- if (snakePos.currTable == cubeSize - 1) snakeStatus = snakeIsDead;
- else snakePos.currTable++;
- }
- else if (currCommand == "forward")
- {
- if (snakePos.currRow == 0) snakeStatus = snakeIsDead;
- else snakePos.currRow--;
- }
- else if (currCommand == "backward")
- {
- if (snakePos.currRow == cubeSize - 1) snakeStatus = snakeIsDead;
- else snakePos.currRow++;
- }
- else if (currCommand == "left")
- {
- if (snakePos.currCol == 0) snakeStatus = snakeIsDead;
- else snakePos.currCol--;
- }
- else
- {
- if (snakePos.currCol == cubeSize - 1) snakeStatus = snakeIsDead;
- else snakePos.currCol++;
- }
- }
- static void Main()
- {
- byte cubeSize = byte.Parse(Console.ReadLine());
- char[][,] cube = new char[cubeSize][,];
- for (short layer = 0; layer < cube.Length; ++layer)
- cube[layer] = new char[cubeSize, cubeSize];
- PositionInCube snakePos = new PositionInCube(0, 0, 0);
- short c, row = -1;
- bool snakeIsAlive = true;
- for (byte fields = 0; fields < cubeSize; ++fields)
- {
- string cubeField = Console.ReadLine();
- cubeField = ExtractCubeLayers(ref cubeField);
- c = 0;
- row++;
- for (byte table = 0; table < cubeSize; ++table)
- for (byte col = 0; col < cubeSize; ++col, ++c)
- {
- cube[row][table, col] = cubeField[c];
- if (cubeField[c] == 's')
- {
- snakePos.currTable = table;
- snakePos.currRow = row;
- snakePos.currCol = col;
- }
- }
- }
- short applesEatenBySnake = 0;
- string prevCommand, currCommand = "";
- prevCommand = Console.ReadLine();
- while (snakeIsAlive)
- {
- currCommand = Console.ReadLine();
- short steps = short.Parse(Regex.Match(currCommand, @"\d+").Value);
- ExtractCommand(ref currCommand);
- for (short repeatCommand = 0; repeatCommand < steps; ++repeatCommand)
- {
- HandleSnakeMovement(cubeSize, ref snakePos, ref snakeIsAlive, prevCommand);
- if (cube[snakePos.currRow][snakePos.currTable, snakePos.currCol] == 'a')
- {
- cube[snakePos.currRow][snakePos.currTable, snakePos.currCol] = ' ';
- applesEatenBySnake++;
- }
- }
- if (currCommand == "end") break;
- prevCommand = currCommand;
- }
- Console.WriteLine("Points collected: {0}", applesEatenBySnake);
- if (!snakeIsAlive) Console.WriteLine("The snake dies.");
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement