如何使用按键在屏幕上移动图片?

时间:2016-11-19 19:06:00

标签: c++ windows console-application conio

我目前正在编写一个程序,根据房屋的大小在屏幕上显示房屋,它还会检测到'A' 'S' 'W' 'D'按下按键,按下按键。现在我已经完成了所有这些功能,并借用了清晰的屏幕功能。我想在屏幕上上下移动这个图像。我知道我非常接近,但我不确定如何移动图片。如果用户按下“d”,我希望程序向右移动,我假设这就像在x坐标上加1,然后按“a”从x中减去一个向左移动,同样向上移动按下“w”或“s”并加y或减去y值。

#include <windows.h>
#include <iostream>
#include <cstdlib>
#include <conio.h>

using namespace std;

void ClearScreen();

void draw(int j)
{
    cout <<"  /";
    for(int c=0; c<j; c++)
    {
        cout <<"  ";
    }
    {
        cout << "\\ \n";
    }
    cout << " /";
    for(int c=0; c<j; c++)
    {
        cout << "  ";
    }
    cout <<"  \\ \n";
    cout << "/";
    for(int c=0; c<j; c++)
    {
        cout <<"  ";
    }
    cout <<"    \\ \n";
    cout <<"|";
    for(int c=0; c<j; c++)
    {
        cout << "----";
    }
    cout <<"| \n";
    cout <<"|";
    for(int c=0; c<j; c++)
    {
        cout << "    ";
    }
    cout <<"| \n";
    cout <<"|";
    for(int c=0; c<j; c++)
    {
        cout << "    ";
    }
    cout <<"| \n";
    cout <<"|";
    for(int c=0; c<j; c++)
    {
        cout << "----";
    }
    cout <<"| \n";
}

/////////////////////////////////
////////////////////////////////

void Move(int key,int housesize)
{
    if (key ==97)
    {
        cout << "you pressed 'a' \n";
        draw(housesize);
    }
    else if (key==115)
    {
        cout<< "you pressed 's' \n \t";
        draw(housesize);
    }
    else if (key==100)
    {
        cout<< "you pressed 'd' \n";
        draw(housesize);
    }
    else if (key==119)
    {
        cout<< "you pressed 'w' \n";
        draw(housesize);
    }
}
////// MAIN //////////////
int main(int argc, char *argv[])
{
    int i,number;
    char letter;

    cout << "How large would you like me to draw a house from 1 to 5? \n";
    cin >> i;
    draw(i);
    cout << "Press a key to move the picture and esc to close \n";
    while(1)
    {
        letter=getch();
        number=letter;
        if(number==27)
        {
            break;
        }
        else if (number !=27)
        {
            Move(number, i);
        }
        ClearScreen();
        Move(number, i);
    }

    system ("PAUSE");
    return 0;
}
////// CLEARSCREEN ////////////////////////////////////
void ClearScreen()
{
    HANDLE                     hStdOut;
    CONSOLE_SCREEN_BUFFER_INFO csbi;
    DWORD                      count;
    DWORD                      cellCount;
    COORD                      homeCoords = { 0, 0 };

    hStdOut = GetStdHandle( STD_OUTPUT_HANDLE );
    if (hStdOut == INVALID_HANDLE_VALUE) return;
    /* Get the number of cells in the current buffer */
    if (!GetConsoleScreenBufferInfo( hStdOut, &csbi )) return;
    cellCount = csbi.dwSize.X *csbi.dwSize.Y;
    /* Fill the entire buffer with spaces */
    if (!FillConsoleOutputCharacter(
        hStdOut,(TCHAR) ' ',cellCount,homeCoords,&count)) return;
    /* Fill the entire buffer with the current colors and attributes */
    if (!FillConsoleOutputAttribute(
        hStdOut,csbi.wAttributes,cellCount,homeCoords,&count)) return;

    /* Move the cursor home */
    SetConsoleCursorPosition( hStdOut, homeCoords );
}   

2 个答案:

答案 0 :(得分:0)

这里缺少的是你画房子的位置。让我们相应地改变绘图功能:

void draw(int h, int v, int j)
{
    cout << string(v, '\n');  //vertical offset
    string hs(h,' '); // prepare horizontal offset

    cout <<hs<< "  /";       // add horizontal offset at each start of line
    for (int c = 0; c<j; c++) {
        cout << "  ";
    }
    ...
}

