2016-04-30 31 views
0

我需要在C#控制檯應用程序中編寫蛇遊戲。我有一條可以移動的蛇,但唯一的問題是它的尾巴不會被切斷,這意味着你可以基本上保持每一步的成長,而不用吃一塊。如果你能幫助我,我會很高興。下面的代碼:C#控制檯蛇尾將不會被刪除

namespace ConsoleApplication11 
{ 
class Program 
{ 
    static void MainMenu() 
    { 
     Console.SetCursorPosition(40, 12); 
     Console.ForegroundColor = ConsoleColor.Blue; 
     Console.Write("S"); 
     Console.ForegroundColor = ConsoleColor.Green; 
     Console.Write("N"); 
     Console.ForegroundColor = ConsoleColor.Red; 
     Console.Write("A"); 
     Console.ForegroundColor = ConsoleColor.Magenta; 
     Console.Write("K"); 
     Console.ForegroundColor = ConsoleColor.Yellow; 
     Console.WriteLine("E"); 
     Console.ResetColor(); 
     Console.SetCursorPosition(32, 13); 
     Console.WriteLine("Press Enter to start!"); 
    } 
    static void SnakeMovement() 
    { 
     Console.Clear(); 
     Random rnd = new Random(); 
     int foodX = rnd.Next(1, 80); 
     int foodY = rnd.Next(1, 25); 
     int snakeX = rnd.Next(1, 80); 
     int snakeY = rnd.Next(1, 25); 
     if ((snakeX == foodX) && (snakeY == foodY)) 
     { 
      snakeX = rnd.Next(1, 80); 
      snakeY = rnd.Next(1, 25); 
     } 
     int i = 0; 
     int userScore = 0; 
     ConsoleKeyInfo userAction; 
     int[] ArrSnakeItselfX = new int[2000]; 
     int[] ArrSnakeItselfY = new int[2000]; 
     ArrSnakeItselfX[1] = (snakeX); 
     ArrSnakeItselfY[1] = (snakeY); 
     ArrSnakeItselfX[2] = (snakeX); 
     ArrSnakeItselfY[2] = (snakeY - 1); 
     ArrSnakeItselfX[3] = (snakeX); 
     ArrSnakeItselfY[3] = (snakeY - 2); 
     Console.SetCursorPosition(foodX, foodY); 
     Console.ForegroundColor = ConsoleColor.Yellow; 
     Console.Write("#"); 
     Console.ResetColor(); 
     i = ArrSnakeItselfX.Count(); 
     while (true) 
     { 
      Console.SetCursorPosition(ArrSnakeItselfX[0], ArrSnakeItselfY[0]); 
      Console.Write("@"); 
      Console.SetCursorPosition(ArrSnakeItselfX[1], ArrSnakeItselfY[1]); 
      Console.Write("$"); 
      Console.SetCursorPosition(ArrSnakeItselfX[2], ArrSnakeItselfY[2]); 
      Console.Write("$"); 
      if ((snakeX == foodX) && (snakeY == foodY)) 
      { 
       foodX = rnd.Next(1, 80); 
       foodY = rnd.Next(1, 25); 
       Console.SetCursorPosition(foodX, foodY); 
       Console.ForegroundColor = ConsoleColor.Yellow; 
       Console.Write("#"); 
       Console.ResetColor(); 
       i = ArrSnakeItselfX.Count(); 
       userScore++; 
      } 
      userAction = Console.ReadKey(true); 
      if (userAction.Key == ConsoleKey.W) 
      { 
       while (!Console.KeyAvailable) 
       { 
        ArrSnakeItselfY[0]--; 
        Console.SetCursorPosition(ArrSnakeItselfX[0], ArrSnakeItselfY[0]); 
        Console.Write("@"); 
        Console.SetCursorPosition(ArrSnakeItselfX[0], ArrSnakeItselfY[0] + 1); 
        Console.Write("$"); 
        Console.SetCursorPosition(ArrSnakeItselfX[i - 1], ArrSnakeItselfY[i - 1]); 
        Console.Write(" "); 
        Thread.Sleep(500); 
        if ((ArrSnakeItselfX[0] == foodX) && (ArrSnakeItselfY[0] == foodY)) 
        { 
         foodX = rnd.Next(1, 80); 
         foodY = rnd.Next(1, 25); 
         Console.SetCursorPosition(foodX, foodY); 
         Console.ForegroundColor = ConsoleColor.Yellow; 
         Console.Write("#"); 
         Console.ResetColor(); 
         ArrSnakeItselfX[i] = (ArrSnakeItselfX[i - 1]); 
         ArrSnakeItselfY[i] = (ArrSnakeItselfY[i - 1] + 1); 
         i = ArrSnakeItselfX.Count(); 
         Console.SetCursorPosition(ArrSnakeItselfX[i - 1], ArrSnakeItselfY[i - 1]); 
         userScore++; 
        } 
       } 
      } 
      if (userAction.Key == ConsoleKey.D) 
      { 
       while (!Console.KeyAvailable) 
       { 
        ArrSnakeItselfX[0] = ArrSnakeItselfX[0] + 1; 
        Console.SetCursorPosition(ArrSnakeItselfX[0], ArrSnakeItselfY[0]); 
        Console.Write("@"); 
        Console.SetCursorPosition(ArrSnakeItselfX[0] - 1, ArrSnakeItselfY[0]); 
        Console.Write("$"); 
        Console.SetCursorPosition(ArrSnakeItselfX[i - 1], ArrSnakeItselfY[i - 1]); 
        Console.Write(""); 
        Thread.Sleep(500); 
        if ((ArrSnakeItselfX[0] == foodX) && (ArrSnakeItselfY[0] == foodY)) 
        { 
         foodX = rnd.Next(1, 80); 
         foodY = rnd.Next(1, 25); 
         Console.SetCursorPosition(foodX, foodY); 
         Console.ForegroundColor = ConsoleColor.Yellow; 
         Console.Write("#"); 
         Console.ResetColor(); 
         ArrSnakeItselfX[i] = (ArrSnakeItselfX[i - 1]); 
         ArrSnakeItselfY[i] = (ArrSnakeItselfY[i - 1] + 1); 
         i = ArrSnakeItselfX.Count(); 
         Console.SetCursorPosition(ArrSnakeItselfX[i - 1], ArrSnakeItselfY[i - 1]); 
         userScore++; 
        } 
       } 
      } 
      if (userAction.Key == ConsoleKey.A) 
      { 
       while (!Console.KeyAvailable) 
       { 
        ArrSnakeItselfX[0] = ArrSnakeItselfX[0] - 1; 
        Console.SetCursorPosition(ArrSnakeItselfX[0], ArrSnakeItselfY[0]); 
        Console.Write("@"); 
        Console.SetCursorPosition(ArrSnakeItselfX[0] + 1, ArrSnakeItselfY[0]); 
        Console.Write("$"); 
        Console.SetCursorPosition(ArrSnakeItselfX[i - 1], ArrSnakeItselfY[i - 1]); 
        Console.Write(""); 
        Thread.Sleep(500); 
        if ((ArrSnakeItselfX[0] == foodX) && (ArrSnakeItselfY[0] == foodY)) 
        { 
         foodX = rnd.Next(1, 80); 
         foodY = rnd.Next(1, 25); 
         Console.SetCursorPosition(foodX, foodY); 
         Console.ForegroundColor = ConsoleColor.Yellow; 
         Console.Write("#"); 
         Console.ResetColor(); 
         ArrSnakeItselfX[i] = (ArrSnakeItselfX[i - 1]); 
         ArrSnakeItselfY[i] = (ArrSnakeItselfY[i - 1] + 1); 
         i = ArrSnakeItselfX.Count(); 
         Console.SetCursorPosition(ArrSnakeItselfX[i - 1], ArrSnakeItselfY[i - 1]); 
         userScore++; 
        } 
       } 
      } 
      if (userAction.Key == ConsoleKey.S) 
      { 
       while (!Console.KeyAvailable) 
       { 
        ArrSnakeItselfY[0]++; 
        Console.SetCursorPosition(ArrSnakeItselfX[0], ArrSnakeItselfY[0]); 
        Console.Write("@"); 
        Console.SetCursorPosition(ArrSnakeItselfX[0], ArrSnakeItselfY[0] - 1); 
        Console.Write("$"); 
        Console.SetCursorPosition(ArrSnakeItselfX[i - 1], ArrSnakeItselfY[i - 1]); 
        Console.Write(""); 
        Thread.Sleep(500); 
        if ((ArrSnakeItselfX[0] == foodX) && (ArrSnakeItselfY[0] == foodY)) 
        { 
         foodX = rnd.Next(1, 80); 
         foodY = rnd.Next(1, 25); 
         Console.SetCursorPosition(foodX, foodY); 
         Console.ForegroundColor = ConsoleColor.Yellow; 
         Console.Write("#"); 
         Console.ResetColor(); 
         ArrSnakeItselfX[i] = (ArrSnakeItselfX[i - 1]); 
         ArrSnakeItselfY[i] = (ArrSnakeItselfY[i - 1] + 1); 
         i = ArrSnakeItselfX.Count(); 
         Console.SetCursorPosition(ArrSnakeItselfX[i - 1], ArrSnakeItselfY[i - 1]); 
         userScore++; 
        } 
       } 
      } 
     } 
    }  
    static void Main(string[] args) 
    { 
     while (true) 
     { 
      Console.CursorVisible = false; 
      ConsoleKeyInfo userStartingGame; 
      MainMenu(); 
      userStartingGame = Console.ReadKey(true); 
      if (userStartingGame.Key == ConsoleKey.Enter) 
      { 
       SnakeMovement(); 
      } 
      else 
      { 
      } 
     } 
    } 
} 

}

