Rock Paper Scissors(C ++)

时间:2018-03-25 00:02:05

标签: c++

我在C ++学习大学,它要求我为Rock Paper Scissors制作一个程序,它有非常具体的指示。我必须创建一个包含这些变量的struct(Player) a)一个字符数组(名称[41]) b)一个名为points的整数变量 c)名为master的布尔变量 d)角色阵列(武器[8]),只能采用摇滚,纸张,剪刀等值。

  1. 我必须创建一个void函数(checkMastery),它将Player结构的指针作为参数。在函数中,如果玩家的点数小于100,则必须将player.master设置为false,如果点数等于或大于100,则必须将其设置为true。
  2. 我必须创建另一个void函数letsFight,它接受两个Player结构的参数指针。在该功能中,如果玩家在石头剪刀中赢得战斗,则该玩家的积分增加1点,如果玩家失去积分减少1并且如果它结合则两个玩家的积分都是增加1.如果有任何玩家,还有别的东西作为武器,该玩家的积分设置为0并且游戏结束。
  3. 我必须创建一个字符串函数showBestPlayer,它接受Player结构的参数指针。它通过比较球员的得分并打印其名称来检查谁赢了,如果我们有领带则打印领带。
  4. 我创建了程序,然后编译。但是,无论输入是什么,输出都是" tie"。我该怎么办?

        //7540
    #include <iostream>
    #include <string>
    #include <cstdlib>
    #include <locale>
    using namespace std;
    
    struct Player {
        char name[41];
        int points;
        bool master;
        char weapon[9];
    }players[2], *pointer1, *pointer2;
    
    void checkMastery(Player *pointer);
    void letsFight(Player *pointer1,Player *pointer2);
    string showBestPlayer(Player* pointer1, Player* pointer2);
    int main(){
        pointer1 = players;
        pointer2 = &players[1];
        cout<<"Enter the player's name:\n";
        cin>>players[0].name;
        fflush(stdin);
        cout<<"Enter the player's weapon:\n";
        cin>>players[0].weapon;
        fflush(stdin);
        cout<<"Enter the player's name:\n";
        cin>>players[1].name;
        cout<<"Enter the player's weapon:\n";
        cin>>players[1].weapon;
        fflush(stdin);
        checkMastery(pointer1);
        checkMastery(pointer2);
        letsFight(pointer1, pointer2);
        showBestPlayer(pointer1, pointer2);
    }
    void checkMastery(Player* pointer){
        pointer->master=((pointer->points<100) ? false : true); 
    }
    void letsFight(Player* pointer1, Player* pointer2){
        if (((*pointer2).weapon !="rock")&&((*pointer2).weapon != "paper")&&((*pointer2).weapon!= "scissors")) {
                (*pointer2).points = 0 ;
                if (((*pointer1).weapon !="rock")&&((*pointer1).weapon != "paper")&&((*pointer1).weapon!= "scissors")){
                    (*pointer1).points = 0;
            }
        }
        if ((*pointer1).weapon == "rock"){
            if ((*pointer2).weapon == "rock"){
                (*pointer1).points+=1;
                (*pointer2).points+=1;
            }else if((*pointer2).weapon == "paper"){
                (*pointer1).points-=1;
                (*pointer2).points+=1;
            }else if((*pointer2).weapon == "scissors"){
                (*pointer1).points+=1;
                (*pointer2).points-=1;
        }else if ((*pointer1).weapon == "paper"){
            if ((*pointer2).weapon == "rock"){
                (*pointer1).points+=1;
                (*pointer2).points-=1;
            }else if ((*pointer2).weapon == "paper"){
                (*pointer1).points+=1;
                (*pointer2).points-=1;
            }else if ((*pointer2).weapon == "scissors"){
                (*pointer1).points-=1;
                (*pointer2).points+=1;
            }
        }else if((*pointer1).weapon == "scissors"){
            if((*pointer2).weapon == "rock"){
                (*pointer1).points+=1;
                (*pointer2).points-=1;
            }else if((*pointer2).weapon == "paper"){
                (*pointer1).points-=1;
                (*pointer2).points+=1;
            }else if ((*pointer2).weapon == "scissors"){
                (*pointer1).points+=1;
                (*pointer2).points+=1;
            }
        }
        }   
    }
    
    string showBestPlayer(Player* pointer1, Player* pointer2){
        if ((*pointer1).points > (*pointer2).points) {
            char bestPlayer[41];
            memcpy(bestPlayer,(*pointer1).name,40);
            cout << (*bestPlayer);
        }
        else if ((*pointer2).points > (*pointer1).points) {
            char bestPlayer[41];
            memcpy(bestPlayer, (*pointer2).name,40);
            cout << (*bestPlayer);
        }
        else if((*pointer1).points == (*pointer2).points) {
            cout << "tie";
        }
    }
    

