我正在做这个老虎机游戏,其中使用随机字母生成3x3 2D阵列。 我已经成功地让游戏按照我的意愿工作,但我想知道你是否有关于如何优化或改进我的代码的任何提示。
我的代码要做什么:
所以我现在想知道你是否有任何关于如何改进“if”代码的建议,程序会检查是否有行/列/对角线?游戏的工作原理应该如此,但我只是想知道是否有任何优化方法 - 也许是“for-loop”? 我也想知道你是否有关于“奖品”代码的任何提示,其中代码计算行/列/对角线的总数,并将其与赌注相乘。
我的意思是,必须有一种优化方法。如果我要做一个100x100阵列,那么比较元素的代码会非常长:) 我是C ++的新手(这是一门课程),所以我期待优化它。
PS!我不是要求解决方案,而是我可以用来优化它的方法的建议/提示。 这是一个功课,所以没有解决方案,只有建议/提示!
我的阵列比较和奖金计算代码:
答案 0 :(得分:0)
取决于您提到的数组大小。对于小数组,if
语句可能比使用循环(或两个嵌套)迭代所有元素更有效(这也称为'loop unrolling',并且被认为是性能改进)。
对于任何数组大小的“优化”(我更好地说概括)您应该使用for
循环来迭代x / y索引。
答案 1 :(得分:0)
要进行优化,运行探查器会为您提供大量信息。如果您正在讨论优化应用程序的一般指导原则,请参阅以下内容:
1 - 使用线程并行处理
2 - 通过根据对其执行的处理保持数据正确对齐来减少高速缓存未命中。例如,如果你需要使用速度来处理位置,在内存中保持它们彼此靠近将减少缓存未命中。
即:
struct Particle
{
float position;
float speed;
};
Particle particles[NUM_PARTICLES];
VS
float positions[NUM_PARTICLES];
float speeds[NUM_PARTICLES];
3-不要处理您不需要处理或用户看不到的内容。例如,某些东西可能不会影响当前状态 - 不需要处理它(在图形中,我们使用类似octtrees的场景管理,但同样适用于所有 - 如果你不需要它,不要处理它)。 / p>
4-减少浮点运算量。
请参阅这篇文章 - 它提供了一些优化的C ++参考资料:C++ Optimization Techniques。
答案 2 :(得分:0)
已完成的代码:
//Check all horiztonal and vertical locations
for(int i = 0; i <= 2; i++)
{
if(matris[i][0] == matris[i][1] && matris[i][1] == matris[i][2])
rows++;
if(matris[0][i] == matris[1][i] && matris[1][i] == matris[2][i])
rows++;
}
//Now check diagonals
if(matris[0][0] == matris[1][1] && matris[1][1] == matris[2][2])
if(matris[0][2] == matris[1][1] && matris[1][1] == matris[2][0])
//Calculate prize
prize = g_satsning*(1 << rows);
答案 3 :(得分:0)
关于优化:
关于您的问题:
你应该有更好的方法来编写代码,这是完全正确的。你写的是工人的工作,但你需要聪明的程序员才能让它变得更容易。
但你需要的是更多关于语言的知识。
是的,C ++存在循环可能性。例如,下面的代码检查一行是否包含相同的值:
const int rowCount = 3; // Number of rows
const int colCount = 3; // Number of columns
// Variable for counting same rows
int sameRowsCount = 0;
// Following line is loop: first it sets variable row to 0
// and for each pass it increments it until rowCount is reached
for(int row = 0; row < rowCount; ++row)
{
// This variable stores whether the row contains same values.
// At beginning we assume that it does.
bool isSame = true;
// Now we will check each column in current row. Note that
// we begin with 1 and not 0 - at 0 position is value which
// we check against all others.
for(int col = 1; (col < colCount) && isSame; ++col)
{
if(matrix[0] != matrix[col])
{
// We found different values
isSame = false;
}
}
// If row contains same values, isSame remained true and
// we increment same-rows counter.
if(isSame)
{
++sameRowsCount;
}
}
cout << "Number of same rows: " << sameRowsCount << "." << endl;
答案 4 :(得分:0)
就速度而言,你所拥有的并不会效率低下。如果您希望概括代码并使其可扩展(例如,如果您想再添加2行/列),您可以做几件事(例如循环和更多数学形式的奖品计算)。
已经讨论过循环,但可以使用以下内容简化奖励计算:
if (rows > 0 && rows < SOMEMAXIMUMVALUE)
{
prize = g_satsning * (1 << rows);
}
else
{
prize = 0;
}
由于您的乘数是2的指数,因此数学是相当直接的。应将SOMEMAXIMUMVALUE
声明为您期望的最大匹配行数。对于3x3设置,将有8个可能的匹配(3行,3列,2个对角线),因此SOMEMAXIMUMVALUE
应设置为8。