2013-12-01 2 views
-5

Я пишу простую программу, и я хочу очистить все окно консоли с помощью Console.Clear(), но только удаляет строки, которые я написал тем же методом , Он не удаляет предыдущие строки.Console.Clear() не очищает все окно консоли

Любые идеи?

код (строка 123.)

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 

namespace Szigeti_Marton_FW0S9E 
{ 
    //Reversi (Othello) - Szigeti Márton, FW0S9E 

    class Game 
    { 
     private int[,] Table { get; set; } 

     private int gameCounter { get; set; } 

     private const int dimX = 8; 
     private const int dimY = 8; 

     private const char playerSign = 'X'; 
     private const char computerSign = 'O'; 

     private void Map() 
     { 
      Console.Write(" "); 

      for(int k = 0; k < 8; k++) 
       Console.Write("{0} ", (char)(65 + k)); 

      Console.WriteLine(); 

      for (int i = 0; i < dimX; i++) 
      { 
       Console.Write(i+1); 

       for (int j = 0; j <= dimY; j++) 
       { 
        Console.Write("| "); 
       } 

       Console.WriteLine(); 
      } 
     } 

     private void Map(int x, int y, char sign) 
     { 
      //Overloaded 

      Console.Write(" "); 

      for (int k = 0; k < 8; k++) 
       Console.Write("{0} ", (char)(65 + k)); 

      Console.WriteLine(); 

      for (int i = 0; i < dimX; i++) 
      { 
       Console.Write(i + 1); 

       for (int j = 0; j <= dimY; j++) 
       { 
        Console.Write("| "); 
       } 

       Console.WriteLine(); 
      } 
     } 

     private bool isFieldEmpty(int x, int y) 
     { 
      if (Table[x, y] == -1) 
       return true; 
      else 
       return false; 
     } 

     private bool isInputValid(string input) 
     { 
      bool temp = true; 

      bool tempLetter = false, tempNumber = false; 

      if ((input.Length == 2) && (char.IsLetter(input[0])) && (char.IsNumber(input[1]))) 
      { 

       for (int i = 0; i < dimX; i++) 
       { 
        if (input[0] == (char)65 + i) 
         tempLetter = true; 
       } 

       if (!tempLetter) 
        temp = false; 

       for (int j = 0; j < dimY; j++) 
       { 
        if (int.Parse(input[1].ToString()) == j) 
         tempNumber = true; 
       } 

       if (!tempNumber) 
        temp = false; 
      } 
      else if (input.Length != 2) 
       temp = false; 

      return temp; 
     } 

     private void makeAMove() 
     { 
      int tempLetter = 0; 

      gameCounter++; 
      string Field; 
      Random randomMove = new Random(); 

      Console.WriteLine("Adjon meg egy mezőt, pl. \"D3\". Feladáshoz: \"feladom\""); 

      do { Field = Console.ReadLine(); } 
      while (!isInputValid(Field)); 

      Console.Clear(); // <-- Line 123 

      if (gameCounter % 2 == 1) 
      { 
       Field[0].ToString().ToUpper(); 

       for(int i = 0; i < 8; i++) 
        if(Field[0] == (char)(65+i)) 
         tempLetter = i; 

       Map(Field[1], tempLetter, playerSign); 
      } 
      else if (gameCounter % 2 == 0) 
      { 
       //Gép random lépés 
      } 
     } 

     static void Main(string[] args) 
     { 
      Game Player1 = new Game(); 
      Player1.Map(); 
      Player1.makeAMove(); 

      Console.ReadLine(); 
     } 
    } 
} 
+4

Показать код !!! –

+0

Я установил ссылку на код – mszigetihu

+1

Вы действительно должны локализовать проблему и не размещать ссылку на несколько экранов, чтобы код, если вы ожидаете получить ответ – DarkWalker

ответ

-1

Надежда Справка по:

using System; 
using System.Runtime.InteropServices; 

namespace nsClearConsole 
{ 
    /// <summary> 
    /// Summary description for ClearConsole. 
    /// </summary><BR/> 
    public class ClearConsole 
    {  
    private const int STD_OUTPUT_HANDLE = -11; 
    private const byte EMPTY = 32; 

    [StructLayout(LayoutKind.Sequential)] 
    struct COORD 
    { 
     public short x; 
     public short y; 
    } 

    [StructLayout(LayoutKind.Sequential)] 
    struct SMALL_RECT 
    { 
     public short Left; 
     public short Top; 
     public short Right; 
     public short Bottom; 
    } 