2 个答案:

答案 0 :(得分:2)

您有很多编译错误:

main.cpp:17:1: error: 'pointer' does not name a type
 pointer = players[2];
 ^~~~~~~

那是因为你有

struct Player *pointer;

pointer = players[2];

这是全球范围的;你不能把这样的作业放在一个函数之外(松散的说话者)。你可以写一下:

struct Player *pointer = players[2];

但请注意players[2]已超过players数组的末尾 - 与通过players递增的另一个指针进行比较以确定您是否在数组的结尾,但不能安全地解除引用。您可能希望分配到&players[0](或 - 相同但更简单的符号 - players - 我没有看过您以后如何使用pointer来了解有意义的内容。

main.cpp:19:26: error: variable or field 'checkMastery' declared void
 void checkMastery(pointer) {
                          ^

说“指针”没有意义。 pointer是一个全局变量,但是你将它放入一个函数签名中,其中需要一个参数类型和标识符列表。查看函数体,参数没有明显的用途,因为函数修改了全局变量。

就这样......

main.cpp:25:16: error: variable or field 'letsFight' declared void
 void letsFight(struct* players[0], struct* players[1]) {
                ^~~~~~
main.cpp:25:16: error: expected primary-expression before 'struct'
main.cpp:25:36: error: expected primary-expression before 'struct'
 void letsFight(struct* players[0], struct* players[1]) {
                                    ^~~~~~
main.cpp:83:23: error: expected primary-expression before 'struct'
 string showBestPlayer(struct* players[0], struct* players[1]) {
                       ^~~~~~
main.cpp:83:43: error: expected primary-expression before 'struct'
 string showBestPlayer(struct* players[0], struct* players[1]) {
                                           ^~~~~~
main.cpp:83:63: error: expected ',' or ';' before '{' token
 string showBestPlayer(struct* players[0], struct* players[1]) {
                                                               ^
main.cpp: In function 'int main()':
main.cpp:98:20: warning: suggest parentheses around assignment used as truth value [-Wparentheses]
  for (int i = 0; i = 1; ++i) {
                  ~~^~~
main.cpp:101:4: error: expected ';' before 'cout'
    cout << "Input a weapon:";
    ^~~~
main.cpp:104:12: error: no match for 'operator*' (operand type is 'Player')
  letsFight(*players[0], *players[1]);
            ^~~~~~~~~~~
main.cpp:104:25: error: no match for 'operator*' (operand type is 'Player')
  letsFight(*players[0], *players[1]);
                         ^~~~~~~~~~~
main.cpp:104:2: error: 'letsFight' was not declared in this scope
  letsFight(*players[0], *players[1]);
  ^~~~~~~~~
main.cpp:105:17: error: no match for 'operator*' (operand type is 'Player')
  showBestPlayer(*players[0], *players[1]);
                 ^~~~~~~~~~~
main.cpp:105:30: error: no match for 'operator*' (operand type is 'Player')
  showBestPlayer(*players[0], *players[1]);
                              ^~~~~~~~~~~

你基本上需要系统地解决每个编译错误 - 如果你把它归结为一两个你根本无法理解那么寻求帮助。如果你完全不知所措,从问题的一小部分开始,为此编写代码,确保编译和工作,并逐步建立起来,以便随时掌控。

更新

好的,所以你还在苦苦挣扎。这里有一些不会崩溃的代码。注意我已经避免使用name之类的固定长度数组,你不知道用户可能输入了多少数据,而且我使用了引用而不是指针 - 它很多更难弄错他们!我没有仔细查看程序正在做什么,但它不应该再崩溃,你可以破解它直到你对它感到满意为止。

#include <iostream>
#include <string>
#include <cstdlib>
#include <locale>
#include <cstring>

using namespace std;

struct Player {
    std::string name;  // use std::string not char arrays
    int points;        // (much safer and easier)
    bool master;
    std::string weapon;
};

void checkMastery(Player& pointer);
void letsFight(Player& pointer1, Player& pointer2);
void showBestPlayer(Player& pointer1, Player& pointer2);

int main(){
    Player players[2]{};

    cout<<"Enter the player's name:\n";
    getline(cin, players[0].name);
    cout<<"Enter the player's weapon:\n";
    getline(cin, players[0].weapon);
    cout<<"Enter the player's name:\n";
    getline(cin, players[1].name);
    cout<<"Enter the player's weapon:\n";
    getline(cin, players[1].weapon);

    checkMastery(players[0]);
    checkMastery(players[1]);

    letsFight(players[0], players[1]);
    showBestPlayer(players[0], players[1]);
}

void checkMastery(Player& player){
    player.master = player.points >= 100;
}

void letsFight(Player& player1, Player& player2){
    if (player2.weapon != "rock" && player2.weapon != "paper" && player2.weapon != "scissors") {
        player2.points = 0;
        if (player1.weapon != "rock" && player1.weapon != "paper" && player1.weapon != "scissors") {
                player1.points = 0;
        }
    }

    if (player1.weapon == "rock"){
        if (player2.weapon == "rock"){
            player1.points+=1;
            player2.points+=1;
        }else if(player2.weapon == "paper"){
            player1.points-=1;
            player2.points+=1;
        }else if(player2.weapon == "scissors"){
            player1.points+=1;
            player2.points-=1;
    }else if (player1.weapon == "paper"){
        if (player2.weapon == "rock"){
            player1.points+=1;
            player2.points-=1;
        }else if (player2.weapon == "paper"){
            player1.points+=1;
            player2.points-=1;
        }else if (player2.weapon == "scissors"){
            player1.points-=1;
            player2.points+=1;
        }
    }else if(player1.weapon == "scissors"){
        if(player2.weapon == "rock"){
            player1.points+=1;
            player2.points-=1;
        }else if(player2.weapon == "paper"){
            player1.points-=1;
            player2.points+=1;
        }else if (player2.weapon == "scissors"){
            player1.points+=1;
            player2.points+=1;
        }
    }
    }   
}

void showBestPlayer(Player& player1, Player& player2){
    if (player1.points > player2.points) {
        cout << "best player: " << player1.name << '\n';
    }
    else if (player2.points > player1.points) {
        cout << "best player: " << player2.name << '\n';
    }
    else if(player1.points == player2.points) {
        cout << "tie\n";
    }
}

您的代码遇到的具体问题:

(*pointer1).weapon == "rock"

您不能只将字符箭头与字符串文字(如"rock")进行比较 - C ++将查看字符数组是否位于同一地址,而永远不会。使用std::string,您可以使用==,它将按预期工作。对于字符数组,您需要使用C库函数strcmp(pointer1->weapon, "rock") == 0来测试相等性。

string showBestPlayer(Player* pointer1, Player* pointer2);

这承诺showBestPlayer将返回string,但您的功能只打印了cout上的最佳播放器并且没有返回任何内容。这很可能导致你的崩溃。

cin >> player1.name

当您使用>>在文本中流式传输时,它会在找到空格时停止,无论是来自用户输入ENTER还是来自“Jane Smith”之类的名称中的空格。然后“史密斯”将被意外地读作简的武器。

最好使用getline(std::cin, my_string_variable),因为它会读取由ENTER生成的换行符,包括空格。

fflush(stdin);

永远不需要刷新stdin。在读取标准输入之前,应该刷新写入标准输出的任何提示(通过std::cout发送),以便用户可以看到提示,但C ++会自动执行此操作:std::cinstd::cout流以这种方式绑定

答案 1 :(得分:0)

声明

pointer = players[2];

仅允许在函数中使用。你有它在文件范围(函数外)。这给你的程序中的第一个错误(尽管你没有提到它)。

由于pointer是一个在函数外声明的变量,因此函数定义

void checkMastery(pointer)   // rest of definition omitted

无效,因为(在此上下文中)指针必须是类型,而不是变量。快速修复:删除pointer

第三个问题是

void letsFight(struct* players[0], struct* players[1]) {

尝试声明两个具有相同名称的参数(players)。由于函数体尝试使用players,因此快速解决方法是将上述内容更改为

void letsFight(struct* players[]) {

这可能会触发编译器的其他诊断 - 因为您的代码早先将players声明为变量。

而不是为所有问题提供修复,

1)当查看来自编译器的错误消息时,FIRST是最重要的(你正在看最后一次)。

2)阅读关于C ++的基础教科书,了解变量和类型。通过基本练习。尝试通过GUESSWORK构建代码(例如您)会浪费您的时间和其他所有人。而且,是的,很明显,您正在猜测,考虑到您编写代码的方式,并发布了问题。