본문 바로가기
프로그래밍 이야기/GameDev

C# 코딩 연습 - 배열기반 달리기 게임

by Mulder5 2020. 11. 11.
반응형

이번에는 배열 기반으로 달리기 게임 코딩

const int MAP_X = 7;
const int MAP_Y = 22;
const int DELAY_TIME = 300;

static void UpdateView(char[] _tile, int[,] _map)
{
     for (int i = 0; i < MAP_X; i++)
     {
         for (int j = 0; j < MAP_Y; j++)
         {
             int tileIndex = _map[i, j];
             Console.Write(_tile[tileIndex]);

             if (j == MAP_Y - 1)
                 Console.WriteLine();

         }
     }
 }

 static void ClearView()
 {
     Thread.Sleep(DELAY_TIME);
     Console.Clear();
 }

 static void UpdateGo(int[] _arrIndexX, int[,] _map)
 {
     // 주자의 달리기. 한칸씩 진행.
     for (int i = 0; i < 5; i++)
     {
         int indexMapX = i + 1;
         int indexMapY = _arrIndexX[i];
         // 주자의 진행 출력 앞 뒤 값을 스왑
         int temp = _map[indexMapX, indexMapY];
         _map[indexMapX, indexMapY + 1] = temp;
         _map[indexMapX, indexMapY] = 0;

         // 진행된 주자 표시
         _arrIndexX[i]++;
     }

 }

 static bool UpdateRandomGo(int[] _arrIndexX, int[,] _map, Random _rnd)
 {
     bool isFinish = false;
      for (int i = 0; i < _arrIndexX.Length; i++)
      {
          if (_arrIndexX[i] >= 19)
          {
              isFinish = true;
              break;
          }
      }


      int rndIndex = _rnd.Next(0, 5); // 0~4
      int indexY = _arrIndexX[rndIndex];


      // 주자의 진행 출력 앞 뒤 값을 스왑
      int temp = _map[rndIndex + 1, indexY];
      _map[rndIndex + 1, indexY + 1] = temp;
      _map[rndIndex + 1, indexY] = 0;

      _arrIndexX[rndIndex]++;

      return isFinish;
  }

  static void Main(string[] args)
  {
      Random rnd = new Random();

      //               0    1    2    3    4    5    6    7
      char[] tile = { ' ', '-', '|', '1', '2', '3', '4', '5' };

      int[,] map = new int[MAP_X, MAP_Y]
      {
        // 0  1  2  3  4  5  6  7  8  9  10  11  12  13  14  15  16  17  18  19  20  21
          {1, 1, 1, 1, 1, 1, 1, 1, 1, 1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1}, //0
          {3, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  2,  0}, //1
          {4, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  2,  0}, //2
          {5, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  2,  0}, //3
          {6, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  2,  0}, //4
          {7, 0, 0, 0, 0, 0, 0, 0, 0, 0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  2,  0}, //5
          {1, 1, 1, 1, 1, 1, 1, 1, 1, 1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1}  //6
      };

      // 주자의 위치 저장용 배열
      int[] arrIndexX = { 0, 0, 0, 0, 0 };
      bool isFinish = false;

      while(true)
      {
          if (isFinish)
          {
              Console.WriteLine();
              for (int i = 0; i < arrIndexX.Length; i++)
              {
                  if(arrIndexX[i] >= 19)
                  {
                      Console.Write("달리기 결과 1등: {0}", (i+1));
                      break;
                  }
              }
              Console.Write("\n 다시 시작하려면 0을 입력");
              string inputString = Console.ReadLine();
              if(inputString == "0")
              {
                  map[1, arrIndexX[0]] = 0;
                  map[2, arrIndexX[1]] = 0;
                  map[3, arrIndexX[2]] = 0;
                  map[4, arrIndexX[3]] = 0;
                  map[5, arrIndexX[4]] = 0;

                  arrIndexX[0] = 0;
                  arrIndexX[1] = 0;
                  arrIndexX[2] = 0;
                  arrIndexX[3] = 0;
                  arrIndexX[4] = 0;

                  map[1, 20] = 2;
                  map[2, 20] = 2;
                  map[3, 20] = 2;
                  map[4, 20] = 2;
                  map[5, 20] = 2;

                  map[1, 0] = 3;
                  map[2, 0] = 4;
                  map[3, 0] = 5;
                  map[4, 0] = 6;
                  map[5, 0] = 7;

              }
              else
              {
                  Console.Write("\n 나가기");
                  break;
              }
             
          }
              
          UpdateGo(arrIndexX, map);

          isFinish = UpdateRandomGo(arrIndexX, map, rnd);
         

          UpdateView(tile, map);


          ClearView();



      }
  }
반응형