回答

0

你不只是ArrSnakeItSelfX[0]這是蛇的頭部,而沒有吃動更新任何ArrSnakeItSelfX的座標。陣列中的所有其他座標都是錯誤的,所以

Console.SetCursorPosition(ArrSnakeItselfX[i - 1], ArrSnakeItselfY[i - 1]); 
Console.Write(" "); 

總是寫入相同的屏幕位置。

當你的蛇沒有進食時,你必須將你的所有座標都移到後面。因此,最後一個位置(舊尾部)被擦除,並在數組中的索引0處插入新的頭部位置。

var e = ArrSnakeItselfX.Length; 

Console.SetCursorPosition(ArrSnakeItselfX[e - 1], ArrSnakeItselfY[e - 1]); 
Console.Write(" "); //erase tail of snake 

for (int i = e-1; i>0; i--) { //shift all coordinates by one position in the array 
    ArrSnakeItselfX[i] = ArrSnakeItselfX[i-1]; 
    ArrSnakeItselfY[i] = ArrSnakeItselfY[i-1]; 
} 

//set new head position 
ArrSnakeItselfX[0] = //new x of head; 
ArrSnakeItselfY[0] = //new y of head; 
Console.SetCursorPosition(ArrSnakeItselfX[0], ArrSnakeItselfY[0]); 
Console.Write("@"); 

當你吃東西,你基本上做同樣的事情,只是,你不降的最後一個元素,而是由一個增加ARRAYSIZE並保持最後一個元素。

+0

非常感謝!我仍然需要加強代碼,但現在我差不多完成了! – gogonamee

+0

例如,您可以使用'List '來代替兩個數組,因爲一個點可以同時保存座標和一個列表,您可以刪除最後一個元素並在前面插入一個新元素,因此您不必複製所有移位元素 – derpirscher

+0

我知道,但是這是一個學校的項目,並且指令使用數組。 – gogonamee