    [StructLayout(LayoutKind.Sequential)] 
    struct CONSOLE_SCREEN_BUFFER_INFO 
    { 
     public COORD dwSize; 
     public COORD dwCursorPosition; 
     public int wAttributes; 
     public SMALL_RECT srWindow; 
     public COORD dwMaximumWindowSize; 
    } 

    [DllImport("kernel32.dll", EntryPoint="GetStdHandle", SetLastError=true, CharSet=CharSet.Auto, CallingConvention=CallingConvention.StdCall)] 
    private static extern int GetStdHandle(int nStdHandle); 

    [DllImport("kernel32.dll", EntryPoint="FillConsoleOutputCharacter", SetLastError=true, CharSet=CharSet.Auto, CallingConvention=CallingConvention.StdCall)] 
    private static extern int FillConsoleOutputCharacter(int hConsoleOutput, byte cCharacter, int nLength, COORD dwWriteCoord, ref int lpNumberOfCharsWritten); 

    [DllImport("kernel32.dll", EntryPoint="GetConsoleScreenBufferInfo", SetLastError=true, CharSet=CharSet.Auto, CallingConvention=CallingConvention.StdCall)] 
    private static extern int GetConsoleScreenBufferInfo(int hConsoleOutput, ref CONSOLE_SCREEN_BUFFER_INFO lpConsoleScreenBufferInfo); 

    [DllImport("kernel32.dll", EntryPoint="SetConsoleCursorPosition", SetLastError=true, CharSet=CharSet.Auto, CallingConvention=CallingConvention.StdCall)] 
    private static extern int SetConsoleCursorPosition(int hConsoleOutput, COORD dwCursorPosition); 

    private int hConsoleHandle; 

    public ClearConsole() 
    { 
     // 
     // TODO: Add constructor logic here. 
     // 
     hConsoleHandle = GetStdHandle(STD_OUTPUT_HANDLE); 
    } 

    public void Clear() 
    { 
     int hWrittenChars = 0; 
     CONSOLE_SCREEN_BUFFER_INFO strConsoleInfo = new CONSOLE_SCREEN_BUFFER_INFO();   
     COORD Home;  
     Home.x = Home.y = 0; 
     GetConsoleScreenBufferInfo(hConsoleHandle, ref strConsoleInfo); 
     FillConsoleOutputCharacter(hConsoleHandle, EMPTY, strConsoleInfo.dwSize.x * strConsoleInfo.dwSize.y, Home, ref hWrittenChars); 
     SetConsoleCursorPosition(hConsoleHandle, Home); 
    } 
    } 
} 

Смотреть Это Дополнительная информация: http://support.microsoft.com/kb/319257

+0

Спасибо, но это не помогает. Переключение метода одной строки с этим .. нет спасибо? – mszigetihu

0

Причина Console.Clear() не реально работает из-за инструкции do-while в методе. (Линия 120 и строка 121).

Переместите Console.Clear(); над инструкцией do-while (возможно, Line 120), и она будет работать.

Причиной сделай, а блокирует Console.clear() является то, что в сделать заявление, он ожидает ввода и в заявлении в то время как она ожидает ввода в удовлетворяют условию

do { Field = Console.ReadLine(); } 
while (!isInputValid(Field));) 

Без этого входа и пока условие в while не будет выполнено, оно не перейдет к следующему утверждению.

+0

Единственная проблема в том, что я не могу этого сделать, потому что в этот момент мне нужно увидеть карту, поэтому я не могу очистить консоль до того, как сделать это. Может быть, пока-то неправильно? Я не уверен. – mszigetihu

+0

@mszigetihu Причина того, что do-while блокирует консоль. Ясно, что в инструкции do она ожидает ввода. ('do {Field = Console.ReadLine();} while (! isInputValid (Field));') Без этого ввода и до тех пор, пока условие в while не будет выполнено, оно не будет продолжено. Вам нужно работать над этим –

+0

@mszigetihu Чтобы подтвердить. Когда код добирается до части do while, а console.clear не выполняется. Введите '3b' в консоли и нажмите enter. Он выполнит Console.Clear(), а оставшийся код –

0
static void Main() 
    { 
     Console.WriteLine("0"); 
     Test1(); 
     Test2(); 
    } 

    public static void Test1() 
    { 
     Console.WriteLine("1"); 
    } 

    public static void Test2() 
    { 
     Console.WriteLine("2"); 
     Console.Clear(); 
     Console.WriteLine("3"); 
    } 

Выход:

3 

Проблема не в Console.Clear, но в вашей логике

Смежные вопросы