查看我的C ++滚动菜单并提供任何提示

时间:2014-10-11 17:03:58

标签: c++ visual-studio-2010 visual-studio visual-studio-2012 menu

现在我有一个工作的滚动菜单,我只想询问是否有人提供如何压缩这个的提示,因为它有点“CHUNKY”!
此外,我还有两个额外的问题:我如何更改它  “摇滚,
   纸,
   剪刀“
显示为“Rock,Paper”,Scissors“?如果你试用我的代码,你会看到文字都是垂直的,我可以把它全部放在水平吗?还有任何提示如何将它变成一个无效的声明多次使用?

#include <iostream>
#include <string>
#include <windows.h>

using namespace std;

int main()
{
string Menu[3] = {"Rock", "Paper", "Scissors"};
int pointer = 0;

while(true)
{
    system("cls");

    SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 15);
    cout << "Main Menu\n\n";

    for (int i = 0; i < 3; ++i)
    {
        if (i == pointer)
        {
            SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 11);
            cout << Menu[i] << endl;
        }
        else
        {
            SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 15);
            cout << Menu[i] << endl;
        }
    }

    while(true)
    {
        if (GetAsyncKeyState(VK_UP) != 0)
        {
            pointer -= 1;
            if (pointer == -1)
            {
                pointer = 2;
            }
            break;
        }
        else if (GetAsyncKeyState(VK_DOWN) != 0)
        {
            pointer += 1;
            if (pointer == 3)
            {
                pointer = 0;
            }
            break;
        }
        else if (GetAsyncKeyState(VK_RETURN) != 0)
        {
            switch (pointer)
            {
                case 0:
                {
                    cout << "\n\n\nStarting new game...";
                    Sleep(1000);
                } break;
                case 1:
                {
                    cout << "\n\n\nThis is the options...";
                    Sleep(1000);
                } break;
                case 2:
                {
                    return 0;
                } break;
            }
            break;
        }
    }

    Sleep(150);
}

return 0;
}

1 个答案:

答案 0 :(得分:0)

你可以通过不同的方式解决这个问题。我更喜欢在自己的代码中以不同的方式进行操作,但是我尝试在当天的这个时刻编写一些尽可能接近您自己代码的内容。

您可以对需要显示的任何菜单重复使用相同的功能 - 只需为字符串列表和该数组中的字符串数量赋予不同的值。更好 - 使用std::vector<string>

不是硬编码主函数中的菜单项数量,而是通过获取字符串数组的总大小并将其除以第一个元素的大小来计算出来。由于每个元素都为sizeof提供相同的值,而不管字符串的长度如何,因此您可以计算数组中元素的数量。请注意 - 虽然这个技巧在getUserChoice函数内部不起作用 - 到那时,数组已经降级为指针而且函数无法知道数组中有多少项,不像主要 - 这就是为什么我计算那里的数字。使用字符串向量会更加清晰,因为您可以将向量的引用传递给函数,然后在函数内部可以调用向量的.size()方法来获取它包含的项目数。可能有点在你刚才所处的位置前面,因此代码的风格与你自己的相似。

希望它有所帮助。 :)

#include <iostream>
#include <string>
#include <windows.h>

using namespace std;

int getUserChoice(string *items, int numItems)
{
    int curSel = 0, textAttrib;
    bool selectionMade = false, needsUpdate = true; // we want to clearscreen first time through
    while (!selectionMade)
    {
        // only redraw the screen if something has changed, or we're on the first iteration of
        // our while loop.
        if (needsUpdate)
        {
            system("cls");
            needsUpdate = false;

            SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 15);
            cout << "Main Menu" << endl;
            cout << "(navigate with arrow keys, select with enter)" << endl << endl;
            for (int i=0; i<numItems; i++)
            {
                if (i == curSel)
                    textAttrib = 11;
                else
                    textAttrib = 15;

                SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), textAttrib);

                if (i)
                    cout << " ";

                cout << items[i];
            }
        }

        if (GetAsyncKeyState(VK_LEFT) != 0)
        {
             curSel--;
             needsUpdate = true;
        }

        else if (GetAsyncKeyState(VK_RIGHT) != 0)
        {
             curSel++;
             needsUpdate = true;
        }

        else if (GetAsyncKeyState(VK_RETURN) != 0)
            selectionMade = true;

        if (curSel < 0)
            curSel = numItems-1;
        else if (curSel > (numItems-1) )
            curSel = 0;
        Sleep(100);
    }
    char dummy[10];
    cin.getline(dummy, 10);   // clear the enter key from the kbd buffer
    return curSel;
}


int main()
{
    string Menu[] = {"Rock", "Paper", "Scissors"};

    int selection;
    selection = getUserChoice(Menu, sizeof(Menu)/sizeof(Menu[0]) );

    cout << "You chose: " << Menu[selection] << endl;
}