在C ++中使用Vector的高分榜

时间:2014-11-01 21:55:21

标签: c++ visual-studio-2010 visual-studio vector

我只是更新代码,以便在我的Highscore列表中显示我尝试使用Vector的最新更新。我拿出了矢量语句,但我知道这一点,完全适用于从文本文件中写入和读取。注意 - 我为一个人更新此代码的任何新读者都可以观察我的新代码

// Get the scores from the game
int getHighscore()
{
    ShowConsoleCursor(true);
    HANDLE hOut;
    hOut = GetStdHandle( STD_OUTPUT_HANDLE );
    fstream file;
    file.open("Highscores.txt", ios::out | ios::app);
    if(file.good()==true) {
        string TextLimit;
        TextLimit = charLimit();
        file << TextLimit;
        for(int a=0; a<=40-TextLimit.length(); a++) {
            file<<" ";
            }
            file<<Killed<<endl;
            file.close();
        }
        ShowConsoleCursor(false);
        return 0;
}

// Displays the scores from the game
void HighscoreResults()
{
    system("cls");
    fstream file;
    file.open("Highscores.txt", ios::in);
    if(file.good()==true)
    {
        string p1Name;
        SetColor(11);
        CPos(1,15); cout << "  _   _ _       _                                      \n";
        CPos(2,15); cout << " | | | (_) __ _| |__  ___  ___ ___  _ __ ___  ___      \n";
        CPos(3,15); cout << " | |_| | |/ _` | '_ \\/ __|/ __/ _ \\| '__/ _ \\/ __|  \n";
        CPos(4,15); cout << " |  _  | | (_| | | | \\__ \\ (_| (_) | | |  __/\\__ \\ \n";
        CPos(5,15); cout << " |_| |_|_|\\__, |_| |_|___/\\___\\___/|_|  \\___||___/  \n";
        CPos(6,15); cout << "          |___/                                        \n";
        CPos(7,10); SetColor(10);
        cout << " ------------------------------------------------------------";
        CPos(9,15); SetColor(14);
        cout << " Names:\n";
        CPos(9,50);
        cout << " Zombies Killed:\n"; SetColor(15);
        while(getline(file, p1Name))
        {
            cout << "                 " << p1Name << endl;
        }
        file.close();
   }
    else
    {
        cout<<"The file cannot open!";
        system("pause >nul");
    }
}

// Makes where only a 8 char can be entered when entering a name
string charLimit()
{
    int characters=-1;
    char text[10];
    int Button;
    string TextLimit;
    while(true)
    {
        // Clears the name when backspaced
        CPos(20, 13);
        cout<<"                      ";
        CPos(20, 13);
        cout<<" Name: ";
        // Puts a limit on the characters of the text
        for(int a=0; a<=characters; a++)
        {
            cout<<text[a];
        }
        Button = getch();
    if(Button==13 && characters>0)
    {
        for(int a=0; a<=characters; a++)
        {
            if(text[a]!=' ') TextLimit = TextLimit + text[a];
        }
            return TextLimit;
        }
        if(Button==8 && characters>=0)
        {
            text[characters] = ' ';
            characters--;
        }
        else if(Button!=8 && characters+1<=9)
        {
            characters++;
            text[characters] = Button;
        }
    }
}

2 个答案:

答案 0 :(得分:0)

您需要在保存之前对矢量进行排序。 std::sort方法可用于您的目的,如下所示:

std::sort (SS.begin(), SS.end()); 

这将对SS进行排序。如果您希望将SS保持在无序状态,则应首先创建它的副本,然后对副本进行排序。 (虽然我不确定为什么你想要在无序向量中获得高分。)

您有评论建议您在某处对kill值进行排序,但似乎没有完成。

另外,当你填充矢量时,我不确定你要做什么。你没有包含Killed的类型(虽然我假设它是一个int,因为你试图将它添加到你的向量时会得到一个编译器错误),但是你只需要将一个int推送到SS一次你的代码。

根据您的新编辑,我认为您正在以错误的方式使用高分文本文件。你似乎并没有真正参考游戏过程的高分。相反,您将每个游戏的结果附加到文件,然后将文件的内容打印为高分。以下是我认为您应该这样做的方式:

  1. 阅读程序开头的高分,将每个分别存储在Score结构中,其中包含字符串或char []名称和int kill。将其中的每一个存储在矢量类字段中。在填充后,将此向量从大到小排序。 (这将要求您为std::sort()电话实施比较器,请查看我链接到您的指南。)

  2. 当玩家的游戏结束时,构建一个乐谱并将其添加到vector<Score>。如果你想在棋盘上获得最多分数(你可能应该这样),你应该检查vector中的最后一个元素(例如具有最少杀戮的Score对象)是否少了杀死比最近的游戏。如果是,则删除最后一个元素,为当前游戏添加Score对象,然后再次排序。清空乐谱文件并遍历vector<Score>,写下姓名并在一行上杀死。

  3. 目前,您的SS矢量甚至无法保存玩家的名字。

答案 1 :(得分:0)

class player{
   string name;
   int score;
}

vector<player> players;

您没有对列表进行排序。您需要在存储之前对矢量进行排序。因此,每当您push_back项目时,您都需要使用std::sort();再次排序。