2016-11-17 319 views
0

我是新来的编程,我开始与C#。所以我遵循了一个关于在控制台中制作简单游戏的教程。 Here's the tutorial。当我完成教程后,我留下了一个体面的比赛,但没有打磨。游戏不会重新启动。我如何重新启动游戏机?

我试过一些不同的方式试图绕过它,但没有我试过似乎工作(因为即时新的和一半的编码没有意义)。

所以我试了这个。为什么这不工作?

using System; 
using System.Threading; 
using System.Diagnostics; 

namespace DodgeGame 
{ 

public class Game 
{ 
    //This is our constructor, 
    // it gets run auto when new instance is made. 
    public Game() 
    { 
     //PLAYER 
     playerUnit = new PlayerUnit(5, 5, "@"); 

     //ENEMY 
     enemyUnits = new Unit[ numEnemies ]; 

     Random = new Random(); 
     Score = 0; 

      for(int i = 0; i < numEnemies; i++) 
      { 
       int row = Random.Next(0, Console.WindowHeight - 1); 
       enemyUnits[i] = new EnemyUnit(Console.WindowWidth -1, row , "<"); 
      } 

     stopwatch = new Stopwatch(); 
    } 



    private Stopwatch stopwatch; 

    private Unit playerUnit; 

    private int numEnemies = 20; 
    private Unit[] enemyUnits; 

    public static Random Random; 
    public static int Score; 

    public void Run() 
    { 

     stopwatch.Start(); 
     long timeAtPreviousFrame = stopwatch.ElapsedMilliseconds; 


     while(true) 
     { 
      //Time since last frame. 
      int deltaTimeMS = (int)(stopwatch.ElapsedMilliseconds 
            - timeAtPreviousFrame); 
      timeAtPreviousFrame = stopwatch.ElapsedMilliseconds; 


      //Updating Units. 
      playerUnit.Update(deltaTimeMS); 

      for(int i = 0; i < enemyUnits.Length; i++) 
      { 
       enemyUnits[i].Update(deltaTimeMS); 

       if(playerUnit.IsCollidingWith(enemyUnits[i])) 
       { 
        //Then game over. 
        GameOver(); 
        return; 
       } 
      } 
      playerUnit.Draw(); 

      foreach (Unit u in enemyUnits) 
      { 
       u.Draw(); 
      } 


      //Draw the score. 
      Console.SetCursorPosition(0, Console.WindowHeight - 1); 
      Console.Write("SCORE: " + Score.ToString()); 

      //Lets just do a tiny sleep to avoid running at too high of fps. 
      Thread.Sleep(5); 

     } 

     //PROGRAM END. 
    } 

    void GameOver() 
     { 
     Console.Clear(); 
     Console.WriteLine("Game Over. Your Score was: " + Score); 
     Console.WriteLine("Insert Name to LeaderBoard:"); 
     //TODO: Make a local leaderboard? 

     if(Console.KeyAvailable == true) 
     { 
      ConsoleKeyInfo cki = Console.ReadKey(true); 
      while(cki.Key != ConsoleKey.Escape) 
      { 
       if(cki.Key == ConsoleKey.Spacebar) Game(); 
       cki = Console.ReadKey(true); 
      } 


     Console.SetCursorPosition(0,Console.WindowHeight - 1); 


     } 

} 

}

我要重新启动我的游戏,但不关闭窗口。

对不起,如果这没有足够的信息来帮助。

+2

这不是你应该提供的信息的一部分,它不够。 – Ogbe

+0

是的,最重要的是要展示主函数的外观和游戏循环过程中会发生什么(我们当然可以检查教程,但这意味着你的问题不包含足够的信息) – Icepickle

+0

好吧,这证明了多少我不知道:/ – deviousPriest

回答

1

我想你有主要功能/调用函数如下;

static void Main(string[] args) 
{ 
    var game=new Game(); 
    //May be some initialization logic  
    game.Run(); 
} 

在,你可以添加一个while循环,并检查用户输入,如果他想退出那么他就可以按指定键(Esc键也许...)

请参阅下面的代码;

static void Main(string[] args) 
{ 
    while(true) 
    { 
     var game = new Game(); 
     //May be some initialization logic  
     game.Run(); 

     Console.WriteLine("Press any key to restart, press Esc to close."); 
     var userInput = Console.ReadKey(); 
     if (userInput.Key == ConsoleKey.Escape) 
      return; 
    } 
} 

你可以根据你的需要调整这个逻辑,但我想你会明白我的观点。

+0

感谢弗利平吨。很好地解释了所有。正是我想要的:) – deviousPriest

+0

我有另一个问题,如果你不介意。我如何从这个声明中删除我的箭头键(用它们来移动我的角色)。所以如果我死了,我立即按下箭头键,游戏就会重新启动,而我不知道我的分数。对不起,如果im newb – deviousPriest

+0

添加'Console.ReadLine();'作为'GameOver()'方法的最后一行。这将显示分数,直到您按Enter键。按Enter后,您将收到有关重新启动或关闭的消息。 –

1

您可以使用while循环。检查用户是否想要退出或开始游戏(例如使用ESC和Space),然后进行适当的处​​理。

ConsoleKeyInfo cki = Console.ReadKey(true); 
while(cki.Key != KeyCode.Esc) 
{ 
    if(cki.Key == KeyCode.Space) Game(); 
    cki = Console.ReadKey(true); 
} 
+0

我试过这个,它没有工作,它可能不是你的代码中的缺陷,但我没有正确使用它。你能简单地解释一下吗? – deviousPriest

+0

也许告诉我什么部分不起作用?粗略地解释它通过代码循环,并继续阅读一个键,直到你按下退出键。 –

+0

好吧,以及我不知道这就是即时通讯寻找我不知道。我可以做到这一点,当我按SpaceBar它只会'重置',并回到“游戏”的开始? – deviousPriest

-2

什么是游戏()。你可以使用新的实例。

System.Diagnostics.Process.Start(Application.ExecutablePath); 

退出当前进程。 envoinment.exit();

+0

*我想在不关闭窗口的情况下重新开始游戏。* 你有没有读过上面的问题? –

+1

Downvote reason:为什么不让这个过程保持活跃状态​​,而不是创建一个新过程并杀死当前过程?对我来说似乎是不必要的开销,这使得应用程序比它应该更复杂。 –