现在移动只需要改变水平和垂直偏移。所以让我们修改一下这个功能。我们将通过引用传递这两个,以便在调用函数中更改它们的值:

void Move(int key, int& h, int& v, int housesize)  
{
    if (key == 'a') {     // would worth considering tolower(key) 
        if (h>1) 
            h--;
    }
    else if (key == 's') {
        h++;             // is there a maximum (e.g. screensize - housewidth) ?
    }
    else if (key == 'd') {
        v++;
    }
    else if (key == 'w') {
        if (v>1) 
            v--;
    }
}

最后,在main()中你需要保持水平和垂直偏移,并在重新设计的函数中使用它们:

int h = 0, v = 0;  // horizontal and vertical offset
...
while (1) {
    letter = getch();
    ...
    else if (number != 27) {
        Move(number, h, v, i);  // <=== just change position.  Will redraw later
    }
    ClearScreen();              
    draw(h, v, i);              // draw at new position what ever happened
}

答案 1 :(得分:0)

Moves around, fluently! thankyou!

#include <windows.h>
#include <iostream>
#include <cstdlib>
#include <conio.h>
#include <string>
using namespace std;
void ClearScreen();
void draw(int v, int h,int j)
{
cout << string(v, '\n');     
string hs(h,' ');     
cout <<hs<<"  /";
for(int c=0; c<j; c++)
 {
 cout <<"  ";
 }
 cout << "\\ \n";
  cout <<hs<<" /";
 for(int c=0; c<j; c++)
 {
 cout << "  ";
 }
 cout <<"  \\ \n";
 cout <<hs<<"/";
 for(int c=0; c<j; c++)
 {
  cout <<"  ";
  }
  cout <<"    \\ \n";
  cout <<hs<<"|";
  for(int c=0; c<j; c++)
  {
   cout << "----";
   }
   cout <<"| \n";
   cout <<hs<<"|";
   for(int c=0; c<j; c++)
   {
   cout << "    ";
   }
   cout <<"| \n";
   cout <<hs<<"|";
   for(int c=0; c<j; c++)
   {
    cout << "    ";
    }
    cout <<"| \n";
    cout <<hs<<"|";
    for(int c=0; c<j; c++)
    {
    cout << "----";
    }
    cout <<"|";
    }
    /////////////////MOVE///////////////
    void Move(int key, int& h, int& v, int housesize)
 {   
   if (key ==97)
  {///////////////a//////////
         if(h>1)
         v--;
  }
  else if (key==115)
  {////////////s////////////
  h++;
  }
  else if (key==100)
  {//////////d//////////////
  v++;
  }
  else if (key==119)
  {//////////w////////////
       if(v>1)
       h--;
  }
}    
/////////MAIN/////////////////
int main(int argc, char *argv[]) 
{
int h=0, v=0;
int i,number;
char letter;
cout << "How large would you like me to draw a house from 1 to 5? \n";
cin >> i;
draw(h,v,i);
cout << "Press a key to move the picture and esc to close \n";
while(1)
{
   letter=getch();
   number=letter;
     if(number==27)
      {
       break;
      }
     else if (number !=27)
      {
        Move(number,h,v,i);
      }
        ClearScreen();

        draw(h,v,i);
       } 

system ("PAUSE");
return 0;
}
//////////////////////CLEARSCREAN///////////////
void ClearScreen()
 {
 HANDLE                     hStdOut;
 CONSOLE_SCREEN_BUFFER_INFO csbi;
 DWORD                      count;
 DWORD                      cellCount;
 COORD                      homeCoords = { 0, 0 };
 hStdOut = GetStdHandle( STD_OUTPUT_HANDLE );
 if (hStdOut == INVALID_HANDLE_VALUE) return;
 /* Get the number of cells in the current buffer */
 if (!GetConsoleScreenBufferInfo( hStdOut, &csbi )) return;
 cellCount = csbi.dwSize.X *csbi.dwSize.Y;
 /* Fill the entire buffer with spaces */
 if (!FillConsoleOutputCharacter(
hStdOut,
(TCHAR) ' ',
cellCount,
homeCoords,
&count
)) return;
/* Fill the entire buffer with the current colors and attributes */
if (!FillConsoleOutputAttribute(
hStdOut,
csbi.wAttributes,
cellCount,
homeCoords,
&count
)) return;

/* Move the cursor home */
SetConsoleCursorPosition( hStdOut, homeCoords );
}