2014-12-07 2 views
1

В следующем коде у меня есть игровая панель. У меня есть цикл программ, так что пользователь может перерабатывать карты через столько раз, сколько они хотят. Мне бы хотелось, чтобы персонаж, набранный пользователем, каждый раз показывал в одном и том же месте, вместо того, чтобы создавать новую строку. Я бы хотел, чтобы он показывал, чтобы они могли видеть, что они набрали, прежде чем они попали в enter. Я все еще довольно новичок в кодировании, и я нахожусь в своем 2-м классе C++, и я хочу учиться и впечатлять. Для начала, я использую Microsoft Visual Studio 2013. В результате исследований я получил этот код построен:Как сделать шоу cin в одном и том же месте каждый раз для консоли C++

#include <iostream> 
#include <cstdlib> 
#include <ctime> 
#include <Windows.h> 
#include <string> 

using namespace std; 

const TCHAR SUITS[] = { 'H', 'C', 'D', 'S' }; 
const TCHAR FACES[] = { 'A', '2', '3', '4', '5', '6', '7', '8', '9', 'T', 'J', 'Q', 'K' }; 
const TCHAR SPACE = ' '; 
const int number_of_cards = 5; 

int main() { 
    char * line_of_stars = "*****************************************************\n"; 
    char * line_of_spaces = "*             *\n"; 
    char * top_of_cards = "* ******* ******* ******* ******* ******* *\n"; 
    char * card_sides = "* *  * *  * *  * *  * *  * *\n"; 
    char quit = 'q'; 
    //Display Screen 
    cout << line_of_spaces << top_of_cards << card_sides << card_sides << card_sides 
     << card_sides << card_sides << top_of_cards << line_of_spaces << line_of_stars; 
    cout << "\nPress 'q' to quit or any other key to get new cards: "; 

    DWORD dw; 
    COORD suitCoord; 
    COORD faceCoord; 
    COORD nextMove; 
    HANDLE hStdOut = GetStdHandle(STD_OUTPUT_HANDLE); 
    if (hStdOut == INVALID_HANDLE_VALUE){ 
     printf("Invalid handle"); 
    } 
    nextMove.X = 53; 
    nextMove.Y = 11; 
    do { 
     for (int i = 0; i < number_of_cards; i++){ 

      int startX = 6 + (i * 10); 
      int startY = 3; 

      //Set coords for the i-nth card 
      suitCoord.X = (startX); 
      suitCoord.Y = (startY); 
      faceCoord.X = (startX); 
      faceCoord.Y = (startY + 2); 
      //suit random num 
      int rand1 = rand() % 4; 
      TCHAR suit_char = SUITS[rand1]; 
      int rand2 = rand() % 13; 
      TCHAR face_char = FACES[rand2]; 
      //Print to screen 
      WriteConsoleOutputCharacter(hStdOut, &suit_char, 1, suitCoord, &dw); 
      WriteConsoleOutputCharacter(hStdOut, &face_char, 1, faceCoord, &dw); 
     } 
     // Cover Last input with a space 
     WriteConsoleOutputCharacter(hStdOut, &SPACE, 1, nextMove, &dw); 
     cin.clear(); 
     cin >> quit; 
     cout << "\b\b"; 
    } while (!(quit == 'q' || quit == 'Q')); 

    return 0; 
} 

Я его так, что программа ставит пространство в том месте, где начальные, что пользователь будет введите первый вход. После первого ввода символ cin отображается на следующей строке, пока пользователь не наберет «q» или «Q». Я хотел бы, чтобы он показывался в одном и том же месте каждый раз. Координация X должна быть: 51, а координата Y должна быть: 12. Я стараюсь не использовать метод четкого экрана, потому что я использовал это для моего последнего последнего семестра, и он много раз перепечатывал строки.

ответ

2

Одним из способов достижения этой цели будет двигаться в позицию курсора каждый раз, когда они ввести номер

SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), { 0, 0 }); 

Этот код должен работать:

#include <iostream> 
#include <cstdlib> 
#include <ctime> 
#include <Windows.h> 
#include <string> 

using namespace std; 

const TCHAR SUITS[] = { 'H', 'C', 'D', 'S' }; 
const TCHAR FACES[] = { 'A', '2', '3', '4', '5', '6', '7', '8', '9', 'T', 'J', 'Q', 'K' }; 
const TCHAR SPACE = ' '; 
const int number_of_cards = 5; 

