2014-12-07 2 views
1

다음 코드에서는 게임 보드를 그대로 유지했습니다. 사용자가 원하는만큼 여러 번 카드를 재활용 할 수 있도록 프로그램을 반복합니다. 새 줄을 만드는 대신 사용자가 입력 한 문자가 매번 똑같은 위치에 표시되도록하고 싶습니다. 내가 보여주기 위해 그들이 입력하기 전에 입력 한 것을 볼 수 있도록하고 싶습니다. 나는 아직도 코딩에 익숙하지 않고 제 2의 C++ 수업을 듣고 배우고 싶습니다. 내가 연구를 통해 마이크로 소프트 비주얼 스튜디오 2013를 사용하고, 시작하기 나는 내장이 코드를 가지고 :C++ 콘솔에서 매번 같은 위치에 cin show를 만드는 방법

#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; 
} 

을 프로그램이 어디에서 초기 사용자가 입력 할 것이라는 자리에 공간을두고 그래서 나는 그것을 가지고 첫 번째 입력. 첫 번째 입력 후 사용자가 'q'또는 'Q'를 입력 할 때까지 cin 문자가 다음 줄에 표시됩니다. 나는 매번 같은 장소에 보여주고 싶다. X coord는 다음과 같아야합니다 : 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; 
} 

. 위치를 설정하고 이전 입력을 "지우려면"콘솔에 일부 공백/줄 바꿈을 쓴 다음 다시 커서를 다시 설정하는 것이 좋습니다.