2014-11-02 2 views
2

내 프로그래밍 수업에서 배우는 것을 사용하여 C++로 된 작은 텍스트 기반 턴 기반 전투 게임을 만들고 있습니다. 더 복잡한 개념을 사용하거나 인식하는 방법을 모를 수도 있습니다.전역 변수를 사용하지 않고 함수간에 많은 변수를 사용하려면 어떻게해야합니까?

나는 게임에서 많은 변수를 가지고 있으며, 플레이어가 특정 아이템을 가지고 있는지, 건강, 갑옷을위한 ints 등을 확인하기 위해 bool을 가지고있다. 나는 전역 변수를 사용하지 말아야한다는 것을 알고 포인터를 사용할 것이다. 함수간에 변수를 전달하십시오.

은 일반적으로 이것은 문제가되지 않을 것입니다 :

attack(int *health, int *armor); 

하지만 난 뭔가이 닮은 있습니다

attack(int *health, int *armor, int *enemyHealth, int *enemyArmor, ......etc); 

그것은 입력 지루한가되어 즉시 해결책이 될 것입니다 전역 변수를 사용하고 있습니다. 그러나 나는 다른 방법을 알고 싶다. 또한 함수를 호출 할 때 플레이어가 아무 것도 입지 않으면 "갑옷"을 전달할 필요가없는 경우가 있습니다. 이것은 또한 많은 것을 만들어야 함을 의미합니다.

if (*armor != nullptr) 
{ 
    do things 
} 

솔루션? 이것이 명확하지 않은 경우에 미리 죄송합니다. 나는이 사이트를 처음 사용하므로 대답을 이해하는 데 잠시 시간이 걸릴 수 있습니다. 모두 감사합니다! :)

Here

이 (가 난 그냥 우연히대로이 문제의하지 많은 경우는 아직,하지만 내 함수 호출을 보면이 다소 명확하게한다) 당신은

+5

을 클래스/구조체에 대해 배웁니다. C++ 책을 가져옵니다. – Rapptz

+1

구조체를 사용하고 포인터로 전달합니다. 또는 C++에서 포인터 대신 참조를 사용합니다. –

답변

2

수백 개의 변수를 전달하지 않도록하는 방법은 클래스 또는 구조체를 사용하여 데이터를 구성하는 것입니다. 아이디어는 게임의 일부를 모델링하는 하나의 "사용자 정의 유형"에서 모든 관련 변수를 모으는 것입니다.

이 작동하는 방법을보기 위해 검사를 위해 나는 아주 작은 모험 게임을 작성한 예를 들어

: 내가 시간이 생각

모험을 웬디 &의을 밥

#include <string> 
#include <iostream> 

// this just declares the makeup 
// of weapons, it doesn't create any 
struct weapon 
{ 
    std::string name; 
    int damage; 
}; 

// this just declares the makeup 
// of players, it doesn't create any 
// NOTE: it contains a weapon 
struct player 
{ 
    bool alive; 
    std::string name; 
    bool male; 
    int health; 
    int armor; 
    weapon weap; 
}; 

// This performs a single attack 
void attack(player& a, player& b) 
{ 
    std::cout << "\n"; 
    std::cout << a.name; 
    std::cout << " strikes at "; 
    std::cout << b.name; 
    std::cout << " with " << (a.male?"his":"her") << " "; 
    std::cout << a.weap.name; 

    int damage = std::rand() % a.weap.damage; 

    if(damage == 0) 
    { 
     std::cout << " and " << (a.male?"he":"she") << " misses."; 
     return; 
    } 

    int wound = damage - b.armor; 

    if(wound <= 0) 
    { 
     std::cout << " causing no harm."; 
     return; 
    } 

    std::cout << " inflicting "; 
    std::cout << wound; 
    std::cout << " damage"; 

    b.health -= wound; 

    if(b.health < 0) 
    { 
     b.alive = false; 
     std::cout << " killing " << (b.male?"him":"her") << " dead!"; 
    } 
    else if(b.health < 10) 
    { 
     std::cout << " causing " << (b.male?"him":"her") << " to stumble!"; 
    } 
    else if(b.health < 20) 
    { 
     std::cout << " causing " << (b.male?"him":"her") << " to stagger!"; 
    } 
    else if(b.health < 30) 
    { 
     std::cout << " irritating " << (b.male?"him":"her") << " somewhat."; 
    } 
} 

int main() 
{ 
    std::srand(std::time(0)); 

    std::cout << "Welcome to the Adventures of Wendy & Bob\n"; 

    // We actually create a player here 
    player bob; 

    // Give it relevant data 
    bob.alive = true; 
    bob.name = "Bob"; 
    bob.male = true; 
    bob.armor = 4; 
    bob.health = 100; 
    bob.weap.name = "knife"; 
    bob.weap.damage = 16; 

    // same with another player 
    player wendy; 

    wendy.alive = true; 
    wendy.name = "Wendy"; 
    wendy.male = false; 
    wendy.armor = 3; 
    wendy.health = 100; 
    wendy.weap.name = "blade"; 
    wendy.weap.damage = 20; 

    // Keep fighting till someone dies! 
    while(bob.alive && wendy.alive) 
    { 
     attack(bob, wendy); 

     if(wendy.alive && bob.alive) 
      attack(wendy, bob); 
    } 

} 
0

를 넣을 수 있습니다 전체 코드 당신의 변수를 struct에 입력하고이를 전달하십시오.

이 C에서 당신은 또한, 우선적으로, 대신 structclass를 사용하여 액세스를 제한 할 것 C++에서는 우선적으로 &를 사용하여 참조에 의해 그것을 를 통과 할 것 ++,하지만 일반 C에서 사용할 수없는 클래스의 멤버 함수를 통해서만 업데이트 될 수 있도록 변수에 추가합니다. 그것은 당신에게 더 나은 제어를 제공합니다. 하지만 –은 struct으로 시작합니다. ;-)

+0

글쎄, 일반적인 합의 인 것처럼 보입니다. 하하 우리는 첫 시험 후에 그 사실을 실제로 배우고 있습니다. 지금 당장 그 책을 열어 머리를 맞출 것입니다. 인간 감사합니다! – Dakattack

0

나는 다른 사람들과 동의하고 말하기를 : 네, 수업을보아야합니다. 그들이 제안한 이유는 encapsulation이라는 것 때문입니다. 아이디어는 당신이 관련된 것들을 하나의 클래스로 그룹화하고 interface을 사용하여 그 클래스와 상호 작용하는 모든 것을 갖도록하는 것입니다.

ex. 플레이어 캐릭터를 사용하여 게임을 디자인한다고 가정 해 봅시다. 플레이어가 히트 할 때마다 항상 느려 져야합니다. 따라서 개인 변수로 건강과 속도를 가질 수 있습니다. 그렇게하면 수업 외의 어떤 것도 그들을 바꿀 수 없습니다. 그러면 "takeHit"(또는 그와 비슷한 것)이라는 함수가 생기고 그 함수는 건강을 감하고 플레이어 속도를 줄입니다. 그렇게하면 실수로 속도를 줄이지 않고도 건강을 줄일 수 없습니다. 이렇게하면 디자인을 고수하는 코드를 쉽게 작성할 수 있습니다. 또한 대부분의 경우 인터페이스를 사용하여 객체로 수행 할 수있는 작업에만 신경을 썼기 때문에 코드에 대해 더 쉽게 생각할 수 있습니다.

업데이트 : 아, 클래스 내에 플레이어를 만들면 둘 이상의 플레이어를 쉽게 가질 수 있다고 언급해야합니다.

관련 문제