int main() { 
    char * line_of_stars = "*****************************************************\n"; 
    char * line_of_spaces = "*             *\n"; 
    char * top_of_cards = "* ******* ******* ******* ******* ******* *\n"; 
    char * card_sides = "* *  * *  * *  * *  * *  * *\n"; 
    char quit = 'q'; 
    //Display Screen 
    cout << line_of_spaces << top_of_cards << card_sides << card_sides << card_sides 
     << card_sides << card_sides << top_of_cards << line_of_spaces << line_of_stars; 
    cout << "\nPress 'q' to quit or any other key to get new cards: "; 

    DWORD dw; 
    COORD suitCoord; 
    COORD faceCoord; 
    COORD nextMove; 
    HANDLE hStdOut = GetStdHandle(STD_OUTPUT_HANDLE); 
    if (hStdOut == INVALID_HANDLE_VALUE){ 
     printf("Invalid handle"); 
    } 
    nextMove.X = 53; 
    nextMove.Y = 11; 
    do { 
     for (int i = 0; i < number_of_cards; i++){ 

      int startX = 6 + (i * 10); 
      int startY = 3; 

      //Set coords for the i-nth card 
      suitCoord.X = (startX); 
      suitCoord.Y = (startY); 
      faceCoord.X = (startX); 
      faceCoord.Y = (startY + 2); 
      //suit random num 
      int rand1 = rand() % 4; 
      TCHAR suit_char = SUITS[rand1]; 
      int rand2 = rand() % 13; 
      TCHAR face_char = FACES[rand2]; 
      //Print to screen 
      WriteConsoleOutputCharacter(hStdOut, &suit_char, 1, suitCoord, &dw); 
      WriteConsoleOutputCharacter(hStdOut, &face_char, 1, faceCoord, &dw); 
     } 
     // Cover Last input with a space 
     WriteConsoleOutputCharacter(hStdOut, &SPACE, 1, nextMove, &dw); 
     cin.clear(); 
     cin >> quit; 
     cout << "\b\b"; 
     SetConsoleCursorPosition(hStdOut, { 53, 11 }); 
    } while (!(quit == 'q' || quit == 'Q')); 

    return 0; 
} 

Кроме того, нет ничего плохого в расчистке экран, если вы не используете систему («cls»);

Вы можете использовать такую ​​функцию, чтобы заполнить буфер консоли пробелами.

void clearScreen(){ 
    CONSOLE_SCREEN_BUFFER_INFO csbi; 
    DWORD count, cellCount; 
    if (!GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE), &csbi)) return; 

    cellCount = csbi.dwSize.X *csbi.dwSize.Y; 

    if (!FillConsoleOutputCharacter(GetStdHandle(STD_OUTPUT_HANDLE), (TCHAR) ' ', cellCount, { 0, 0 }, &count))return; 
    SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), { 0, 0 }); 
} 
+0

Первый блок работал отлично, за исключением того, что ему нужно было {51,12}. Это было слишком легко исправить. У меня есть четкий экран в моей программе, однако, когда отображается меню, и я сделал это неправильно, но сейчас я его изменю. Спасибо за оба ответа! – kingcobra1986

0

Вы можете использовать system("CLS"), чтобы очистить экран, а затем распечатать все снова. Вам просто нужно как-то хранить информацию, чтобы ее можно было легко распечатать, а затем просто очистить экран и перепечатать. Я не думаю, что есть способ изменить на экране символы в консольной программе.

+0

Извините, что забыл упомянуть, что я пытался не использовать прозрачный экран, потому что последняя игра, которую я сделал с ней, сильно мелькнула из-за всех изменений. Я пытаюсь найти альтернативный метод. Если вы запустите программу выше, вы увидите, как меняются только символы для карт и ничего больше, я пытаюсь сделать то же самое с входным символом. – kingcobra1986

+0

- это попытка отменить вход пользователя: cout << "\ b \ b"; –

+0

Да. Я забыл это сделать. – kingcobra1986

0
void setPos(int x, int y) 
{ 
    COORD coord; 
    coord.X = x; coord.Y = y; 
    SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord); 
    return; 
} 

использовать метод, такие как эти, чтобы непрерывно установить курсор на то же место, передавая в тех же координаты каждый раз. Может быть полезно установить положение, а затем записать некоторые пробелы/новые строки на консоль, чтобы «стереть» предыдущий вход, а затем снова установить курсор.

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