2016-11-17 1 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(); 
} 

당신은 (... 어쩌면 Esc 키를), while 루프를 추가하고 사용자 입력을 확인할 수 있습니다

다음 코드를 참조하십시오;

필요에 따라이 논리를 조정할 수는 있지만 내 주장을 이해할 수있을 것입니다.

+0

감사합니다. 잘 n 모든 설명했다. 정확히 내가 원했던 것이었다. – deviousPriest

+0

마음이 없다면 또 다른 질문이있다.이 문장에서 내 화살표 키를 제거 (게임에서 내 캐릭터 이동에 사용)하려면 어떻게합니까? 그래서 내가 죽으면 즉시 화살표 키를 눌러 내 점수를 알지 못하고 게임을 다시 시작합니다. 미안하다면 미리 입력하십시오. – deviousPriest

+0

'GameOver()'메소드의 마지막 줄에'Console.ReadLine();'을 추가하십시오. Enter 키를 누를 때까지 점수가 표시됩니다. Enter 키를 누르면 재시작 또는 닫기에 관한 메시지가 나타납니다. –

1

while 루프를 사용할 수 있습니다. 사용자가 게임을 종료하거나 시작 (예 : ESC 및 스페이스 사용) 할 것인지 확인한 다음 적절히 처리하십시오.

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

* 창을 닫지 않고 게임을 다시 시작하고 싶습니다. * 위의 qustion을 읽었습니까? –

+1

Downvote 이유 : 새 프로세스를 생성하고 현재 프로세스를 종료하는 대신 프로세스를 활성 상태로 유지하는 것이 어떻습니까? 나에게 불필요한 오버 헤드처럼 보이기 때문에 응용 프로그램이 훨씬 복잡해집니다. –

관련 문제