我将一个类定义为示例:
class Rectangle {
int width, height;
public:
void set_values (int,int);
int area (void);
} ;
假设区域计算很复杂,为了清洁和可读,我想使用display_result();
或order_items(int x, int y);
等函数。我怎样才能做到这一点 ?一般的问题是如何在c ++中的类中使用函数。
我的具体案例:
bool AlphaBetaAI::computeMove (PangScenario *ps, int playerNumber, int *move)
{
int alpha=-Number_MAX_VALUE;
int beta= Number_MAX_VALUE;
float childValue;
int score;
vector<int> legalMovements;
legalMovements.push_back(1); //Move right
legalMovements.push_back(2); //Move left
legalMovements.push_back(3); //stop
legalMovements.push_back(4); //Shoot
vector< pair<float,int> > lista;
PangScenario *pangCopy = new PangScenario(*ps);
//score=myPacman->getPoints(); Si quiero arrastrar los puntos ya conseguidos por pacman antes de tomar decision
score=0; //Si quiero empezar desde 0 a partir del momento que calculo la decisión.
lista.clear();
for ( int i=0; i < legalMovements.size();i++)
{
if ( legalMovements[i] != 0)
{
switch (legalMovements[i])
{
case 1: //North
pangCopy->characterPlayerOne->moveRight();
childValue = minimaxAlphaBeta(pangCopy, alpha, beta, score, 1, depth-1, jugador+1);
lista.push_back(make_pair(childValue,1));
break;
case 2: //South
CharactersLocationsMaze[playerRow]=sr+1;
CharactersLocationsMaze[playerColumn]=sc;
childValue= minimaxAlphaBeta(mazeTemp,CharactersLocationsMaze, alpha, beta, score, 2, depth-1, jugador+1);
lista.push_back(make_pair(childValue,2));
break;
case 3: //West
CharactersLocationsMaze[playerRow]=sr;
CharactersLocationsMaze[playerColumn]=sc-1;
childValue= minimaxAlphaBeta(mazeTemp,CharactersLocationsMaze, alpha, beta, score, 3, depth-1, jugador+1);
lista.push_back(make_pair(childValue,3));
break;
case 4: //East
CharactersLocationsMaze[playerRow]=sr;
CharactersLocationsMaze[playerColumn]=sc+1;
childValue = minimaxAlphaBeta(mazeTemp,CharactersLocationsMaze, alpha, beta, score, 4, depth-1, jugador+1);
lista.push_back(make_pair(childValue,4));
break;
}
}
}//for
//more code not relevant to the question
}
我计算某种剧游戏的举动。要计算最佳运动id必须使用5的深度递归调用minimaxAlphabeta。所以我必须声明并定义minimaxAlphabeta并在类computemove中使用它。
提前致谢
答案 0 :(得分:0)
如果我理解正确,你的问题不是关于使用方法,而是关于优化繁重的计算。
让我们以Rectangle
为例:
class Rectangle {
int width, height;
public:
void set_values (int,int);
int area (void);
} ;
假设计算area
并不重,可以在方法本身中完成,这是一个清晰,直接且简单的方法示例。但是,如果计算很复杂,我们需要进行一些优化。
最简单的解决方案是仅在有意义时计算面积,而不是总是如此。为此,我们可以保存boolean
,表示需要更新值:
class Rectangle {
float width=0.0, height=0.0;
bool area_to_update = true;
float area_last_value = 0.0;
public:
void set_values (float, float);
float area ();
} ;
float Rectangle::area()
{
if (area_to_update)
{
// ... Make complex calculation here, save it to area_last_value
area_to_update = with*height;
// save that the area is now correct.
area_to_update = false;
}
// return the new result
return area_to_update;
}
默认情况下,需要更新该值,因此第一次调用area
将触发计算,之后的调用将返回相同的值,直到需要更新为止。
当更改任何值时,area
需要再次更新:
void Rectangle::set_values(float w, float h)
{
// ... Update values here
bool value_changed = (w!=width || h!=height);
width= w;
height = h;
// Check if the value has really changed, and set area to be updated.
if ( value_changed) area_to_update = true;
}
答案 1 :(得分:0)
在类中使用函数很简单。例如:
class Foo
{
int x;
public:
void bar();
void baz();
};
void Foo::bar()
{
x = 3;
}
void Foo::baz()
{
bar(); // inside another class function (of same class), you just call it
}
int main()
{
Foo f;
f.baz(); // outside you need an instance, call with dot
}
关于该行的说明
PangScenario *pangCopy = new PangScenario(*ps);
请不要使用new
,常规变量就足够了,
因为pangCopy
可能不需要比AlphaBetaAI::computeMove
更长寿。
此外,在该功能中,更喜欢通过引用获取ps
。