我只是想做一个简单的双人游戏。第一个玩家进入电影,第二个玩家通过使用一些C ++基础知识来猜测它。
movie[] = entered by player 1.
movie_temp[]= a temp array with '_' in it. It updates after every guess by player 2.
我的问题:请参考我调用函数movie_check()
的主函数。
这会在每次猜测后更新生命。我希望movie_temp array
能够实现同样的目标。
当我运行这个程序时,只有生命被正确更新,正确猜测生命没有减少,但在下一轮中array_temp
没有更新,每个气体后反复显示相同的数组。
请帮我创建一个有助于返回数组并将其保存在movie_temp
中的函数(就像我一生中所做的那样)。
IDE:Code :: Blocks 编译器:GCC编译器
#include<iostream.h>
#include<stdlib.h>
#include<ctype.h>
#include<string.h>
#include<conio.h>
void display_movie(char movie_temp[], int);
void display_life(int);
int win_player2(char movie_temp[]);
int check_life(char movie[], char, int);
void display_movie(char movie_temp[], int len)
{
for(int i=0 ; i<len ; i++)
cout<<movie_temp[i];
}
void display_life(int life)
{
for(int i=0 ; i<=life ; i++)
cout<<"\3";
}
int check_life(char movie[], char ch, int life)
{
int count1=0;
for(int i=0 ; movie[i]!='\0' ; i++)
{
if(movie[i]==ch)
count1++;
}
if(count1==0)
return --life;
else
return life;
}
int win_player2(char movie_temp[])
{
int count=0;
for(int i=0 ; movie_temp[i]!='\0' ; i++)
{
if(movie_temp[i]=='_')
count++;
}
if(count==0)
return 0;
else
return 1;
}
int main()
{
char movie[100], movie_temp[100], ch;
cout<<"Enter the movie: ";
cin.getline(movie,100);
int len= strlen(movie);
system("cls");
for(int i=0 ; movie[i]!='\0' ; i++)
{
if(movie[i]=='a' || movie[i]=='e' || movie[i]=='i' || movie[i]=='o' ||
movie[i]=='u' || movie[i]==' ')
movie_temp[i]= movie[i];
else
movie_temp[i]='_';
}
int life=9;
cout<<"\nLives left: ";
display_life(life);
while(life!=0 || win_player2(movie_temp)!=0)
{
cout<<"\n";
display_movie(movie_temp, len);
cout<<"\nEnter your guess: ";
cin>>ch;
life=check_life(movie, ch, life);
cout<<"\n\nLives left: ";
display_life(life);
}
getch();
return 0;
}
enter code here
答案 0 :(得分:3)
你犯了一个通常的错误:
movie_temp[i]==movie[i];
应该是
movie_temp[i]=movie[i];
你的编译器应该尖叫一声警告你...我的确:
note: use '=' to turn this equality comparison into an assignment
movie_temp[i]==movie[i];
上下文(如果您无法找到该行):
if(movie[i]==ch)
{
movie_temp[i]==movie[i]; // <<<<<<<<<< this is the line that doesn't copy!
count1++;
}
更新只是按照编译器给我的警告,我对您的代码进行了一些小的更改,现在它正在运行。大多数情况下,我正在听从&#34;你没有回报价值!&#34;警告的类型(当你没有明确地返回一个值时,编译器会做出一些事情 - 而且很可能你不会发现结果有用)。
关键是移动线
return movie_temp;
在for
中的check_movie2
循环之外的:
char* check_movie2(char movie[], char movie_temp[], char ch)
{
for(int i=0 ; movie[i]!='\0' ; i++)
{
if(movie[i]==ch)
{
movie_temp[i]=movie[i];
}
}
return movie_temp;
}
还有其他问题 - 但这是最难咬你的问题。
获得的经验:如果你的编译器警告你,请听。
为了您的娱乐,这里是我必须运行的代码(并且&#34;主要是工作&#34;。它目前没有正确地打印出来并且在我猜到标题后它要求输入。此外,您可能会考虑使比较不区分大小写,因为您当前对正确的大小写很敏感。)
已更新在您的代码中添加了一些注释和其他修补程序。
#include<iostream>
#include<stdlib.h>
#include<ctype.h>
#include<string.h>
using namespace std; // <<<< if you want to use 'cout' instead of 'std::cout' etc, you need this
void display_movie(char movie_temp[], int);
void display_life(int);
int win_player2(char movie_temp[]);
int check_movie(char movie[], char movie_temp[], char, int);
void display_movie(char movie_temp[], int len)
{
for(int i=0 ; i<len ; i++)
cout<<movie_temp[i];
}
void display_life(int life) //displays lives left after each guess
{
for(int i=0 ; i<=life ; i++)
cout<<"+"; // <<<<< I don't know what you are hoping to print with "\3"
// <<<<< Remember that `\` has a special meaning inside a string!
}
int check_movie(char movie[], char movie_temp[], char ch, int life)
{
int count1=0;
for(int i=0 ; movie[i]!='\0' ; i++)
{
if(tolower(movie[i])==tolower(ch)) // <<<<< consider case insensitive match
{
movie_temp[i]=movie[i];
count1++;
}
}
if(count1==0)
{
life--;
return life; //if none of the character is found, life is reduced by 1.
count1=0;
}
return life; // <<<<<< return life here
}
int win_player2(char movie_temp[])
{
int count=0;
for(int i=0 ; movie_temp[i]!='\0' ; i++)
{
if(movie_temp[i]=='_')
count++;
}
return (count==0)?0:1;
}
char* check_movie2(char movie[], char movie_temp[], char ch)
{
for(int i=0 ; movie[i]!='\0' ; i++)
{
if(movie[i]==ch)
{
movie_temp[i]=movie[i];
}
}
return movie_temp;
}
int main()
{
char movie[100], movie_temp[100], ch;
cout<<"Enter the movie: ";
cin.getline(movie,100);
int len= strlen(movie);
int life=9;
system("cls");
for(int i=0 ; movie[i]!='\0' ; i++)
{
if(movie[i]=='a' || movie[i]=='e' || movie[i]=='i' || movie[i]=='o' ||
movie[i]=='u' || movie[i]==' ')
movie_temp[i]= movie[i];
else
movie_temp[i]='_';
} //initially displays the movie to player 2 and shows only vowels.
cout<<"\nLives left: ";
display_life(life);
while(life!=0 && win_player2(movie_temp)!=0) // <<<<< change || to &&
{
cout<<"\n";
display_movie(movie_temp, len);
cout<<"\nEnter your guess: ";
cin>>ch;
life=check_movie(movie, movie_temp, ch, life);
/*I need to update the life after each round, or else the initially declared
life is passed. */
cout<<"\n\nLives left: ";
display_life(life);
}
return 0;
}
更新 - &#34;从函数返回指针&#34;
要返回一组数值&#34;,您需要实现许多目标:
关于不同方法的简单示例(C)(包括不起作用的方法):
不起作用:
int * foo() {
int A[]={1,2,3,4,5};
return A;
}
int main(void) {
int *X;
X = foo();
printf("%d", X[0]); // UNDEFINED BEHAVIOR
return 0;
}
这不起作用,因为数组A
在函数返回时停止存在(&#39;超出范围&#39;)。访问X
指向的内存会导致未定义的行为。
有效,但仅在单线程环境中使用:
int * foo() {
static int A[]={1,2,3,4,5};
return A;
}
这是有效的,因为数组是static
所以它的分配方式不同而且#34;幸存下来&#34;函数返回后。不推荐。
传递指针和数组大小:(示例增加数组)
void foo(int *a, int n) {
int ii;
for(ii=0;ii<n;ii++) a[ii]++;
}
int main(void) {
int n=5;
int X[5] = {1,2,3,4,5};
foo(X, 5); // values in X will be incremented in-place
在另一个数组中返回值:
void foo(int *A, int *B, int n) {
int ii;
for(ii=0; ii<n; ii++) B[ii] = 2 * A[ii];
}
int main(void) {
int a[5] = {1,2,3,4,5};
int b[5];
foo(a, b, 5);
printf("%d\n", b[0]); // returns a value of 2
return 0;
}
这开始变得更加明智。最后,如果您希望函数创建一个数组,则可以执行
int *foo(int n) {
int *X, ii;
X = malloc(n * sizeof *X);
for(ii = 0; ii < n; ii++) X[ii] = 2 * ii;
return X;
}
int main(void) {
int *a;
a = foo(5);
printf("%d", a[4]); // will print 8
free(a); // remember to do this after you finished using the array or you get a memory leak!
return 0;
}
我希望这些额外的例子及其解释可以帮助您更好地理解这些技术。