我在C ++学习大学,它要求我为Rock Paper Scissors制作一个程序,它有非常具体的指示。我必须创建一个包含这些变量的struct(Player) a)一个字符数组(名称[41]) b)一个名为points的整数变量 c)名为master的布尔变量 d)角色阵列(武器[8]),只能采用摇滚,纸张,剪刀等值。
我创建了程序,然后编译。但是,无论输入是什么,输出都是" 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";
}
}
答案 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::cin
和std::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构建代码(例如您)会浪费您的时间和其他所有人。而且,是的,很明显,您正在猜测,考虑到您编写代码的方式,并发布了问题。