- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
利用我在编程课上学到的知识,我正在用 C++ 制作一个基于文本的小型回合制战斗游戏。请记住,我可能不知道如何使用或了解更复杂的概念。
我在游戏中有很多变量,用于检查玩家是否拥有某些元素的 bool 值,用于健康值,护甲等的整数。我知道我不应该使用全局变量,所以我打算使用指针来传递函数之间的变量。
通常这不是问题:
attack(int *health, int *armor);
但我有类似的东西:
attack(int *health, int *armor, int *enemyHealth, int *enemyArmor, ......etc);
输入变得越来越乏味,使用全局变量将是一个即时的解决方案。但我想知道另一种方式。此外,有时在调用函数时我不需要传递“*armor”,例如如果玩家没有穿任何盔甲。这也意味着我需要创建很多这样的东西:
if (*armor != nullptr)
{
do things
}
解决方案?如果不清楚,请提前道歉。我是这个网站的新手,我可能需要一段时间才能理解您的回答。谢谢大家!! :)
Here是完整的代码(这个问题的实例还不多,因为我刚刚遇到它,但查看我的函数调用会使其更加清晰)
最佳答案
避免传递数百个变量的方法是使用类或结构组织数据。这个想法是您将所有相关变量收集到一个模拟游戏某些部分的“用户定义类型”中。
例如,我编写了一个非常小的冒险游戏供您检查,看看它是如何工作的:
Wendy 和 Bob 的冒险
#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);
}
}
关于c++ - 如何在不使用全局变量的情况下在函数之间使用多个变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26696264/
C语言sscanf()函数:从字符串中读取指定格式的数据 头文件: ?
最近,我有一个关于工作预评估的问题,即使查询了每个功能的工作原理,我也不知道如何解决。这是一个伪代码。 下面是一个名为foo()的函数,该函数将被传递一个值并返回一个值。如果将以下值传递给foo函数,
CStr 函数 返回表达式,该表达式已被转换为 String 子类型的 Variant。 CStr(expression) expression 参数是任意有效的表达式。 说明 通常,可以
CSng 函数 返回表达式,该表达式已被转换为 Single 子类型的 Variant。 CSng(expression) expression 参数是任意有效的表达式。 说明 通常,可
CreateObject 函数 创建并返回对 Automation 对象的引用。 CreateObject(servername.typename [, location]) 参数 serv
Cos 函数 返回某个角的余弦值。 Cos(number) number 参数可以是任何将某个角表示为弧度的有效数值表达式。 说明 Cos 函数取某个角并返回直角三角形两边的比值。此比值是
CLng 函数 返回表达式,此表达式已被转换为 Long 子类型的 Variant。 CLng(expression) expression 参数是任意有效的表达式。 说明 通常,您可以使
CInt 函数 返回表达式,此表达式已被转换为 Integer 子类型的 Variant。 CInt(expression) expression 参数是任意有效的表达式。 说明 通常,可
Chr 函数 返回与指定的 ANSI 字符代码相对应的字符。 Chr(charcode) charcode 参数是可以标识字符的数字。 说明 从 0 到 31 的数字表示标准的不可打印的
CDbl 函数 返回表达式,此表达式已被转换为 Double 子类型的 Variant。 CDbl(expression) expression 参数是任意有效的表达式。 说明 通常,您可
CDate 函数 返回表达式,此表达式已被转换为 Date 子类型的 Variant。 CDate(date) date 参数是任意有效的日期表达式。 说明 IsDate 函数用于判断 d
CCur 函数 返回表达式,此表达式已被转换为 Currency 子类型的 Variant。 CCur(expression) expression 参数是任意有效的表达式。 说明 通常,
CByte 函数 返回表达式,此表达式已被转换为 Byte 子类型的 Variant。 CByte(expression) expression 参数是任意有效的表达式。 说明 通常,可以
CBool 函数 返回表达式,此表达式已转换为 Boolean 子类型的 Variant。 CBool(expression) expression 是任意有效的表达式。 说明 如果 ex
Atn 函数 返回数值的反正切值。 Atn(number) number 参数可以是任意有效的数值表达式。 说明 Atn 函数计算直角三角形两个边的比值 (number) 并返回对应角的弧
Asc 函数 返回与字符串的第一个字母对应的 ANSI 字符代码。 Asc(string) string 参数是任意有效的字符串表达式。如果 string 参数未包含字符,则将发生运行时错误。
Array 函数 返回包含数组的 Variant。 Array(arglist) arglist 参数是赋给包含在 Variant 中的数组元素的值的列表(用逗号分隔)。如果没有指定此参数,则
Abs 函数 返回数字的绝对值。 Abs(number) number 参数可以是任意有效的数值表达式。如果 number 包含 Null,则返回 Null;如果是未初始化变量,则返回 0。
FormatPercent 函数 返回表达式,此表达式已被格式化为尾随有 % 符号的百分比(乘以 100 )。 FormatPercent(expression[,NumDigitsAfterD
FormatNumber 函数 返回表达式,此表达式已被格式化为数值。 FormatNumber( expression [,NumDigitsAfterDecimal [,Inc
我是一名优秀的程序员,十分优秀!