繁体   English   中英

剪刀石头的C ++代码,请咨询

[英]C++ code for Rock-Paper-Scissors, need advice please

这是我在这里的第一篇文章,对不起,如果我不在正确的位置或类似的位置。 我只是想对我创建的程序提供一些反馈。 我学习C ++已有两个月了(自学成才),这是我自己开发的第一款游戏(我编写了带有计算机的程序,与您抗衡)。 我的梦想是成为一名视频游戏程序员,所以请保持谦虚,哈哈。 我已经毫无问题地编译并执行了该程序,并且对其进行了错误测试,并按预期运行。 我的问题是,我的代码可以理解吗? 我像专业游戏程序员一样编程,还是我的代码草率? 如果它草率,您能推荐我如何解决? 在此先感谢您提供的任何建议! 我的代码如下。 (再次,抱歉,如果我张贴错误或在错误的位置!)

#include <iostream>
#include <cstdlib>
#include <ctime>

int main()
{
    std::cout << "\tWelcome to the Rock-Paper-Scissors game!\n\n";

    int maxWins;
    std::cout << "Please enter the number of wins you wish to play to: ";
    std::cin >> maxWins;

    std::cout << "\n\n1 - Rock\n";
    std::cout << "2 - Paper\n";
    std::cout << "3 - Scissors\n\n";

    std::cout << "Using the above menu as a reference, please input one of the numbers associated with an action.\n\n";

    int myWins = 0;
    int computerWins = 0;
    srand(static_cast<unsigned int>(time(0)));  // seed random number generator I use in while loop

    while (myWins != maxWins && computerWins != maxWins)
    {
        int computerMove = rand() % 3 + 1;  // giving the computerMove variable a random number between 1 and 3
        int myMove;
        std::cout << "Your move: ";
        std::cin >> myMove;

        if (myMove == computerMove)
        {
            if (myMove == 1 && computerMove == 1)
            {
                std::cout << "\nTie, you both threw Rock.\n\n";
                std::cout << "Your total wins: " << myWins << "\n";
                std::cout << "Computer's total wins: " << computerWins << "\n\n";
            }
            else if (myMove == 2 && computerMove == 2)
            {
                std::cout << "\nTie, you both threw Paper.\n\n";
                std::cout << "Your total wins: " << myWins << "\n";
                std::cout << "Computer's total wins: " << computerWins << "\n\n";
            }
            else if (myMove == 3 && computerMove == 3)
            {
                std::cout << "\nTie, you both threw Scissors.\n\n";
                std::cout << "Your total wins: " << myWins << "\n";
                std::cout << "Computer's total wins: " << computerWins << "\n\n";
            }
            else
            {
                std::cout << "\nError #1\n\n";  // catchfall
            }
        }
        else if (myMove == 1 && computerMove == 2)
        {
            std::cout << "\nComputer's Paper beats your Rock.\n\n";
            ++computerWins;
            std::cout << "Your total wins: " << myWins << "\n";
            std::cout << "Computer's total wins: " << computerWins << "\n\n";
        }
        else if (myMove == 1 && computerMove == 3)
        {
            std::cout << "\nYour Rock beats computer's Scissors.\n\n";
            ++myWins;
            std::cout << "Your total wins: " << myWins << "\n";
            std::cout << "Computer's total wins: " << computerWins << "\n\n";
        }
        else if (myMove == 2 && computerMove == 1)
        {
            std::cout << "\nYour Paper beats computer's Rock.\n\n";
            ++myWins;
            std::cout << "Your total wins: " << myWins << "\n";
            std::cout << "Computer's total wins: " << computerWins << "\n\n";
        }
        else if (myMove == 2 && computerMove == 3)
        {
            std::cout << "\nComputer's Scissors beats your Paper.\n\n";
            ++computerWins;
            std::cout << "Your total wins: " << myWins << "\n";
            std::cout << "Computer's total wins: " << computerWins << "\n\n";
        }
        else if (myMove == 3 && computerMove == 1)
        {
            std::cout << "\nComputer's Rock beats your Scissors.\n\n";
            ++computerWins;
            std::cout << "Your total wins: " << myWins << "\n";
            std::cout << "Computer's total wins: " << computerWins << "\n\n";
        }
        else if (myMove == 3 && computerMove == 2)
        {
            std::cout << "\nYour Scissors beats computer's Paper.\n\n";
            ++myWins;
            std::cout << "Your total wins: " << myWins << "\n";
            std::cout << "Computer's total wins: " << computerWins << "\n\n";
        }
        else
        {
            std::cout << "\nError #2\n\n";  // catchfall
        }
    }

    if (myWins == maxWins)
    {
        std::cout << "\n\nCongratulations! You won!!\n\n";
    }
    else if (computerWins == maxWins)
    {
        std::cout << "\n\nThe computer beat you. Try again!\n\n";
    }
    else
    {
        std::cout << "\n\nError #3\n\n";    // catchfall
    }

    return 0;
}

这确实应该属于代码审查堆栈,但是让我给您我的想法。

我要解决的第一件事是对移动(1,2,3)使用“幻数”。 我敢打赌,您不能忘了哪个是哪个,那会导致错误(还有很多避免使用幻数的原因。我建议您使用一个枚举

enum Move{
    ROCK = 1,
    PAPER,
    SCISSORS
};

那你可以做

myMove == ROCK

然后我会将输出移出大if 这样,您可以进行一些智能打印,而不必为每个排列提供输出。

std::cout << "\nTie, you both threw "<<text_for[move]<<".\n\n";

而不是3条单独的线。 这样可以更轻松地更改输出。

此答案的基本原则是:a)避免使用幻数和b)避免DRY(不要重蹈覆辙),但这是一般的编程课程,并不特定于C ++或游戏开发。

如果您想学习C ++和游戏编程,我建议您使用更多的OOPS概念。
总体而言,您的代码样式是顺序的,并且是基于其他样式的。 [C风格]

下一步是为RPS游戏可视化不同的类及其之间的关系。

使设计易于扩展,例如,如果您想对“石头剪刀布-水”添加新的动作。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM