2016-04-30 10 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(" "); 

常に同じスクリーン位置に書き込みます。

あなたのヘビが食べることなく動いている間に、配列のすべての座標を1つ後ろに移動する必要があります。したがって、最後の位置(古いテール)が消去され、配列のインデックス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("@"); 

あなたが何かを食べるとき、あなたは基本的に、あなたが最後の要素をドロップしますが、1で配列サイズを増やし、最後の要素を保持していない以外、同じことを行う必要があります。

+0

ありがとうございました!私はまだコードを強化する必要がありますが、私はほぼ完了しました! – gogonamee

+0

例えば、2つの配列を使う代わりに、ポイントが両方の座標を保持することができるので、最後の要素を削除して新しい要素を前に挿入することができるので、リストを使うことができるので、 'List 'を使うことができます。位置を移動するためのすべての要素をコピーする – derpirscher

+0

私はそれが学校のためのプロジェクトであることを知っていて、命令は配列を使用することです。 – gogonamee

関連する問題